我是c#的初学者,我有一个30000行的excel文件,我想读它并在每个单元格上做一些处理。我使用此代码进行读取,之后我在这个excel文件上有一个for循环,速度很慢(约2小时)。你能帮我解决这个问题吗?有没有办法快速读取这个文件?
Invoke-WebRequest -Uri $SourceUrl -OutFile $LocalFileName -UseBasicParsing
答案 0 :(得分:3)
您还没有分享您所询问的循环,但如果代码示例重复了30,000次,那么一个大问题是:
您打开同一个文件 30,000次。
您关闭该文件零次。
我很惊讶Windows并没有崩溃。在2小时后它甚至完成了吗?
一个好的起点是通过Google搜索您不太了解的每个关键字。就个人而言,我喜欢MSDN,但有成千上万的有用网站&那里的例子。
例如:
您知道new Excel.Application
的作用吗?让我们来看看。 Click here,然后转到第一个搜索结果。
接下来,Workbooks.Open
做了什么? Click here.
我实际上对C#Interop没有多少经验,但答案很容易获得。听起来像@Zameer's links可能是您需要的 - 但不仅仅是复制/粘贴代码,请确保您也了解这些示例的每一步!
一开始可能会让人不知所措,有时甚至不知道从哪里开始寻找,但那里有无数的资源。
另请参阅:
祝你好运!我希望我听起来根本没有贬低;它有时很难说出一个人的经验水平,甚至无论,我认为简单的事情通常是最容易忽视的(我自己包括!)我仍然认为对象处理至少是问题的一部分。
我在处理多个对象时遇到内存或性能问题时有时会使用的故障排除方法是简化& 34;总结&#34 ;.我将重命名所有代码的副本,删除除对象之外的所有代码,并将它们重命名为" object subtype + number",以查看类似这样的内容:
正如我所说,我对C#相当新,但我知道在其他语言中,忘记关闭&发布对象可能会导致严重问题,尤其是在反复循环时。
此外,我无法肯定地说,但我怀疑你最好重新使用在循环之前创建的单个Excel.Application
对象,而不是使用多个create /来刻录资源打开/关闭/释放。
另一种可能性,而不是经历每一行& UsedRange
中的列,可能会尝试等效于For Each
循环的C语言。
Dim c as Range
For Each c in xlWorkSheet.UsedRange
c.Value = .....
...etc..
Next
最后想到,如果它仍然很慢,请在此处贴上一些定时器。在那里找出导致性能问题的确切原因。 (还要检查Windows任务管理器是否正在运行以密切关注资源。)
答案 1 :(得分:1)
您可以将Open XML SDK
用于此目的。它与互操作方法不同,读取工作簿的Interop方法通常也很慢。
我已经使用openxml sdk在不同的工作表上创建和读取包含超过10k行的excel。这应该符合你的目的。
以下是一些可以帮助您入门的链接。
Read excel as data table with OpenXML
希望有所帮助