Excel列表每一行的<List <string >>

我有一个小程序,你可以select一些数据库表,并创build一个Excel表格的所有值的Excel文件,这就是我创buildExcel文件的解决scheme。

foreach (var selectedDatabase in this.lstSourceDatabaseTables.SelectedItems) { //creates a new worksheet foreach selected table foreach (TableRetrieverItem databaseTable in tableItems.FindAll(e => e.TableName.Equals(selectedDatabase))) { _xlWorksheet = (Excel.Worksheet) xlApp.Worksheets.Add(); _xlWorksheet.Name = databaseTable.TableName.Length > 31 ? databaseTable.TableName.Substring(0, 31): databaseTable.TableName; _xlWorksheet.Cells[1, 1] = string.Format("{0}.{1}", databaseTable.TableOwner,databaseTable.TableName); ColumnRetriever retrieveColumn = new ColumnRetriever(SourceConnectionString); IEnumerable<ColumnRetrieverItem> dbColumns = retrieveColumn.RetrieveColumns(databaseTable.TableName); var results = retrieveColumn.GetValues(databaseTable.TableName); int i = 1; (result is a result.Item3 is a List<List<string>> which contains all values from a table and for each row is a new list inserted) for (int j = 0; j < results.Item3.Count(); j++) { int tmp = 1; foreach (var value in results.Item3[j]) { _xlWorksheet.Cells[j + 3, tmp] = value; tmp++; } } } } 

它的工作原理,但是当你有一个5000或更多的值的表,将需要这么长的时间。

有人可能知道一个更好的解决scheme,每行添加List Liststring比我的foreach解决scheme吗?

我利用我的代码示例中的GetExcelColumnName函数将列数转换为Excel列名。

整个想法是,一个接一个地写excel单元是非常慢的。 因此,预先计算整个值表,然后在一个单独的操作中分配结果。 为了将值分配给二维范围,请使用值的二维数组:

 var rows = results.Item3.Count; var cols = results.Item3.Max(x => x.Count); object[,] values = new object[rows, cols]; // TODO: initialize values from results content // get the appropriate range Range range = w.Range["A3", GetExcelColumnName(cols) + (rows + 2)]; // assign all values at once range.Value = values; 

也许你需要改变一些关于使用的索引范围的细节 – 现在不能testing我的代码。

正如我所看到的,你没有做分析。 我build议首先进行性能分析(例如dotTrace),然后查看代码中哪些部分会导致性能问题。 在我的实践中,当代码执行比数据库请求更慢时,即使代码在algorithm上言之甚佳,也是罕见的情况(几乎没有这种情况)。

首先,我build议不要用专栏来填补你的专长,而要用行。 如果你的表有很多列,这将导致多次往返数据库 – 这对性能有很大的影响。

其次,批量写行 – 逐行。 将excel文件看作小型数据库,同样的“批处理比一个一个快”的原则。