拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 C#将List粘贴到Excel列中而无需回圈

C#将List粘贴到Excel列中而无需回圈
白鹭 - 2022-01-25 1950 0 0

我有一些从应用程序运行中收集问题的代码,我想创建一个关于问题的报告。不幸的是,使用Intertop使这个汇出长期运行。

        //loop results
        int i = 2;
        foreach (EntryIssue entryIssue in DuplicatesList)
        {
            xlWorkSheet.Cells[i, 1] = entryIssue.dataString;
            xlWorkSheet.Cells[i, 2] = entryIssue.fileLine;
            xlWorkSheet.Cells[i, 3] = entryIssue.fileName;
            i  ;
        }

还创建了另外三个作业表和三个其他串列,用代码填充它们,但它们的作业方式相似。

有没有办法避免串列迭代并将结果粘贴到特定范围内?我认为这可以节省一些时间,还是应该使用其他库而不是Intertop?

编辑:

好的,我找到了一个解决方案,尽管它似乎只适用于 2D 阵列,但 1D 阵列似乎存在问题,因为它仅根据阵列中的第一条记录分配记录。我不知道如何解决这个问题。

我最初的想法是粘贴 Linq

一维阵列(不起作用):

  xlRange = xlWorkSheet.get_Range((object)xlWorkSheet.Cells[2, 1], (object)xlWorkSheet.Cells[DuplicatesList.Count   1, 1]);
            var getArray = DuplicatesList.Select(r => r.dataString).ToArray();
            xlRange.Value = getArray;
            xlRange = xlWorkSheet.get_Range((object)xlWorkSheet.Cells[2, 2], (object)xlWorkSheet.Cells[DuplicatesList.Count   1, 2]);
            getArray = DuplicatesList.Select(r => r.fileLine).ToArray();
            xlRange.Value = getArray;
            xlRange = xlWorkSheet.get_Range((object)xlWorkSheet.Cells[2, 3], (object)xlWorkSheet.Cells[DuplicatesList.Count   1, 3]);
            getArray = DuplicatesList.Select(r => r.fileName).ToArray();
            xlRange.Value = getArray;

然后我决定将串列元素迭代到阵列中,因为我不知道您是否可以从物件串列分配到多维阵列。在包含 22 万个项目的档案中,它从 10 分钟以上缩短到大约 2-3 秒。

二维阵列(有效)

        //set range
        xlRange = xlWorkSheet.get_Range((object)xlWorkSheet.Cells[2, 1], (object)xlWorkSheet.Cells[DuplicatesList.Count   1, 3]);
        //fill array 
        int i = 0;
        object[,] getArray = new object[DuplicatesList.Count, 3];
        foreach (EntryIssue entryIssue in DuplicatesList)
        {
            getArray[i, 0] = entryIssue.dataString;
            getArray[i, 1] = entryIssue.fileLine;
            getArray[i, 2] = entryIssue.fileName;
            i  ;
        }
        //assign array to range
        xlRange.Value = getArray;

稍后我清理马歇尔

    ips.Marshal.ReleaseComObject(xlRange);
    ips.Marshal.ReleaseComObject(xlWorkSheet);
    ips.Marshal.ReleaseComObject(xlWorkBook);
    ips.Marshal.ReleaseComObject(xlApp);

uj5u.com热心网友回复:

Nuget 的 Epplus 将是一个简单的解决方案。IE:

void Main()
{

    var r = new Random();
    var data = new List<MyData>();
    for (int i = 0; i < 100000; i  )
    {
        data.Add(new MyData { DataString = $"Data {i}", FileLine = r.Next(1, 1000), FileName = $"File #{i}" });
    }

    Stopwatch sw = new Stopwatch();
    sw.Start();
    ExcelPackage pck = new ExcelPackage();
    var ws = pck.Workbook.Worksheets.Add("FromAnonymous");

    //Load the collection starting from cell A1...
    ws.Cells["A1"].LoadFromCollection(data, true, TableStyles.Medium9);
    ws.Cells[ws.Dimension.Address].AutoFitColumns();

    //...and save
    var fi = new FileInfo(@"c:\temp\AnonymousCollection.xlsx");
    if (fi.Exists)
    {
        fi.Delete();
    }
    pck.SaveAs(fi);
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

public class MyData
{
    public string DataString { get; set; }
    public int FileLine { get; set; }
    public string FileName { get; set; }
}
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *