powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разбить excel файл на несколько файлов
18 сообщений из 18, страница 1 из 1
Разбить excel файл на несколько файлов
    #39786265
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
var
  ExlApp1, ExlApp2, Sheet1, Sheet2: OLEVariant;
  i: integer;
  s1, s2: string;
  Index1: integer;
begin
  if (OpenDialog1.Execute) then
  begin
    ExlApp1 := CreateOleObject('Excel.Application');
    ExlApp1.Visible := False;
    ExlApp1.Workbooks.Open(OpenDialog1.FileName);
    Sheet1 := ExlApp1.Workbooks[1].WorkSheets[1];
    s1 := Sheet1.Cells[1, 2].Text +
          Sheet1.Cells[1, 3].Text +
          Sheet1.Cells[1, 4].Text +
          Sheet1.Cells[1, 5].Text;
    Self.Caption := s1;
    Index1 := 1;
    for i := 2 to Sheet1.UsedRange.Rows.Count do
    begin
      Self.Caption := i.ToString;
      s2 := Sheet1.Cells[i, 2].Text +
            Sheet1.Cells[i, 3].Text +
            Sheet1.Cells[i, 4].Text +
            Sheet1.Cells[i, 5].Text;
      if (s1 <> s2) then
      begin
        Sheet1.Range[
          Sheet1.Cells[Index1, 1],
          Sheet1.Cells[i - 1, 45]
        ].Copy;

        ExlApp2 := CreateOleObject('Excel.Application');
        ExlApp2.Workbooks.Add;
        Sheet2 := ExlApp2.Workbooks[ExlApp2.Workbooks.Count].WorkSheets[1];

        Sheet2.Range['A1', 'A1'].Columns.ColumnWidth := 12.43;
        Sheet2.Range['B1', 'AS1'].Columns.ColumnWidth := 2.29;

        Sheet2.Paste;

        ExlApp2.Workbooks[ExlApp2.Workbooks.Count].SaveAs(ExtractFilePath(Application.ExeName) + s1 + '.xlsx');
        ExlApp2.Quit;
        Sheet2 := Unassigned;

        s1 := s2;
        Index1 := i;
      end;
    end;

    ExlApp1.Quit;
    ExlApp1 := Unassigned;
    Sheet1 := Unassigned;
  end;
end;



Через раз ловлю ошибку "Метод Paste из класса Worksheet" завершён неверно.
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786282
Miracle9,

боец, вам замечание.

Не стоит портить буфер обмена, никогда. Чтобы перенести RANGE из одного листа в другой, используйте переменную типа Variant.
То есть, вместо

Код: pascal
1.
2.
3.
4.
Sheet1.Range[
          Sheet1.Cells[Index1, 1],
          Sheet1.Cells[i - 1, 45]
        ].Copy;


- делай так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
...
  fR : Variant;
...
begin
...
  fR := Sheet1.Range[
          Sheet1.Cells[Index1, 1],
          Sheet1.Cells[i - 1, 45]
        ];


И т.д.

А насчет ошибки - смотри на фактическую стурктуру (исходного) региона и данные в нем. Отсюда не видно.
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786301
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде работает, спасибо!
Только забыли ".Value" в конце написать.
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786334
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Файлы сохраняются, всё ок. Но при каждом создании нового файла, они не закрываются, а продолжают висеть в процессах.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
var
  ExlApp1, ExlApp2, Sheet1, Sheet2: OLEVariant;
  i, j: integer;
  s1, s2: string;
  Index1: integer;
  Range1, Range2: Variant;
