excel写入奇案!!用oleDB写数据到excel,超过13571行文件就为空白

river168 2011-10-17 04:48:18
工具: vs2010 与Microsoft.ACE.OLEDB.12.0;

代码无特别,采用oleDB写入excel,无论一行一行写入或者insert into,超过13751条记录(从13572条记录开始导出的excel为空白文件,即excel只有模板文件的表头)

但是,如果直接从vs2010调试启动站点,都是可以成功导出全部记录。配置从站点访问就有记录条数限制了(最多写入13571,超过13571条记录,整个文件就只有表头,没有写入任何记录,也无任何报错,excel写入前后都有正常log,没错误啊)。

网上搜索也无类似案例,不得其解。 请大家帮忙推一下原因。
...全文
1205 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
fhrl 2012-09-04
  • 打赏
  • 举报
回复
49楼正解,我是在iis-应用程序池-defaultappPool-属性-标识配置安全账户为administrator后,问题解决。不够安全。不过微软的OFFice产品本就不鼓励在服务端环境使用
newjacket007 2012-08-29
  • 打赏
  • 举报
回复
我也遇到一模一样的问题了。
导出Excel 2003文件,正常(可能没超过65535)
导出excel 2007文件,完了,数据量大于八千多后,就导出空表,什么错误也没有,呵呵
snngimfk 2012-03-08
  • 打赏
  • 举报
回复
"Since the Excel 2007 openxml format is zipped xml so the ACE driver OLEDB needs to read the whole file to unzip it. If the file is too large for the memory buffer, it gets cached out to disk and the location it uses is Temporary Internet Files for whatever user the app is running as. In the case of my customer, the web app is running as Network Service which means (we found this by using procmon):
C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.MSO. To work around this, we manually created the Content.MSO directory and gave Network Service modify permissions to Content.MSO. ”

Excel 2007其实是一个ZIP文件,当文件打开时,会去解压缩,如果文件小的话,会在缓存里面完成,如果文件大的话,就需要在系统盘上生成一个邻时文件,所以需要给权限。
在xp,server 2000,2003 上面的目录路径是C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.MSO
在win7 ,vista,server 2008上C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO
snngimfk 2012-02-17
  • 打赏
  • 举报
回复
我也遇到差不多的问题,但是我用模拟帐户可以解决问题,但是这种方法不是那么安全,有没有别的办法?
接分为押宝 2011-10-19
  • 打赏
  • 举报
回复

等神探。
river168 2011-10-19
  • 打赏
  • 举报
回复
郁闷死,那个带表头的模板,表头定义了三种底色,前8列一种蓝色,标识原来录入的数据,中间4列红色,表示导出的数据,后面几列黄色表示其他待生成的数据列。 结果新建一个空模板,只要表头一行,即不带颜色,(copy表头到文本编辑器,再从文本编辑器copy到新excel模板里头),再用新模板生成excel就成功了。

超级郁闷,搞了3天!!!
wcj1018_net 2011-10-19
  • 打赏
  • 举报
回复
貌似excel有这个限制
river168 2011-10-19
  • 打赏
  • 举报
回复
再顶起,求神探!!!
Cosmo 2011-10-18
  • 打赏
  • 举报
回复
我个人觉得是你13571哪条数据有误,你把前面的几条数据删除了。看看是不是到13571条数据就空白。
ilooknow 2011-10-18
  • 打赏
  • 举报
回复
excel是有行数限制的,修改一下注册表中一个与excel有关的键值(忘了),就可以了。
river168 2011-10-18
  • 打赏
  • 举报
回复
如上面推论, 问题已经不在于数据记录的多少,我将实际写入excel的11列数据,改为只写入2列数据,结果全部记录19498条都成功写入excel,那就是写入数据的大小在什么地方限制了。

站点环境:win2008(或者R2也一样) IIS7 安装AccessDatabaseEngine.exe以运行OLEDB12,安装过office2007和不安装office2007的机器一样结果

原因快明朗了,望高手指点啊!!!
无爱大叔 2011-10-18
  • 打赏
  • 举报
回复
关注中...
river168 2011-10-18
  • 打赏
  • 举报
回复
在数据中间进行id随机变化后,能成功写出记录的最大条数已经突破13571,但就是不能全部导出。看来不知道asp.net在哪里有对缓存大小或OLEDB连接输出大小什么的有限制。要不就是对写.xlsx类型文件的限制。

请大家再帮帮手!
river168 2011-10-18
  • 打赏
  • 举报
回复
web.config好像只有一处对上传文件大小的限制,对写入没有关系吧。我试改为如下也没有任何效果。
<httpRuntime maxRequestLength="102400" executionTimeout="6000"
appRequestQueueLimit="100"/>
kakaniuren 2011-10-18
  • 打赏
  • 举报
回复
围观...
shshjun 2011-10-18
  • 打赏
  • 举报
回复
> 配置从站点访问就有记录条数限制了(最多写入13571)
这个可以看一下web.config的配置,尝试增加一下某一buffer的大小。
river168 2011-10-18
  • 打赏
  • 举报
回复
总记录19498条,如果我改为从10000条开始写入,生成的excel完全正常。所以不会是数据原因或SQL语句原因。 for (int i =10000; i < count; i += batchSize)
{输出后9498条记录,excel成功生成。}
river168 2011-10-18
  • 打赏
  • 举报
回复
按以下分批连接写入,关闭,延迟500ms,再打开写入,前2次都OK。1万以后,第3次就没有写入成功。但程序是执行了的,LOG输出正常。 奇怪得很!!!

请大家帮帮忙啊!

string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=0';";

System.Data.OleDb.OleDbConnection OleConn = new System.Data.OleDb.OleDbConnection(strConn);

int count = writeDataTb.Rows.Count;
if (count < 0) return;

int batchSize = 5000;

for (int i = 0; i < count; i += batchSize)
{
try
{
OleConn.Open();

System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand();
cmd.Connection = OleConn;

string sqlstr = "";

for (int j = i; j < i + batchSize && j < count; j++)
{
sqlstr = string.Format("insert into [表1$](A,B) values('{0}','{1}')", writeDataTb.Rows[j][0].ToString(), writeDataTb.Rows[j][1].ToString());
cmd.CommandText = sqlstr;

cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
LogHelper.WriteLog(LogFile.Error, ex.Message);
}
finally
{
OleConn.Close();
}

LogHelper.WriteLog(LogFile.SQL, i.ToString() + " : " + "sleep 1000");

System.Threading.Thread.Sleep(500);
}
橙宝宝 2011-10-18
  • 打赏
  • 举报
回复
会不会这一行有一些不该有的命令字符串呢?试试把这一行的内容变一下LOOK LOOK呗
SATAN1122 2011-10-18
  • 打赏
  • 举报
回复
一步一步检查吧,首先检查源,可以考虑用打乱源数据来看是否还是13572行出错。还可以减少数据列,检查是否因为数据量过大而产生问题。
加载更多回复(32)
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会更多基础的原创内容来回报大家。 C#导出数据EXCEL表格是个老生常谈的问题了,这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的EXCEL 2.通过OLEDBEXCEL做为数据源来 3.通过RANGE范围多列内存数据EXCEL 4.利用系统剪贴板EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