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

MyI*_*ICQ 2 delphi excel

我有一个由外部公司制作的相当复杂的 Excel 工作表。它使用了几个公式,查找等。

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

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

这可以作为一个用Delphi编写的单元来完成,但是逻辑已经在Excel中完成了,在Excel中编写这样的计算更简单。

简化示例:

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;
Run Code Online (Sandbox Code Playgroud)

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

如果可能的话 - excel 工作表是否可以在内部调用和使用宏(对 Delphi 不可见)?

fpi*_*tte 6

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;
Run Code Online (Sandbox Code Playgroud)