begin
  if (OpenDialog1.Execute) then
  begin
    ExlApp1 := CreateOleObject('Excel.Application');
    ExlApp1.DisplayAlerts := False;
    ExlApp1.Visible := False;


    ExlApp1.Workbooks.Open(OpenDialog1.FileName);
    Sheet1 := ExlApp1.Workbooks[1].WorkSheets[1];

    Index1 := 2;
    s1 := Sheet1.Cells[Index1, 2].Text +
          Sheet1.Cells[Index1, 3].Text +
          Sheet1.Cells[Index1, 4].Text +
          Sheet1.Cells[Index1, 5].Text;

    for i := 3 to Sheet1.UsedRange.Rows.Count do
    begin
      Self.Caption := i.ToString;
      s2 := Sheet1.Cells[i, 2].Text +
            Sheet1.Cells[i, 3].Text +
            Sheet1.Cells[i, 4].Text +
            Sheet1.Cells[i, 5].Text;
      if (s1 <> s2) then
      begin
        Range1 := Sheet1.Range[Sheet1.Cells[Index1, 1], Sheet1.Cells[i - 1, 45]].Value;
        try
          ExlApp2 := CreateOleObject('Excel.Application');
          ExlApp2.Application.EnableEvents := false;
          ExlApp2.DisplayAlerts := False;
          ExlApp2.Visible := False;

          ExlApp2.Workbooks.Add;
          Sheet2 := ExlApp2.ActiveWorkbook.WorkSheets[1];

          Sheet2.Range['A1', 'A1'].Columns.ColumnWidth := 12.43;
          Sheet2.Range['B1', 'AS1'].Columns.ColumnWidth := 2.29;
          Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]].HorizontalAlignment := 3;
          Sheet2.Range[Sheet2.Cells[2, 2], Sheet2.Cells[i - Index1 + 1, 5]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 7], Sheet2.Cells[i - Index1 + 1, 10]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 12], Sheet2.Cells[i - Index1 + 1, 15]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 17], Sheet2.Cells[i - Index1 + 1, 20]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 22], Sheet2.Cells[i - Index1 + 1, 25]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 27], Sheet2.Cells[i - Index1 + 1, 30]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 32], Sheet2.Cells[i - Index1 + 1, 35]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 37], Sheet2.Cells[i - Index1 + 1, 40]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 42], Sheet2.Cells[i - Index1 + 1, 45]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Columns[1].NumberFormat := '0';

          Range2 := Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]];
          Range2.Value := Range1;
          ExlApp2.ActiveWorkbook.SaveAs(ExtractFilePath(Application.ExeName) + s1 + '.xlsx');
        finally
          Range2 := Unassigned;
          ExlApp2.ActiveWorkbook.Close;
          ExlApp2.Application.Quit;
          ExlApp2 := Unassigned;
          Sheet2 := Unassigned;
        end;

        s1 := s2;
        Index1 := i;
      end;
    end;


    ExlApp1.Quit;
    ExlApp1 := Unassigned;
    Sheet1 := Unassigned;
  end;

end;

...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786361
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9а продолжают висеть в процессах.
Попробуй поменять порядок уничтожения. Как-то странно уничтожать лист после приложения...
Либо вообще оставить только приложение. Оно остается висеть, когда при работе с ним были какие-то проблемы.
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786471
Miracle9Файлы сохраняются, всё ок. Но при каждом создании нового файла, они не закрываются, а продолжают висеть в процессах.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
var
  ExlApp1, ExlApp2, Sheet1, Sheet2: OLEVariant;
  i, j: integer;
  s1, s2: string;
  Index1: integer;
  Range1, Range2: Variant;
begin
  if (OpenDialog1.Execute) then
  begin
    ExlApp1 := CreateOleObject('Excel.Application');
    ExlApp1.DisplayAlerts := False;
    ExlApp1.Visible := False;


    ExlApp1.Workbooks.Open(OpenDialog1.FileName);
    Sheet1 := ExlApp1.Workbooks[1].WorkSheets[1];

    Index1 := 2;
    s1 := Sheet1.Cells[Index1, 2].Text +
          Sheet1.Cells[Index1, 3].Text +
          Sheet1.Cells[Index1, 4].Text +
          Sheet1.Cells[Index1, 5].Text;

    for i := 3 to Sheet1.UsedRange.Rows.Count do
    begin
      Self.Caption := i.ToString;
      s2 := Sheet1.Cells[i, 2].Text +
            Sheet1.Cells[i, 3].Text +
            Sheet1.Cells[i, 4].Text +
            Sheet1.Cells[i, 5].Text;
      if (s1 <> s2) then
      begin
        Range1 := Sheet1.Range[Sheet1.Cells[Index1, 1], Sheet1.Cells[i - 1, 45]].Value;
        try
          ExlApp2 := CreateOleObject('Excel.Application');
          ExlApp2.Application.EnableEvents := false;
          ExlApp2.DisplayAlerts := False;
          ExlApp2.Visible := False;

          ExlApp2.Workbooks.Add;
          Sheet2 := ExlApp2.ActiveWorkbook.WorkSheets[1];

          Sheet2.Range['A1', 'A1'].Columns.ColumnWidth := 12.43;
          Sheet2.Range['B1', 'AS1'].Columns.ColumnWidth := 2.29;
          Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]].HorizontalAlignment := 3;
          Sheet2.Range[Sheet2.Cells[2, 2], Sheet2.Cells[i - Index1 + 1, 5]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 7], Sheet2.Cells[i - Index1 + 1, 10]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 12], Sheet2.Cells[i - Index1 + 1, 15]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 17], Sheet2.Cells[i - Index1 + 1, 20]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 22], Sheet2.Cells[i - Index1 + 1, 25]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 27], Sheet2.Cells[i - Index1 + 1, 30]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 32], Sheet2.Cells[i - Index1 + 1, 35]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 37], Sheet2.Cells[i - Index1 + 1, 40]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 42], Sheet2.Cells[i - Index1 + 1, 45]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Columns[1].NumberFormat := '0';

          Range2 := Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]];
          Range2.Value := Range1;
          ExlApp2.ActiveWorkbook.SaveAs(ExtractFilePath(Application.ExeName) + s1 + '.xlsx');
        finally
          Range2 := Unassigned;
          ExlApp2.ActiveWorkbook.Close;
          ExlApp2.Application.Quit;
          ExlApp2 := Unassigned;
          Sheet2 := Unassigned;
        end;

        s1 := s2;
        Index1 := i;
      end;
    end;


    ExlApp1.Quit;
    ExlApp1 := Unassigned;
    Sheet1 := Unassigned;
  end;

