Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Разбить excel файл на несколько файлов  [new]
Miracle9
Member

Откуда:
Сообщений: 110
+
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" завершён неверно.
14 мар 19, 21:09    [21833051]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Товарищ прапорщик
Member

Откуда:
Сообщений: 2
Miracle9,

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

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

Sheet1.Range[
          Sheet1.Cells[Index1, 1],
          Sheet1.Cells[i - 1, 45]
        ].Copy;

- делай так:
var
...
  fR : Variant;
...
begin
...
  fR := Sheet1.Range[
          Sheet1.Cells[Index1, 1],
          Sheet1.Cells[i - 1, 45]
        ];

И т.д.

А насчет ошибки - смотри на фактическую стурктуру (исходного) региона и данные в нем. Отсюда не видно.
14 мар 19, 23:00    [21833104]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Miracle9
Member

Откуда:
Сообщений: 110
Вроде работает, спасибо!
Только забыли ".Value" в конце написать.
15 мар 19, 00:17    [21833133]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Miracle9
Member

Откуда:
Сообщений: 110
Файлы сохраняются, всё ок. Но при каждом создании нового файла, они не закрываются, а продолжают висеть в процессах.
+
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;
15 мар 19, 03:25    [21833184]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
Miracle9
а продолжают висеть в процессах.

Попробуй поменять порядок уничтожения. Как-то странно уничтожать лист после приложения...
Либо вообще оставить только приложение. Оно остается висеть, когда при работе с ним были какие-то проблемы.
15 мар 19, 07:58    [21833236]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Товарищ прапорщик
Member

Откуда:
Сообщений: 2
Miracle9
Файлы сохраняются, всё ок. Но при каждом создании нового файла, они не закрываются, а продолжают висеть в процессах.
+
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 - возможно, увидишь причину. Например, диалог, запрашивающий разрешение на перезапись существующего файла.
15 мар 19, 10:41    [21833388]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
Товарищ прапорщик
Miracle9
Файлы сохраняются, всё ок. Но при каждом создании нового файла, они не закрываются, а продолжают висеть в процессах.
+
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 - возможно, увидишь причину. Например, диалог, запрашивающий разрешение на перезапись существующего файла.

Вариант...

app.Application.EnableEvents := False;
app.DisplayAlerts := false;
15 мар 19, 11:18    [21833439]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Miracle9
Member

Откуда:
Сообщений: 110
Делал
ExlApp2.Visible := True;

Окно открывается и тут же закрывается, вроде всё ОК.
При закрытии приложения процессы ексель тут же уничтожаются.
15 мар 19, 12:10    [21833548]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Miracle9
При закрытии приложения процессы ексель тут же уничтожаются.


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

неужели глобальных переменных насоздавал?
15 мар 19, 12:20    [21833575]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Miracle9
Member

Откуда:
Сообщений: 110
Arioch, первым делом об этом подумал и т.к. я вроде всё занулил решил спросить тут
вот весь код, глобальных переменных нет
+
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.
15 мар 19, 12:24    [21833581]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Miracle9
        ExlApp2 := CreateOleObject('Excel.Application');


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

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

Miracle9
heet1 := ExlApp1.Workbooks[1]

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

Ты же сам ниже делаешь без "волшебных констант"
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. Ах да, у тебя же переменные без типов. Тогда ещё проще.

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

.....

Sheet2 := ExlApp1.Workbooks.Add; // нa хрен ExlApp2 !!! - ты из-за неё и висишь!
Sheet2 := Sheet2.WorkSheets[1];
15 мар 19, 12:30    [21833587]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Miracle9
     ExlApp2 := Unassigned;


а вот в первом коде этой строки не было однако!
15 мар 19, 12:30    [21833589]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Miracle9
ExlApp2.Visible := True;


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


а ExlApp1 ?

-------

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

С большой вероятностью де-нициализация COM appartment и есть то, что у тебя убивает какой-то из Exceleq в конце работы программы.
15 мар 19, 12:32    [21833590]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Miracle9
ExtractFilePath(Application.ExeName) + s1 + '.xlsx');


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

Если там конечно хитрое оформление, форматы условные, ещё какаие-нибудь навороты...
15 мар 19, 12:36    [21833600]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Miracle9
ExlApp2.Application.EnableEvents := false;
ExlApp2.Workbooks.Add;
Sheet2 := ExlApp2.ActiveWorkbook.WorkSheets[1];
....
Sheet2.Columns[1].NumberFormat := '0';
... 
и таких много


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

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

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

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

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

закроется 2-й Excel (хотя сама ExlApp2 указывает уже на третий)
15 мар 19, 12:44    [21833610]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
procedure TestLinks;
begin
   CreateOleObject('Excel.Application').Quit;
   Sleep(60000);
end;


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

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

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

И внимательно протрассируй кусок процедуры после Sleep но перед end
15 мар 19, 12:47    [21833614]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Miracle9
Member

Откуда:
Сообщений: 110
Arioch, сделал пока через книги, всё ок работает.

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

"с большой вероятностью ты в КАЖДОЙ этой строке создаёшь для результата промежуточную невидимую безымянную переменную"
А в интернете на форуме в ответах так часто делали, строки разбивали. ок, чуть позже сделаю, проверю
15 мар 19, 12:53    [21833633]     Ответить | Цитировать Сообщить модератору
 Re: Разбить excel файл на несколько файлов  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Miracle9
не знал


гугл же существует
15 мар 19, 13:21    [21833708]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить