在 Delphi 中使用 Excel .xlsx sheet 作为计算器(函数)?

Use an Excel .xlsx sheet as calculator (function) in Delphi?

我有一个由外部公司制作的相当复杂的 Excel sheet。它使用多个公式、查找等

从 Delphi(版本 6 或 7)开始,是否可以在后台打开此 sheet,允许用户输入一些变量,然后将这些传递给 excel 并将计算结果返回给 delphi 程序 ?

我知道如何打开 excel 并使用 ADO 读取整个 sheet,但在这里我需要通过引用范围或坐标来双向发送数据。

这个在Delphi中可以写成一个单元来完成,但是逻辑在Excel中已经完成了,这样的计算写在Excel中更简单。[=14] =]

简化示例:

procedure do_it;
var
  v1: integer;
  v2: integer; 
begin
   v1 := strtoint(inp1.text);   // operator provided numbers
   v2 := strtoint(inp2.text);

   theresult.caption := get_excel_value(v1, v2);   // get back result from excel formulas
end; 

function get_excel_value(v1, v2: integer) : string;
begin
   // pseudocode
   myExcel.range('A3').text := v1;
   myExcel.range('A4').text := v2;
   myExcel.recalculate;   // update excel sheet on demand
   result := myExcel.range('A10').text;
end;

假设我需要查看 Excel COM 或 Excel OLE 的方向是否正确?

如果可能 - excel sheet 可以在内部调用和使用宏(对 Delphi 不可见)吗?

Microsoft Office(Word、Excel 和其他)是可以从其他应用程序完全自动化的应用程序。您可以手动完成的所有操作也可以通过其他应用程序以编程方式完成,当然也可以从您的 Delphi 应用程序完成。

为了简化自动化,Delphi 随附了非可视化组件,这些组件是底层 COM 对象的“包装器”,并公开与 COM 接口相同的属性、方法和事件。

Delphi 有几组组件可用于多个 Office 版本。有适用于 Office 2000、Office XP 和 Office 2010 的组件。2010 版本可从 Delphi XE2 获得。当然还有更多的 Office 版本,但不用担心:微软已经小心翼翼地让他的接口向上兼容。例如,如果您使用 Office 2000 组件,您仍然可以自动化从 2000 到最新的所有 Office 版本。唯一的限制是,如果使用旧组件,则无法轻松使用新功能。

实际上,最好使用能够完成您需要做的事情的旧组件!

这是因为 Microsoft office API 的兼容性是向上的,而不是向下的。

由于有几套组件,您必须确保安装了正确的版本。

o 查看已安装的包,启动 Delphi 并转到菜单/组件/安装包。您会看到一长串所有已安装的设计时包,并带有一个复选框,指示该包是否可用。

找到“Microsoft Office 2000 Sample Automation Server Wrapper Components”(或 Office XP)并选中您计划使用的组件前面的复选框。单击“确定”并验证您的组件选项板现在是否包含“服务器”选项卡。

例如,我们将创建一个示例应用程序以在 Word 文档的末尾插入一个句子。这既快速又简单!

创建一个新的 VCL 表单应用程序,在表单上放置一个 TWordApplication 和一个 TButton。然后添加下面的代码作为按钮的 OnClick 处理程序。

最快的定位方法是在组件面板搜索工具中输入WordApplication。

TForm1.Button1Click(Sender: TObject);
begin
  WordApplication1.Connect;
  WordApplication1.Visible := TRUE;
  WordApplication1.Selection.EndOf(wdStory, wdMove);
  WordApplication1.Selection.Text := 'Delphi Rocks !' + #13;
  WordApplication1.Selection.EndOf(wdStory, wdMove);
  WordApplication1.Disconnect;
end;

添加到 fpiette 的好答案:

另一种方法是不使用组件,而是直接在代码中即时创建一个 Excel COM 对象。示例:

uses
  ComObj, Variants;
var
  V: Variant;
  Square: Double;  // could also be of type string
begin
  try
    // Get a running Excel instance, if there is one
    V := GetActiveOleObject('Excel.Application');
  except
    on EOleSysError do  // Probably Excel was not running
    begin
      // Create a new Excel instance
      V := CreateOleObject('Excel.Application');
      V.Visible := True;  // Optional
    end;
  end;

  //
  // Do some work with Excel - a few examples
  //

  // If no workbook is open, then create one
  if VarIsClear(V.ActiveWorkbook) then
  begin
    V.Workbooks.Add;
  end;

  V.ActiveSheet.Cells[4, 1].Value := 7;  // Put a value into cell A4
  V.ActiveSheet.Cells[5, 1].Formula := '=A4 * A4';  // Put a formula into A5
  V.Calculate;  // Normally not needed, but in case the user has chosen manual calculation
  Square := V.ActiveSheet.Cells[5, 1].Value;  // Read the value of A5
end;

应该注意的是,即使可能很明显,所有这些只有在 Excel 安装在 Delphi 程序 运行 所在的计算机上时才有效。