创建内存中Excel文件并在不使用COM Interop的情况下在Excel中打开它

问题描述 投票:0回答:2

我目前正在.NET中使用COM Interop将DataTable的内容导出到Excel。这是我多年来一直使用的一种方法,但是问题是COM很粗略,并引发了随机,间歇性,不可追踪的异常。这不是一个大问题,因为它始终只是专用于此目的的机器上的代码,而且异常很少见,但是最近我为数据仓库编写了前端,并且有200多个用户它,并且这个问题(如您所料)呈指数增长。

问题是找到一种可以执行COM所没有的方法的方法。即,在内存中创建一个Excel文件(不写入磁盘),它是一个新的工作簿,以便当用户第一次单击“保存”时,它将询问他们想要在哪里保存文件以及想要什么。打电话给它。

我知道我可以使用OpenXML将DataTable导出到Excel文件:Export DataTable to Excel with Open Xml SDK in c#

而且我知道我可以在内存中创建OpenXML Excel对象而无需写入磁盘上的文件:How to create Excel file using OpenXML without creating a local file?

问题是最后一步:在Excel中打开该内存文件(不使用COM)

使它开始工作将是我的理想选择。

现在,我宁愿不写文件,但是如果没有其他选择,那也不是问题,所以作为备份选项,我还考虑过使用OpenXML创建Excel模板,然后打开模板(使用Process.Start)。

该方法的问题在于,一些用户报告说,默认情况下,有时默认情况下模板会以xltx文件的形式打开,而不是以新的xlsx文件的形式打开:https://answers.microsoft.com/en-us/office/forum/office_2007-customize/is-there-a-way-to-get-my-excel-template-xltx-file/ab36cd4d-f6b0-46e0-8f15-533a4acb357f?page=1

这比我从使用COM获得的随机错误要大得多。

任何想法都值得赞赏。

编辑-这些是我得到的COM错误:


无法创建ActiveX组件。

COM目标未实现IDispatch。

HRESULT的异常:0x800AC472

Range类的选择方法失败

操作不可用(HRESULT的异常:0x800401E3(MK_E_UNAVAILABLE)]

消息过滤器指示应用程序正忙。 (来自HRESULT的异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))

远程过程调用失败。 (HRESULT的异常:0x800706BE)

无法将类型为'System .__ ComObject'的COM对象转换为接口类型为'System.Collections.IEnumerable'。此操作失败,因为对IID为“ {496B0ABE-CDEE-11D3-88E8-00902754C43A}”的接口的COM组件上的QueryInterface调用由于以下错误而失败:'请求的对象不存在。 (来自HRESULT的异常:0x80010114),并且COM组件不支持IDispatch ::调用DISPID_NEWENUM的调用。

无法获得Workbooks类的Add属性

Workbook类的激活方法失败


在过去的几个月中,我收到了107个错误,但是自从我更新该功能以将其附加到用户可能已经打开的任何现有Excel实例(而不是创建一个新实例)后,我得到的更多信息。以前,当我每次每次都创建一个新的Excel实例时,错误的发生率要少得多(在我做幕后工作时,通过使Excel不可见,可以很大程度上解决这些错误。)

我目前正在.NET中使用COM Interop将DataTable的内容导出到Excel。这是我使用了多年的方法,但是问题是COM粗略,并且抛出了随机,间歇,...

c# excel vb.net openxml com-interop
2个回答
0
投票

您可以在vb.net中使用以下代码或转换为c#


0
投票

这是一个建议,而不是一个答案。考虑尝试将文件保存到临时位置,然后在文件系统中将其设置为“只读”。这将迫使您的用户执行SaveAs而不是Save。然后使用Excel命令行选项(显然/n最好)打开XLSX文件,就像它是模板一样。

© www.soinside.com 2019 - 2024. All rights reserved.