Microsoft ACE OLEDB 连接在有 166,110 行时创建空的 Excel

Elo*_*ise 2 c# oledb excel aceoledb

我正在用 C# 编程并使用oledbconnection. 这是标准的连接字符串,例如

using (OleDbConnection conn = new OleDbConnection(
          "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
           saveFilenameAndLocation + 
          ";Extended Properties='Excel 12.0 Xml;HDR=Yes'"
      ))  
Run Code Online (Sandbox Code Playgroud)

当行数不多时,这会成功并创建包含正确数据的 Excel 电子表格。但是,每当电子表格中的行数增加到很大时(例如,当前它在 166,110 行上失败),它会生成一个空电子表格,其中工作表选项卡名称设置为A266FF2A662E84b639DA

不可能重写它以便它不使用OLEDB连接,任何想法为什么当行大小增加时它不起作用?

小智 5

我不确定您的应用程序环境,但我在从 ASP.NET 应用程序生成 Excel 文件时看到了这一点。

一旦数据量超过特定大小(根据我的经验约为 1 MB),提供程序将在生成输出时尝试创建临时文件。我在 64 位系统上使用 32 位提供程序遇到了这个问题。如果您在具有此配置的服务帐户下运行,则创建这些文件的位置为

C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO
Run Code Online (Sandbox Code Playgroud)

这个位置,然而,这只是对访问administratorsSYSTEM默认情况下,如果提供商在运行非特权帐户,无法创建临时文件时,它会悄悄地失败,就回到其默认“空文件”与A266FF2A662E84b639DA工作表。

您需要做的是授予在(例如网络服务或 IIS AppPool\)下运行的应用程序的帐户沿路径“ C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files”读取/执行/列出内容权限,然后完全访问Content.MSO文件夹本身。

如果提供程序与您的系统的位数匹配,那么我怀疑您需要执行上述过程C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO,尽管我从未对此进行过测试。

我要感谢sysinternals提供procmon帮助我解决此问题的人。