将一个 C# 的 List of Lists 导出到 Excel

14 浏览
0 Comments

将一个 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 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;

这种方法可以工作,但我宁愿直接将List直接用于Excel,而不是为了Excel而创建一个中间步骤的数组。有什么想法吗?

0
0 Comments

问题的出现原因是在将C#的List of Lists导出到Excel时,逐个单元格更新数据的方式速度太慢。解决方法是通过创建一个二维对象数组,并从List of Lists中获取值来填充该数组,然后将Excel的范围调整为数组的尺寸,并调用range.set_Value方法,将二维数组传入。

下面是我目前正在使用的方法;但是如果一开始使用了List而不是数组,可能还有其他方法可以将数据导入Excel,而不需要先加载到一个中间数组中。

0
0 Comments

问题的原因: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;

希望对你有所帮助。

0
0 Comments

原因:上述代码中的`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中,方便后续的处理和分析。

0