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

本文关键字:创建 Excel OLEDB ACE 连接 Microsoft | 更新日期: 2023-09-27 18:33:35

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

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

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

不可能

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

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

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

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

C:'Windows'SysWOW64'config'systemprofile'AppData'Local'Microsoft'Windows'Temporary Internet Files'Content.MSO

但是,默认情况下,此位置仅供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帮助我解决此问题。

我公司的一名员工今天遇到了这个问题。解决方案很简单:她在 C 上只剩下 20MB 的可用空间: - 如果您在系统驱动器上释放了足够的空间,它应该可以解决问题。

Windows Server 2012R2还要检查文件夹 INetCache 是否存在,并且此文件夹具有完整的外围任务 C:''Windows''SysWOW64''config''systemprofile''AppData''Local''Microsoft''Windows''INetCache

10个小时后,我找到了解决方案。

每 1000 行我们必须关闭并重新打开连接。

样品在这里。

string createTable = "Create Table [Sheet_X] (field1 char(255), field2 char(255),field3 char(255));";
OleDbCommand cmd = new OleDbCommand(createTable, conn);
conn.Open();
cmd.ExecuteNonQuery();
var counter = 0;
foreach (var item in items)
{
    if (conn.State == ConnectionState.Closed)
        conn.Open();
    string insertdata = "insert into [Sheet_X] (field1,field2,field3) values('value1','value2','value3');";
    counter++;
    if (counter >= 1000)
    {
        counter = 0;
        conn.Close();
    }
}

如果在尝试上述所有解决方案后仍然不起作用,请尝试这个解决方案,它对我有用:

在 IIS 应用程序池的"高级设置"中,将">加载用户配置文件"的值从"False"更改为">True"。