我有一些从应用程序运行中收集问题的代码,我想创建一个关于问题的报告。不幸的是,使用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; }
}