2

我正在用 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连接,任何想法为什么当行大小增加时它不起作用?

4

5 回答 5

5

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

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

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

但是,此位置只能在默认情况下访问,administrators并且SYSTEM如果提供程序在非特权帐户下运行并且无法创建临时文件,它将静默失败,并且只会在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的帮助我解决了这个问题。

于 2013-01-31T19:34:18.400 回答
0

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

于 2014-09-15T14:42:20.580 回答
0

如果在尝试了上述所有解决方案后仍然无法正常工作,请尝试这个,它对我有用:

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

于 2017-11-10T06:05:23.200 回答
0

Windows Server 2012R2 还要检查文件夹 INetCache 是否存在并且该文件夹是否具有完整权限 C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache

于 2015-12-30T09:40:29.613 回答
0

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();
    }
}
于 2016-04-22T18:11:06.790 回答