end;


Включи Visible - возможно, увидишь причину. Например, диалог, запрашивающий разрешение на перезапись существующего файла.
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786502
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищ прапорщикMiracle9Файлы сохраняются, всё ок. Но при каждом создании нового файла, они не закрываются, а продолжают висеть в процессах.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
var
  ExlApp1, ExlApp2, Sheet1, Sheet2: OLEVariant;
  i, j: integer;
  s1, s2: string;
  Index1: integer;
  Range1, Range2: Variant;
begin
  if (OpenDialog1.Execute) then
  begin
    ExlApp1 := CreateOleObject('Excel.Application');
    ExlApp1.DisplayAlerts := False;
    ExlApp1.Visible := False;


    ExlApp1.Workbooks.Open(OpenDialog1.FileName);
    Sheet1 := ExlApp1.Workbooks[1].WorkSheets[1];

    Index1 := 2;
    s1 := Sheet1.Cells[Index1, 2].Text +
          Sheet1.Cells[Index1, 3].Text +
          Sheet1.Cells[Index1, 4].Text +
          Sheet1.Cells[Index1, 5].Text;

    for i := 3 to Sheet1.UsedRange.Rows.Count do
    begin
      Self.Caption := i.ToString;
      s2 := Sheet1.Cells[i, 2].Text +
            Sheet1.Cells[i, 3].Text +
            Sheet1.Cells[i, 4].Text +
            Sheet1.Cells[i, 5].Text;
      if (s1 <> s2) then
      begin
        Range1 := Sheet1.Range[Sheet1.Cells[Index1, 1], Sheet1.Cells[i - 1, 45]].Value;
        try
          ExlApp2 := CreateOleObject('Excel.Application');
          ExlApp2.Application.EnableEvents := false;
          ExlApp2.DisplayAlerts := False;
          ExlApp2.Visible := False;

          ExlApp2.Workbooks.Add;
          Sheet2 := ExlApp2.ActiveWorkbook.WorkSheets[1];

          Sheet2.Range['A1', 'A1'].Columns.ColumnWidth := 12.43;
          Sheet2.Range['B1', 'AS1'].Columns.ColumnWidth := 2.29;
          Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]].HorizontalAlignment := 3;
          Sheet2.Range[Sheet2.Cells[2, 2], Sheet2.Cells[i - Index1 + 1, 5]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 7], Sheet2.Cells[i - Index1 + 1, 10]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 12], Sheet2.Cells[i - Index1 + 1, 15]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 17], Sheet2.Cells[i - Index1 + 1, 20]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 22], Sheet2.Cells[i - Index1 + 1, 25]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 27], Sheet2.Cells[i - Index1 + 1, 30]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 32], Sheet2.Cells[i - Index1 + 1, 35]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 37], Sheet2.Cells[i - Index1 + 1, 40]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 42], Sheet2.Cells[i - Index1 + 1, 45]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Columns[1].NumberFormat := '0';

          Range2 := Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]];
          Range2.Value := Range1;
          ExlApp2.ActiveWorkbook.SaveAs(ExtractFilePath(Application.ExeName) + s1 + '.xlsx');
        finally
          Range2 := Unassigned;
          ExlApp2.ActiveWorkbook.Close;
          ExlApp2.Application.Quit;
          ExlApp2 := Unassigned;
          Sheet2 := Unassigned;
        end;

        s1 := s2;
        Index1 := i;
      end;
    end;


    ExlApp1.Quit;
    ExlApp1 := Unassigned;
    Sheet1 := Unassigned;
  end;

end;



Включи Visible - возможно, увидишь причину. Например, диалог, запрашивающий разрешение на перезапись существующего файла.
Вариант...

