Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разбить excel файл на несколько файлов / 18 сообщений из 18, страница 1 из 1
14.03.2019, 21:09
    #39786265
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Код: 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
14.03.2019, 23:00
    #39786282
Разбить excel файл на несколько файлов
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
15.03.2019, 00:17
    #39786301
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Вроде работает, спасибо!
Только забыли ".Value" в конце написать.
...
Рейтинг: 0 / 0
15.03.2019, 03:25
    #39786334
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Файлы сохраняются, всё ок. Но при каждом создании нового файла, они не закрываются, а продолжают висеть в процессах.
Код: 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
15.03.2019, 07:58
    #39786361
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Miracle9а продолжают висеть в процессах.
Попробуй поменять порядок уничтожения. Как-то странно уничтожать лист после приложения...
Либо вообще оставить только приложение. Оно остается висеть, когда при работе с ним были какие-то проблемы.
...
Рейтинг: 0 / 0
15.03.2019, 10:41
    #39786471
Разбить excel файл на несколько файлов
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
15.03.2019, 11:18
    #39786502
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Товарищ прапорщик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
15.03.2019, 12:10
    #39786561
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Делал
Код: pascal
1.
ExlApp2.Visible := True;


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

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

неужели глобальных переменных насоздавал?
...
Рейтинг: 0 / 0
15.03.2019, 12:24
    #39786582
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
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
15.03.2019, 12:30
    #39786584
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
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
15.03.2019, 12:30
    #39786585
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Miracle9
Код: pascal
1.
     ExlApp2 := Unassigned;



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



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

а ExlApp1 ?

-------

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

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



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

Если там конечно хитрое оформление, форматы условные, ещё какаие-нибудь навороты...
...
Рейтинг: 0 / 0
15.03.2019, 12:44
    #39786600
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
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
15.03.2019, 12:47
    #39786603
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Код: 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
15.03.2019, 12:53
    #39786615
Miracle9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбить excel файл на несколько файлов
Arioch, сделал пока через книги, всё ок работает.

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

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

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


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