Asp.net 写入包含公式的Excel文件非常慢

Asp.net 写入包含公式的Excel文件非常慢,asp.net,vb.net,excel,Asp.net,Vb.net,Excel,我们有一个自动过程,可以打开模板excel文件,写入数据行,然后将文件返回给用户。这个过程通常很快,但是最近我被要求在其中一个模板中添加一个包含一些Excel公式的摘要页面,现在这个过程将永远持续下去 几分钟后,它成功地运行了大约5条记录,但是本周的记录集几乎有400行,我让它运行的最长记录是在取消之前大约半小时。如果没有公式,只需几秒钟即可运行 将行写入包含公式的Excel文件是否存在任何已知问题?或者有没有办法告诉Excel在用户打开文件之前不要计算公式 汇总表上的公式如下: ' Retur

我们有一个自动过程,可以打开模板excel文件,写入数据行,然后将文件返回给用户。这个过程通常很快,但是最近我被要求在其中一个模板中添加一个包含一些Excel公式的摘要页面,现在这个过程将永远持续下去

几分钟后,它成功地运行了大约5条记录,但是本周的记录集几乎有400行,我让它运行的最长记录是在取消之前大约半小时。如果没有公式,只需几秒钟即可运行

将行写入包含公式的Excel文件是否存在任何已知问题?或者有没有办法告诉Excel在用户打开文件之前不要计算公式

汇总表上的公式如下:

' Returns count of cells in column where data = Y
=COUNTIF(Sheet1!J15:Sheet1!J10000, "Y") 
=COUNTIF(Sheet1!F15:Sheet1!F10000, "Y")

' Return sum of column where data is a number greater than 0
' Column contains formula calculating the difference in months between two dates
=SUMIF(Sheet1!I15:Sheet1!I10000,">0",Sheet1!I15:Sheet1!I10000)  

' Returns a count of distinct values in a column
=SUMPRODUCT((Sheet1!D15:Sheet1!D10000<>"")/COUNTIF(Sheet1!D15:Sheet1!D10000,Sheet1!D15:Sheet1!D10000&""))

多年来拯救我的一个方法是添加

Application.ScreenUpdating = False
在我执行一个可能很长的方法之前,然后

Application.ScreenUpdating = True

直接在代码后面,或者至少在代码后面的某个点。这迫使Excel在完成之前不在可见屏幕上重新绘制任何内容。我发现这一问题经常源于冗长的运行操作。

每次写入单元格时,Excel都会重新计算打开的工作簿并刷新屏幕。这两种方法都很慢,因此需要设置Application.screenUpdate=false和Application.Calculation=xlCalculationManual


此外,每次写入单元格都会带来很高的开销,因此计算数组中的数据,然后通过调用Excel对象模型将数组写入范围的速度要快得多。

使用
自动计算模式,每次数据输入/更改后都会重新计算。我也有同样的问题,通过设置
手动
计算模式解决了。(参考MSDN。)


此外,此属性只能在打开工作簿后设置,否则将引发运行时错误。

请尝试设置手动计算模式。-@AVD成功了,谢谢:)如果你把它作为一个答案发布,我会接受的,很高兴你让它工作。Excel不会在屏幕上画任何东西。该文件构建在web服务器上,然后保存并返回给用户下载。我尝试设置
Application.Calculation
,但是我得到了一个运行时错误(认为是
HRESULT:0x800A03EC
)。我还尝试了设置
应用程序。屏幕更新
,但这并没有什么区别。我无法写入连续的单元格区域,因为有时模板自身的列与汇总数据的数据列混合在一起,我无法修改模板。+1表示“在数组中累积数据,然后将数组写入区域的速度要快得多”+1。这是一个很好的答案,但是AVD首先给出了解决我问题的解决方案,所以我接受了他的回答。你应该能够在模板列之间一次写一列,或者读取一块混合了模板内容和你的内容的列,根据需要修改数组,然后重写该块。访问单个单元的开销非常大,读写速度仍然会更快。谢谢。我更新了您的答案,包括一个代码示例和一个关于仅在打开工作簿后设置它的注释。
Application.ScreenUpdating = True
xls.Calculation = Excel.XlCalculation.xlCalculationManual