在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) 

我所需要的是来自单元格的文本,而不是为每个单元格创build一个对象(然后不发送它们到垃圾回收)。 有没有简单的方法来获取文本?

理想情况下,如果我可以得到一个获取单元格的文本值的方法,我想多个rowArray()添加到主数组,并稍后更新程序的值。

如果您看到其他任何性能提示,请告诉我。 这将不胜感激。 = b

编辑:我也意识到,我有两个select,如果我要创build一个主数组,说mArr,以保存所有的数据。 mArr较大,子arrays较小,mArr较小,子arrays能容纳更多的信息,会有更好的性能performance吗?

我问,因为将被导入的文件将有更多的行比列,所以我想知道是否有任何“设置”的方式做到这一点。

单独读取单元格内容是一个巨大的性能杀手。 我的build议是首先将整个范围读入一个对象数组,然后从该数组中检索数据。 我不写在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(注意空值)。 同样的build议适用于写入表单 – 一次完成,一个数组。
如果你有兴趣,我在这里有一个更长的职位
哦,顺便说一句,取代

 xlApp = New Excel.ApplicationClass 

通过

 xlApp = New Excel.Application 

这里是一个C#版本(但你得到的要点),将数据转换为数据表…

 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”和“Worksheet”分别是文件path和工作表名称。 如果你喜欢,你可以将数据表行转换为数组。

更新:你也不需要安装在这台机器上的Excel解决scheme…

为了简单阅读,我使用CodePlex上提供的Excel数据读取器 。

使用该组件的机器不需要安装Excel,而且使用起来非常简单。 您可以将工作表读取到DataSet中。

SpreadshsetGear for .NET将允许您打开工作簿并访问单元格(数字,文本,逻辑或错误)的原始值或获取单元格的格式化文本。 由于SpreadsheetGear作为应用程序的一部分运行,而不是像Excel一样运行COM Interop,所以运行速度会更快(请参阅本页上的注释以了解我们的某些客户对性能的看法)。

你可以在这里看到活的样品,并在这里下载免费试用。

免责声明:我自己的SpreadsheetGear LLC