【发布时间】:2012-07-05 19:41:38
【问题描述】:
我正在 VB.NET 中构建一个应用程序来从 Excel 文件中读取行并将它们填充到 DataTable 中。
dtRow = dataTable.NewRow()
Dim startTime As DateTime = DateTime.Now
dtRow("name") = suppliers.CellValue("A", rowCount)
/* SNIP - just more string retrieval */
dtRow("statistics") = suppliers.CellValue("P", rowCount)
dataTable.Rows.Add(dtRow)
Dim endTime As DateTime = DateTime.Now
Debug.Print(String.Format("Time elapsed to retrieve '{0}': {1} ms", rowCount, (endTime - startTime).ToString("fffffff")))
CellValue 是我自己创造的——但它是一个小函数,我已经测量了它的运行时间。速度挺快的。
但是,当我打开一个 10,000 行的 Excel 文件(填充相同的数据)时,处理时间会变慢。
3,000 行:
Time elapsed to retrieve '2': 0510051 ms
Time elapsed to retrieve '3': 0500050 ms
Time elapsed to retrieve '4': 0340034 ms
Time elapsed to retrieve '5': 0350035 ms
Time elapsed to retrieve '6': 0340034 ms
Time elapsed to retrieve '7': 0340034 ms
Time elapsed to retrieve '8': 0350035 ms
6,000 行:
Time elapsed to retrieve '2': 0710071 ms
Time elapsed to retrieve '3': 0760076 ms
Time elapsed to retrieve '4': 0620062 ms
Time elapsed to retrieve '5': 0670067 ms
Time elapsed to retrieve '6': 0750075 ms
Time elapsed to retrieve '7': 0750075 ms
Time elapsed to retrieve '8': 0700070 ms
10,000 行:
Time elapsed to retrieve '2': 0920092 ms
Time elapsed to retrieve '3': 0920092 ms
Time elapsed to retrieve '4': 1790179 ms
Time elapsed to retrieve '5': 1810181 ms
Time elapsed to retrieve '6': 1930193 ms
Time elapsed to retrieve '7': 2240224 ms
Time elapsed to retrieve '8': 1820182 ms
为什么会发生这种情况?我可以修复它吗?
编辑:suppliers 是我创建的用于处理 Excel 文件的类,使用此构造函数:
Public Sub New(ByVal doc As SpreadsheetDocument, ByVal sheetName As String)
pWorkbookPart = doc.WorkbookPart
Dim sheet As Sheet = pWorkbookPart.Workbook.Descendants(Of Sheet).Where(Function(s) s.Name = sheetName).FirstOrDefault()
pWorksheetPart = CType(pWorkbookPart.GetPartById(sheet.Id), WorksheetPart)
pSharedStringTable = pWorkbookPart.GetPartsOfType(Of SharedStringTablePart).FirstOrDefault()
End Sub
CellValue:
Public Function CellValue(ByVal column As String, ByVal row As Integer) As String
Dim cellAddress As String = column & row
Dim cell As Cell = pWorksheetPart.Worksheet.Descendants(Of Cell).Where(Function(c) c.CellReference = cellAddress).FirstOrDefault()
Dim index As Integer
Dim returnValue As String
If cell IsNot Nothing Then
If cell.DataType IsNot Nothing Then
index = Integer.Parse(cell.InnerText)
returnValue = pSharedStringTable.SharedStringTable.ElementAt(index).InnerText
Else
returnValue = CStr(cell.InnerText)
End If
End If
Return returnValue
End Function
【问题讨论】:
-
听起来内存压力导致垃圾收集占用了更多的墙时间。
-
供应商的类型是什么?
-
@sixlettervariables 有什么建议吗?我是否应该先处理 sans
DataRows,然后将它们全部放入DataTable?这能解决什么问题吗? -
@JohnKoerner 我已添加到问题中。
-
你能在那个类上添加 CellValue 的定义吗?
标签: .net vb.net openxml openxml-sdk