Код: pascal
1.
2.
app.Application.EnableEvents := False;
app.DisplayAlerts := false;
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786561
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делал
Код: pascal
1.
ExlApp2.Visible := True;


Окно открывается и тут же закрывается, вроде всё ОК.
При закрытии приложения процессы ексель тут же уничтожаются.
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786577
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9При закрытии приложения процессы ексель тут же уничтожаются.

Значит не зануляешь какую-то переменную со ссылкой

неужели глобальных переменных насоздавал?
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786582
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, первым делом об этом подумал и т.к. я вроде всё занулил решил спросить тут
вот весь код, глобальных переменных нет
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
unit UMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, sDialogs, Vcl.StdCtrls, sButton;

type
  TFMain = class(TForm)
    sButton1: TsButton;
    OpenDialog1: TsOpenDialog;
    procedure sButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FMain: TFMain;

implementation

{$R *.dfm}

uses
  ComObj,
  OleCtrls,
  ActiveX;

procedure TFMain.sButton1Click(Sender: TObject);
var
  ExlApp1, ExlApp2, Sheet1, Sheet2: OLEVariant;
  i, j: integer;
  s1, s2: string;
  Index1: integer;
  Range1, Range2: Variant;
begin
  if (OpenDialog1.Execute) then
  begin
    ExlApp1 := CreateOleObject('Excel.Application');
    ExlApp1.Application.EnableEvents := false;
    ExlApp1.DisplayAlerts := False;
    ExlApp1.Visible := False;


    ExlApp1.Workbooks.Open(OpenDialog1.FileName);
    Sheet1 := ExlApp1.Workbooks[1].WorkSheets[1];

    Index1 := 2;
    s1 := Sheet1.Cells[Index1, 2].Text +
          Sheet1.Cells[Index1, 3].Text +
          Sheet1.Cells[Index1, 4].Text +
          Sheet1.Cells[Index1, 5].Text;

    for i := 3 to Sheet1.UsedRange.Rows.Count do
    begin
      Self.Caption := i.ToString;
      s2 := Sheet1.Cells[i, 2].Text +
            Sheet1.Cells[i, 3].Text +
            Sheet1.Cells[i, 4].Text +
            Sheet1.Cells[i, 5].Text;
      if (s1 <> s2) then
      begin
        Range1 := Sheet1.Range[Sheet1.Cells[Index1, 1], Sheet1.Cells[i - 1, 45]].Value;
        try
          ExlApp2 := CreateOleObject('Excel.Application');
          ExlApp2.Application.EnableEvents := false;
          ExlApp2.DisplayAlerts := False;
          ExlApp2.Visible := False;

          ExlApp2.Workbooks.Add;
          Sheet2 := ExlApp2.ActiveWorkbook.WorkSheets[1];

          Sheet2.Range['A1', 'A1'].Columns.ColumnWidth := 12.43;
          Sheet2.Range['B1', 'AS1'].Columns.ColumnWidth := 2.29;
          Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]].HorizontalAlignment := 3;
          Sheet2.Range[Sheet2.Cells[2, 2], Sheet2.Cells[i - Index1 + 1, 5]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 7], Sheet2.Cells[i - Index1 + 1, 10]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 12], Sheet2.Cells[i - Index1 + 1, 15]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 17], Sheet2.Cells[i - Index1 + 1, 20]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 22], Sheet2.Cells[i - Index1 + 1, 25]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 27], Sheet2.Cells[i - Index1 + 1, 30]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 32], Sheet2.Cells[i - Index1 + 1, 35]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 37], Sheet2.Cells[i - Index1 + 1, 40]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Range[Sheet2.Cells[2, 42], Sheet2.Cells[i - Index1 + 1, 45]].BorderAround(1, -4138, 3, EmptyParam);
          Sheet2.Columns[1].NumberFormat := '0';

          Range2 := Sheet2.Range[Sheet2.Cells[2, 1], Sheet2.Cells[i - Index1 + 1, 45]];
          Range2.Value := Range1;
          ExlApp2.ActiveWorkbook.SaveAs(ExtractFilePath(Application.ExeName) + s1 + '.xlsx');
        finally
          Sheet2 := Unassigned;
          Range2 := Unassigned;

          ExlApp2.ActiveWorkbook.Close;
          ExlApp2.Application.Quit;
          ExlApp2 := Unassigned;
        end;
        Break;
        s1 := s2;
        Index1 := i;
      end;
    end;

    Range1 := Unassigned;
    Sheet1 := Unassigned;
    ExlApp1.ActiveWorkbook.Close;
    ExlApp1.Quit;
    ExlApp1 := Unassigned;
  end;

