Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从access导出到excel的速度较慢_Vb.net_Excel_Ms Access - Fatal编程技术网

Vb.net 从access导出到excel的速度较慢

Vb.net 从access导出到excel的速度较慢,vb.net,excel,ms-access,Vb.net,Excel,Ms Access,我必须从access数据库生成大约800个excel文件 对于前10-15个excel文件,它工作得很好,只需几秒钟/excel文件,但持续时间更长,第150个excel文件需要10分钟 这是我的密码: 它对access表中的每个nrliste(大约800个)执行此操作 我不知道,但我会看看你在Excel中同时打开了多少文件。完成写入后是否关闭文件?也许这是为了让它们保持打开状态,所以当第150个工作表打开时,它可能正在为内存使用而挣扎。另外,我想说的是,尝试在调试器中单步执行代码,看看哪一位速

我必须从access数据库生成大约800个excel文件

对于前10-15个excel文件,它工作得很好,只需几秒钟/excel文件,但持续时间更长,第150个excel文件需要10分钟

这是我的密码:

它对access表中的每个nrliste(大约800个)执行此操作


我不知道,但我会看看你在Excel中同时打开了多少文件。完成写入后是否关闭文件?也许这是为了让它们保持打开状态,所以当第150个工作表打开时,它可能正在为内存使用而挣扎。另外,我想说的是,尝试在调试器中单步执行代码,看看哪一位速度慢(或随时间变慢)——这将有助于缩小问题的原因。

是否在完成工作簿后关闭它(在循环内)

看看线程,这解释了释放所有COM接口的必要性

编辑:我看到你的评论,回复@1800信息

Dim lista = From ls In Liste _
                        Where ls!Concatenare = nrliste(i) _
                     Select ls
这个linq查询做什么

EDIT2:尝试在MS Access中运行SQL以查看其执行情况? 另外,我建议暂时放弃LINQ&使用普通的旧ADO.net命令对象和参数化查询

或者,一种简单而愚蠢的方法是将所有记录(其中ID在最小值和最大值之间)拉入数据表,并在内存中对其进行过滤,并进行某种直接传输(不使用数组,避免逐行、逐单元格写入值)

如果可能的话,我会努力找出答案。(即,使用过滤后的数据集并将其写入excel文件)


希望这能给您一些关于如何继续的提示。

您可以尝试使用Docmd传输电子表格,因为这样会更快

DoCmd.Transferspreadsheet ....

然后,您可以始终在以后使用Excel automation打开文件

快速查看您的代码,我会对每行调用.Rows(n).Insert(Excel.XlDirection.xlDown,1)提出疑问。您应该能够为所有行调用Insert一次。即使只插入一行,在工作表中插入行也是非常昂贵的,尤其是在插入大型工作表或包含许多公式的工作簿时

通常会加快应用程序(如您的应用程序)的速度(您可以在页面右侧看到一些证实这一点的引号)。SpreadsheetGear还有一个IRange.CopyFromDataTable方法,因此您不必将数据复制到临时数组中。SpreadsheetGear API类似于Excel的API,因此转换代码非常简单。如果你想试用,可以下载免费试用版


免责声明:我拥有SpreadsheetGear LLC

而不是Rows Insert,我会尝试从记录集复制整个记录集。当然,你必须重新设计你的逻辑


但更重要的是,一旦使用完Excel电子表格对象,您将在何处关闭它?

谢谢您的建议,我已经使用了调试器,并且在这个linq语句中花费了很多时间:Dim lista=From ls in Liste u where ls!Concatenare=nrliste(i)\选择ls这是从访问表中获取要导出的行的地方。我不知道该如何加快速度。这是从访问表中选择数据,其中concatenare(访问表中的一列)=liste(I)(选择标准-我从0到768)感谢您的建议,我会在我有另一个应用程序使用docmd传输电子表格时立即尝试,但对我来说速度似乎较慢,我要试一试。到目前为止,它应该更快,因为它不是顺序操作,而是批处理操作。而且,您不需要自动化第二个重量级Office应用程序——它直接使用Jet/ACE编写文件。请参阅下面我修改的答案。谢谢在这种情况下,您的产品与TransferSpreadsheet相比有什么优势?在这种情况下,没有使用自动化来对输出数据进行特殊格式化。在我看来,从最初的帖子中,每套记录都被插入到VB.NET工作簿的顶部(我可能会误解它)。我的回复是对那篇原始帖子的。我不熟悉DoCmd.TransferSpreadsheet,因此无法评论SpreadsheetGear与它的比较。最初发布时,我在这里没有看到回复。我投了反对票,因为它表明原来的答案只是路过,因为海报声称完全不知道替代解决方案。好的,从记录集中复制我在4分钟内导出了大约400个文件,这是一个非常非常快速的方法,谢谢
Dim lista = From ls In Liste _
                        Where ls!Concatenare = nrliste(i) _
                     Select ls
DoCmd.Transferspreadsheet ....