获取细胞的文本值在Excel(* .xls)文件的更好的方法
题
我试着写获取数据从一个Excel文件的导入功能。我目前如何做到这一点如下:
Private Sub ReadExcel(ByVal childform As PhoneDiag.frmData, ByVal FileName As String)
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
xlApp = New Excel.ApplicationClass
xlWorkBook = xlApp.Workbooks.Open(FileName)
xlWorkSheet = xlWorkBook.Worksheets(1)
Dim columnrange = xlWorkSheet.Columns
Dim therange = xlWorkSheet.UsedRange
''Add rows by column
For rCnt = 2 To therange.Rows.Count
Dim rowArray(therange.Columns.Count) As String
For cCnt = 1 To therange.Columns.Count
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
Dim celltext As String
celltext = Obj.Value.ToString
rowArray((cCnt - 1)) = celltext
Next
childform.datagridSample.Rows.Add(rowArray)
Next
'' make sure we close the excel.exe service after use
xlWorkBook.Close()
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
End Sub
问题是,当然,是它运行可怕。据我所知,它更可能归结到这一行:
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
我所需要的是从细胞中的文本,而不是为每个小区中的对象(然后不将它们发送到垃圾收集)。有刚开的文本更简单的方法?
理想情况下,如果我能得到的方法用于获取细胞的文本值,我想获得多个rowArray()的加入到母版阵列和以后更新程序的值。
如果你看到任何其他的表现技巧,让我知道。这将是大加赞赏。 = B
编辑:我也意识到,我有两个选择,如果我是创建一个母版阵列,说马尔,以保持所有数据。会是更好的性能,明智的,有马尔要大和子阵列小,或马尔要小和子阵列持有更多的信息吗?
我问,因为将要导入文件会比列更多的行,所以我想知道是否有任何“集”做这件事的方式。
解决方案
阅读细胞含量分别是一个巨大的性能杀手。我的建议是从阵列的第一读取整个范围划分为对象的数组,然后检索数据。我不VB.NET写的,但在C#代码看起来是这样的:
Excel.Range firstCell = excelWorksheet.get_Range("A1", Type.Missing);
Excel.Range lastCell = excelWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
object[,] cellValues;
Excel.Range worksheetCells = excelWorksheet.get_Range(firstCell, lastCell);
cellValues = worksheetCells.Value2 as object[,];
此示例读取的片材的整个内容到cellValues(小心空值)。同样的建议也适用于写入片 - 做这一切在一次,一个数组结果 如果你有兴趣,我对这个的有结果 Oh和顺便说一句,取代
xlApp = New Excel.ApplicationClass
通过
xlApp = New Excel.Application
其他提示
这里有一个C#版本(但你的要点),将数据放入一个DataTable ...
con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+SpreadsheetLocation+";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM ["+Worksheet+"$]", con);
DataTable dt = new DataTable();
da.Fill(dt);
其中“SpreadSheetLocation”和“工作表”分别是文件的路径和工作表名称。然后,您可以转换数据表行,如果你喜欢的阵列。
更新:你也不必Excel的机器中安装此解决方案...
有关简单的阅读,我使用 Excel数据读取器在CodePlex 的可用的。
使用组件机器不需要安装Excel,它是很容易使用。可以读取工作表入数据集。
SpreadshsetGear用于.NET 将允许您打开工作簿和访问单元的原始值(数字,文本,逻辑或错误),或获得细胞的格式化文本。由于运行的SpreadsheetGear您的应用程序,而不是COM互操作使用Excel的一部分,它会运行得更快(见的此页面,看看我们的一些客户也说过性能)。
声明:我自己的SpreadsheetGear LLC