使用Delphi的OleObject在Office 365和Office 2013中的工作方式有所不同

时间:2018-11-16 10:37:31

标签: excel delphi delphi-2010

我正在开发一个使用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中,代码将访问驱动器D中的sample.xlsx文件,将其打开,然后在单元格A1中写入HELLO。

在Office 365中,该代码将打开两个文件。首先,它将打开sample.xlsx并打开一个新的空白工作簿,并在新的空白工作簿中编写HELLO。

如何在Office 365中获得旧行为?

1 个答案:

答案 0 :(得分:12)

您的代码失败,因为它假设您打开的工作簿将是工作簿集合中的第一个,并且这种假设并不总是成立。

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;