导出ListView到Excel – 苦苦挣扎的performance

我试图优化我前段时间编写的应用程序的输出,虽然我在许多方面取得了很大成绩,但我正在努力加快将列表视图的结果导出到.xlsx文件的function。

我正在使用Interop来完成它,如下所示:

Imports Excel = Microsoft.Office.Interop.Excel Imports System Imports System.IO Imports System.Data.OleDb Imports System.Threading Imports System.Linq Imports System.Data.SqlClient 

这是在listview中输出数据的函数:

 Private Function ExportListViewTab5ToXLSxFile(ByRef FileNameWithoutExtension As String, ByRef OutputDir As String) As Boolean Try Dim objExcel As Excel.Application = New Excel.Application Dim bkWorkBook As Excel.Workbook Dim shWorkSheet As Excel.Worksheet Dim i As Integer Dim j As Integer objExcel = New Excel.Application bkWorkBook = objExcel.Workbooks.Add shWorkSheet = CType(bkWorkBook.ActiveSheet, Excel.Worksheet) For i = 0 To lvObjectsTab5.Columns.Count - 1 shWorkSheet.Cells(1, i + 1) = lvObjectsTab5.Columns(i).Text Next For i = 0 To lvObjectsTab5.Items.Count - 1 For j = 0 To lvObjectsTab5.Items(i).SubItems.Count - 1 shWorkSheet.Cells(i + 2, j + 1) = lvObjectsTab5.Items(i).SubItems(j).Text Next Next shWorkSheet.Columns.AutoFit() Try '///////////////// '// Save report // '///////////////// Try shWorkSheet.SaveAs(OutputDir & "\" & FileNameWithoutExtension & ".xlsx") Catch ex As Exception MessageBox.Show("A exportação do relatório foi cancelada pelo usuário!", "Exportação cancelada!", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End Try '/////////////////////////////////// '// Close EXCEL.EXE COM processes // '/////////////////////////////////// bkWorkBook.Close() objExcel.Workbooks.Close() NAR(bkWorkBook) objExcel.Quit() NAR(objExcel) '////////////////////////// '// Open report in Excel // '////////////////////////// Process.Start(OutputDir & "\" & FileNameWithoutExtension & ".xlsx") Return True Catch ex As Exception MessageBox.Show("Falha ao exportar o arquivo '" & FileNameWithoutExtension & ".xlsx' para '" & OutputDir & "'", "Falha ao exportar relatório!" & vbCrLf & vbCrLf & _ "Detalhes do erro:" & vbCrLf & vbCrLf & _ ex.ToString, MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End Try Catch ex As Exception MessageBox.Show("Falha ao exportar o arquivo '" & FileNameWithoutExtension & ".xlsx' para '" & OutputDir & "'", "Falha ao exportar relatório!" & vbCrLf & vbCrLf & _ "Detalhes do erro:" & vbCrLf & vbCrLf & _ ex.ToString, MessageBoxButtons.OK, MessageBoxIcon.Error) Return False End Try End Function 

列表视图包含10列,需要4分钟导出2000行。 太多了。 我search了几个小时,search了几个性能问题的例子,但是我发现的所有例子都和我的相似。

有没有人可以指导我如何使用.NET代码提高我的function的性能? 在典型的情况下,这个列表视图列出了15000行。 我限制到2000年,所以用户不那么痛苦。

有什么build议么?

在此先感谢Daniel

尝试一次将所有值作为范围应用。 像这样的东西可能会做到这一点。

 dim Values(lvObjectsTab5.Items.Count, lvObjectsTab5.Items(i).SubItems.Count) as object dim Range as Excel.Range = shWorkSheet.Range("A1","J" & (lvObjectsTab5.Items.Count+ 1)) For i = 0 To lvObjectsTab5.Columns.Count - 1 Values(0, i ) = lvObjectsTab5.Columns(i).Text Next For i = 0 To lvObjectsTab5.Items.Count - 1 For j = 0 To lvObjectsTab5.Items(i).SubItems.Count - 1 Values(i+1,j) = lvObjectsTab5.Items(i).SubItems(j).Text Next Next Range.value = Values 

编辑:插入值列matrix上的列标题。