end;

end.

...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786584
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9
Код: pascal
1.
        ExlApp2 := CreateOleObject('Excel.Application');



Выкинь на хрен.
Делай всё в одном приложении.
Excel ВСЕГДА умел открывать несколько книг одновременно (лишь бы название файла книги было разным).

В этом у тебя и ошибка, в том что и как ты делаешь с ExApp2 - выкинь её нафиг!

Miracle9
Код: pascal
1.
heet1 := ExlApp1.Workbooks[1]


А какие у тебя гарантии, что оно [1] ? а если там уже было ?
TExcelApplication например умеет присасываться у уже открытому Excel.

Ты же сам ниже делаешь без "волшебных констант"
Код: sql
1.
ExlApp2.Workbooks[ExlApp2.Workbooks.Count]


Хотя даже этого не нужно!
https://docs.microsoft.com/en-us/office/vba/api/excel.workbooks.add
https://docs.microsoft.com/en-us/office/vba/api/excel.workbooks.open

Лучше заведи переменную для Workbook. Ах да, у тебя же переменные без типов. Тогда ещё проще.

Код: sql
1.
2.
3.
4.
5.
6.
7.
Sheet1 := ExlApp1.Workbooks.Open(...);
Sheet1 := Sheet1.WorkSheets[1];

.....

Sheet2 := ExlApp1.Workbooks.Add; // нa хрен ExlApp2 !!! - ты из-за неё и висишь!
Sheet2 := Sheet2.WorkSheets[1];
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786585
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9
Код: pascal
1.
     ExlApp2 := Unassigned;



а вот в первом коде этой строки не было однако!
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786586
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9
Код: pascal
1.
ExlApp2.Visible := True;



Окно открывается и тут же закрывается, вроде всё ОК.

а ExlApp1 ?

-------

могу ещё вариант предложить, делай всё в отдельном потоке, только не забудь COM инициализировать в начале и де-ницилизировать в конце.

С большой вероятностью де-нициализация COM appartment и есть то, что у тебя убивает какой-то из Exceleq в конце работы программы.
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786590
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9
Код: pascal
1.
ExtractFilePath(Application.ExeName) + s1 + '.xlsx');



для базовой работы c XLSX вообще Excle не нужен :-)
Во всяком случае для записи и из Delphi. Чтение доделывать лень было.

Если там конечно хитрое оформление, форматы условные, ещё какаие-нибудь навороты...
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786600
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9
Код: pascal
1.
2.
3.
4.
5.
6.
7.
ExlApp2.Application.EnableEvents := false;
ExlApp2.Workbooks.Add;
Sheet2 := ExlApp2.ActiveWorkbook.WorkSheets[1];
....
Sheet2.Columns[1].NumberFormat := '0';
... 
и таких много



ух, сколько у тебя строк с двумя точками! Избавься от них, разбей их каждую на две простых строки.

с большой вероятностью ты в КАЖДОЙ этой строке создаёшь для результата промежуточную невидимую безымянную переменную, которая только в самом конце процедры наконец уничтожается.

а она указывает на exApp2 между прочим! От которого надо избавиться, да.

простой тест, следи за количеством запущенных Excel.exe и за их Process ID и трассируй программу построчно!
в первом цикле все будет нормально.

вангую, во втором цикле ты запустишь 3-й эксель!
вангую, во втором цикле после одной из строк
Код: pascal
1.
2.
ExlApp2.ActiveWorkbook.Close;
ExlApp2.Application.Quit;


закроется 2-й Excel (хотя сама ExlApp2 указывает уже на третий)
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786603
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
procedure TestLinks;
begin
   CreateOleObject('Excel.Application').Quit;
   Sleep(60000);
end;



Как ты думаешь ,есть в этой процедуре переменная типа Variant или нет ?

Когда она очистится и "отпустит" Excel, до минутной паузы или после ?

Включи Use Debug DCUs, открой Debug Windows -> CPU

И внимательно протрассируй кусок процедуры после Sleep но перед end
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786615
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, сделал пока через книги, всё ок работает.

"для базовой работы c XLSX вообще Excle не нужен :-)
Во всяком случае для записи и из Delphi."
не знал

"с большой вероятностью ты в КАЖДОЙ этой строке создаёшь для результата промежуточную невидимую безымянную переменную"
А в интернете на форуме в ответах так часто делали, строки разбивали. ок, чуть позже сделаю, проверю
...
Рейтинг: 0 / 0
Разбить excel файл на несколько файлов
    #39786660
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9не знал

гугл же существует
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разбить excel файл на несколько файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]