将一个 C# 的 List of Lists 导出到 Excel
将一个 C# 的 List of Lists 导出到 Excel
在使用C#时,是否有一种直接将一个List of Lists(即List
)导出到Excel 2003的方法?>
我正在解析大型文本文件并导出到Excel。逐个写入单元格会产生过多的开销。我选择使用List
,这样我就不必担心指定行数或列数。
目前,我等待文件结束,然后将List
的内容放入一个二维数组中。然后数组可以设置为Excel.Range对象的值。这样可以工作,但我觉得我应该能够将我的List of Lists放入工作表中,而不必担心行数或列数,从A1到任何位置。>
下面是我想要替换或改进的代码片段:
object oOpt = System.Reflection.Missing.Value; //为可选参数 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是一个List> foreach (List
这种方法可以工作,但我宁愿直接将List直接用于Excel,而不是为了Excel而创建一个中间步骤的数组。有什么想法吗?
问题的原因:Excel是基于COM的,通过.NET interop与Excel进行交互。不幸的是,interop不支持泛型,所以无法传递List
解决方法:
1. 使用LINQ来简化代码。可以使用outputRows.Max(list => list.Count)来代替foreach循环语句。
2. 不要使用_Worksheet或_Workbook接口,而是使用Worksheet或Workbook接口。
3. 可以考虑使用Range.Resize方法来设置范围的大小,这是一种选择。例如,可以使用oSheet.get_Range("A1", Type.Missing).get_Resize(numberOfRows, numberOfColumns)来替代oSheet.get_Range("A1", oSheet.Cells[numberOfRows,numberOfColumns])。
4. 不需要设置Application.UserControl为true,只需要将Excel设置为可见即可。如果想要控制用户是否可以控制Excel,可以使用工作表保护,或者使用Application.Interactive = false来锁定用户。
最终的代码如下:
object oOpt = System.Reflection.Missing.Value; 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 = 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;
希望对你有所帮助。
原因:上述代码中的`getreport`是一个C#的List of Lists,我们需要将这个数据导出到Excel中进行进一步处理和分析。
解决方法:使用Excel的相关库和功能将C#的List of Lists导出到Excel。
代码示例:
using OfficeOpenXml; using System.IO; // 创建一个Excel文档 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage()) { // 在Excel文档中添加一个工作表 var worksheet = package.Workbook.Worksheets.Add("Sheet1"); int row = 1; foreach (var sublist in getreport) { int column = 1; foreach (var item in sublist) { // 将数据写入Excel中的单元格 worksheet.Cells[row, column].Value = item; column++; } row++; } // 保存Excel文档 var stream = new MemoryStream(package.GetAsByteArray()); using (var fileStream = new FileStream("output.xlsx", FileMode.Create, FileAccess.Write)) { stream.WriteTo(fileStream); } }
上述代码中,我们使用了`OfficeOpenXml`库来处理Excel文件。首先,我们创建一个Excel文档,并添加一个工作表。然后,通过两层循环遍历C#的List of Lists,将数据逐个写入Excel的单元格中。最后,将Excel文档保存到输出文件中。
这样,我们就成功将C#的List of Lists导出到了Excel中,方便后续的处理和分析。