OleObject с использованием Delphi работает по-разному в Office 365 и Office 2013 - PullRequest
0 голосов
/ 16 ноября 2018

Я разрабатываю небольшой инструмент, использующий Delphi Pascal, чтобы открыть файл XLSX и написать в нем ячейку. Он ведет себя по-разному на компьютере, использующем Office 2013 и Office 365.

Вот код:

var
  ExcelApp: OleVariant;
  anExcelFileName: String;
begin
  try
    ExcelApp := CreateOleObject('Excel.Application');
    anExcelFileName := 'D:\sample.xlsx';

    ExcelApp.Workbooks.Open(anExcelFileName);
    ExcelApp.Visible := True;

    ExcelApp.Workbooks[1].Sheets[1].Range['A1'].Value := 'HELLO';
  except
    on E: Exception do
      showMessage('Error on something: ' + E.Message);
  end;
end;

В Office 2013 код будет обращаться к файлу sample.xlsx на диске D, открывать его и писать HELLO в ячейке A1.

В Office 365 код откроет два файла. Сначала он откроет sample.xlsx, откроет новую пустую книгу и напишет привет в новой пустой книге.

Как получить старое поведение в офисе 365?

1 Ответ

0 голосов
/ 16 ноября 2018

Ваш код дает сбой, потому что он предполагает, что открываемая книга будет первой в коллекции книг, и это предположение не всегда выполняется.

Workbooks.Open возвращает вновь открытую книгу. Используйте этот объект для будущих ссылок на книгу. Как это:

var
  ExcelApp, Workbook: OleVariant;
  anExcelFileName: String;
begin
  try
    ExcelApp := CreateOleObject('Excel.Application');
    anExcelFileName := 'D:\sample.xlsx';

    Workbook := ExcelApp.Workbooks.Open(anExcelFileName);
    ExcelApp.Visible := True;

    Workbook.Sheets[1].Range['A1'].Value := 'HELLO';
  except
    on E: Exception do
      showMessage('Error on something: ' + E.Message);
  end;
end;
...