gpt4 book ai didi

excel - Windows 7 和 Office 2007 中的办公自动化挂起

转载 作者:行者123 更新时间:2023-12-02 10:06:42 27 4
gpt4 key购买 nike

我有一个 Delphi XE8 程序,我使用 Office Automation 来构建 Excel 文件。构建需要几秒钟,因此我已将这项工作放入后台线程中,以便我的程序保持响应并且我可以处理取消请求。

我是这样设置的:

TTask.Run(
procedure
var
oXL, oSheet, o2Sheet, oRng, VArray : Variant;
begin
oXL := CreateOleObject('Excel.Application');
oXL.Visible := False;
oXL.DisplayAlerts := false;

... (all the processing to build the Excel file)

oXL.Application.Workbooks[1].SaveAs(ExcelFilename, 51 { = xlWorkbookDefault } );
oXL.Workbooks.Close;
oXL.Application.Quit;
oXL := Unassigned;
end
);

这段代码工作得非常好,正如我想要的那样。它将 Excel 工作簿创建为后台任务,完成后从任务正确返回到主线程,并且应用程序保持响应。

我觉得一切都很棒。它可以在我的装有 Office 2016 的 Windows 10 计算机上运行。我有几个用户也在他们的计算机上成功运行了它。

但我收到一位用户的报告,其中程序在线程中挂起。我能够做一些测试。当代码不在他的机器上的线程中运行时,它工作得很好(当然,应用程序不再保持响应并且我无法处理取消请求)。

据我所知,用户计算机的唯一不同之处在于他们运行的是 Windows 7 和 Office 2007。

我不能 100% 确定 Office Automation 是线程安全的。我可以将其全部放入一个线程中,并了解某些自动化命令(哪些命令?)可能需要同步吗?如果它不是线程安全的,那么在生成 Excel 文件时我还可以如何保持应用程序的响应能力?

Windows 7 与 Windows 10 或 Office 2007 与 Office 2016 上的 Office Automation 之间的差异是否会导致旧版本中的任务失败?如果是这样,有解决方法吗?

最佳答案

明显的缺陷是你没有在线程中初始化COM。调用CoInitializeCoInitializeEx

从后台线程自动化 Excel 肯定没有问题。你正在尝试的事情是可能的。可以想象,您未显示的代码中存在错误,但缺少 COM 初始化是问题代码中可以看到的唯一错误。

当然,当您不控制线程的生命周期时,COM 初始化并不容易。线程库创建了线程,但您不知道该线程中已经运行了什么。如果我是你,我会显式创建一个线程并避免线程库的基于任务的方法。

关于excel - Windows 7 和 Office 2007 中的办公自动化挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39056055/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com