我试着写获取数据从一个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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top