将C#列表列表导出到Excel

使用C#,有没有一种直接的方式来导出列表(即List<List<T>> )到Excel 2003列表?

我parsing出大的文本文件并导出到Excel。 一次写入一个单元会造成太多的开销。 我select使用List<T>以便我不必担心指定行数或列数。

目前,我一直等到文件结束,然后把我的List<List<object>>放到一个二维数组中。 然后可以将数组设置为Excel.Range对象的值。 它的工作原理,但似乎我应该能够拿我的列表清单,而不必担心行数或列的数量,并将其转储到工作表从A1到任何地方。

以下是我想replace或改进的代码片段:

 object oOpt = System.Reflection.Missing.Value; //for optional arguments Excel.Application oXL = new Excel.Application(); Excel.Workbooks oWBs = oXL.Workbooks; Excel._Workbook oWB = oWBs.Add(Excel.XlWBATemplate.xlWBATWorksheet); Excel._Worksheet oSheet = (Excel._Worksheet)oWB.ActiveSheet; int numberOfRows = outputRows.Count; int numberOfColumns = int.MinValue; //outputRows is a List<List<object>> foreach (List<object> outputColumns in outputRows) { if (numberOfColumns < outputColumns.Count) { numberOfColumns = outputColumns.Count; } } Excel.Range oRng = oSheet.get_Range("A1", oSheet.Cells[numberOfRows,numberOfColumns]); object[,] outputArray = new object[numberOfRows,numberOfColumns]; for (int row = 0; row < numberOfRows; row++) { for (int col = 0; col < outputRows[row].Count; col++) { outputArray[row, col] = outputRows[row][col]; } } oRng.set_Value(oOpt, outputArray); oXL.Visible = true; oXL.UserControl = true; 

这个工作,但我宁愿直接使用列表到Excel,而不是为了Excel的中间步骤创build一个数组。 有任何想法吗?

从战略上讲,你做的是对的。 正如Joe所说,通过一次性传递整个数组值来执行单元格赋值的速度要快得多,而不是逐个循环遍历单元格。

Excel是基于COM的,所以可以通过.NET interop与Excel进行操作。 互操作是不知道generics,不幸的是,所以你不能通过一个List <T>或类似的东西。 二维数组真的是唯一的出路。

也就是说,有几种方法可以清理代码,使其更易于pipe理。 这里有一些想法:

(1)如果您正在使用.NET 3.0,则可以使用LINQ从以下位置缩短代码:

 int numberOfColumns = int.MinValue; foreach (List<object> outputColumns in outputRows) { if (numberOfColumns < outputColumns.Count) { numberOfColumns = outputColumns.Count; } } 

到一行:

 int numberOfColumns = outputRows.Max(list => list.Count); 

(2)不要使用_Worksheet_Workbook接口。 改用WorksheetWorkbook 。 请参阅这里讨论: Excel互操作:_Worksheet或工作表? 。

(3)考虑使用Range.Resize方法,它在C#中以Range.get_Resize出现。 这是一个折腾 – 我真的很喜欢你设置范围大小的方式。 但是,这是我想你可能想知道的事情。 例如,你的行在这里:

 Excel.Range oRng = oSheet.get_Range("A1", oSheet.Cells[numberOfRows,numberOfColumns]); 

可以更改为:

 Excel.Range oRng = oSheet.get_Range("A1", Type.Missing) .get_Resize(numberOfRows, numberOfColumns); 

(4)您不必将Application.UserControl设置为true 。 让Excel对用户可见就足够了。 UserControl属性没有做你认为的事情。 (请参阅此处的帮助文件)如果要控制用户是否可以控制Excel,则应该使用工作表保护,或者如果要locking用户,则可以Application.Interactive = false设置Application.Interactive = false 。 (很less有一个好主意。)但是,如果你想允许用户使用Excel,那么简单地使其可见就足够了。

总的来说,考虑到这些,我认为你的代码看起来像这样:

 object oOpt = System.Reflection.Missing.Value; //for optional arguments Excel.Application oXL = new Excel.Application(); Excel.Workbooks oWBs = oXL.Workbooks; Excel.Workbook oWB = oWBs.Add(Excel.XlWBATemplate.xlWBATWorksheet); Excel.Worksheet oSheet = (Excel.Worksheet)oWB.ActiveSheet; //outputRows is a List<List<object>> int numberOfRows = outputRows.Count; int numberOfColumns = outputRows.Max(list => list.Count); Excel.Range oRng = oSheet.get_Range("A1", oOpt) .get_Resize(numberOfRows, numberOfColumns); object[,] outputArray = new object[numberOfRows, numberOfColumns]; for (int row = 0; row < numberOfRows; row++) { for (int col = 0; col < outputRows[row].Count; col++) { outputArray[row, col] = outputRows[row][col]; } } oRng.set_Value(oOpt, outputArray); oXL.Visible = true; 

希望这可以帮助…

麦克风

将二维数组传递到Excel要比一次更新一个单元快得多。

使用列表列表中的值创build对象的二维数组,然后将Excel范围重新设置为数组的维数,然后调用range.set_Value传递二维数组。

 List<"classname"> getreport = cs.getcompletionreport(); var getreported = getreport .Select(c => new { demographic = c.rName); 

希望这有助于

其中cs.getcompletionreport()是参考类文件是应用程序的业务层