【问题标题】:OleObject using Delphi works differently in Office 365 and Office 2013使用 Delphi 的 OleObject 在 Office 365 和 Office 2013 中的工作方式不同
【发布时间】:2018-11-16 18:53:04
【问题描述】:

我正在开发一个使用 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 中获取旧行为?

【问题讨论】:

    标签: excel delphi delphi-2010


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 感谢您回答这个问题。问题解决了 :) 你有推荐的 url 或书籍来解释 Excel 自动化中的基本内容吗?
    • @WisnuWidiarta 不是。我确实得到了一本关于 OLE 自动化的书,但它大约三英寸厚而且太重了。最后,我只是从互联网上拿了样本并与它们一起玩。一旦掌握了基础知识,MSDN 就是一个很好的资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多