【发布时间】:2018-11-14 14:26:33
【问题描述】:
我在 datagridview 中有input table(输出显示为绿色),我需要得到这个输出:
'Start of block' 'Size' 'TypKar'
1.2.2017 0:00:02 14 6280
1.2.2017 0:03:33 2 3147
1.2.2017 0:04:17 2 4147
1.2.2017 0:04:28 2 6280
1.2.2017 0:04:59 10 3147
现在我使用for 循环,我在其中写入第一个条目,然后我计数直到TypKar 列中的值发生变化。当它改变时,我写下日期和类型并从 1 开始计数。
for(int i = 0; i < dviewExport.RowCount; i++)
{
//first line in excel
if(totalCount == 0)
{
totalCount = 32;
signCount = 1;
excelWsExport.Cells[totalCount, 2] = (DateTime)dviewExport[0, i].Value;
excelWsExport.Cells[totalCount, 3] = 1;
excelWsExport.Cells[totalCount, 4] = dviewExport["TypKar", i].Value;
continue;
}
//value is same = just increment
if((excelWsExport.Cells[totalCount, 4] as Excel.Range).Value.ToString() == dviewExport["TypKar", i].Value.ToString())
{
excelWsExport.Cells[totalCount, 3] = (excelWsExport.Cells[totalCount, 3] as Excel.Range).Value + 1;
signCount++;
if(maxCount < signCount)
maxCount = signCount;
}
//value changed = write new line and restart incrementing
else
{
totalCount++;
signCount = 1;
excelWsExport.Cells[totalCount, 2] = (DateTime)dviewExport[0, i].Value;
excelWsExport.Cells[totalCount, 3] = 1;
excelWsExport.Cells[totalCount, 4] = dviewExport["TypKar", i].Value;
}
}
问题是,我把它写到 excel 中,当数据有几千行时,它需要很多时间。
是否可以使用 excel interop 加快速度 - 将其写入数组,然后将数组粘贴到 excel / sql / ling 或还有什么?
我试图找到类似的问题并得到一些答案,但我不知道如何描述我的问题。
【问题讨论】:
-
你有没有想过使用
Parallel.For循环,我最近做了类似的事情,并将我的运行时间从 35 分钟减少到 5 分钟 docs.microsoft.com/en-us/dotnet/standard/parallel-programming/…。顺序似乎并不重要,所以这应该适合你 -
这与 Microsoft Access 有什么关系?
-
Excel Interop 只能减慢事物至少一个数量级,因为每个调用都是跨进程调用。如果要生成 Excel 文件,也不需要 DataGridView。您可以使用 EPPlus 之类的库来创建真正的 Excel 文件,而无需使用 Excel。例如,将 DataTable 加载到工作表中就像
sheet.Cells.LoadFromDataTable(dataTable);一样简单 -
@Andrei 这根本没有帮助。您不能像这样从多个客户端/线程访问同一个 Excel 实例
-
我加载到 dgv 的数据来自 Access db 或 SQL Server。另外我必须将它发送到excel,因为之后的下一步工作
标签: c# sql-server linq ms-access excel-interop