我正在尝试将数据从 DataSet 传输到 Excel 工作簿中。不幸的是,我需要更多的控制,而不仅仅是通过 ADO.NET 链接到 Excel 并使用标准 SQL 来选择和插入数据,因此我使用 Excel 互操作。
我最初的算法涉及循环遍历数据集的所有表/行/项目,并单独设置 Excel 中每个单元格的公式
。这可行,但传输所有数据需要将近半分钟。
我决定尝试不同的解决方案:将每个表转换为制表符分隔的字符串(使用 StringBuilder
和 string.Join()
的组合,将字符串复制到剪贴板,并使用互操作在 Excel Worksheet
对象上调用“粘贴”命令,
这也可以,并且将时间缩短了 50% 以上,但我对使用剪贴板进行传输有点偏执。如果用户在传输过程中开始执行涉及剪贴板的其他操作,会发生什么情况?我还想知道如果我可以直接粘贴字符串而不是使用剪贴板作为中介,是否会更快
。我的问题...是否有一些命令可以让我直接从 C# 字符串在 Excel 中“粘贴”数据块,而无需使用剪贴板?
I'm trying to transfer data from a DataSet into an Excel workbook. Unfortunately, I need more control than I can get by simply linking to Excel via ADO.NET and using standard SQL to select and insert the data, so I'm using excel interop.
My original algorithm involved looping through all the tables/rows/items of the data set and individually setting the Formula
of each cell in Excel. This worked, but it was taking nearly half a minute to transfer all the data.
I decided to try a different solution: convert each table to a tab-delimited string (using a combination of StringBuilder
and string.Join()
, copying the string to the clipboard, and using interop to call the Paste command on the Excel Worksheet
object.
This also works and cuts the time by a little more than 50%, but I'm a little paranoid about using the clipboard to transfer data. What happens if the user starts doing other things involving the clipboard while the transfer is occurring? I also wonder if it might be even faster if I could paste a string directly rather than having to use the clipboard as an intermediary.
So, that's my question...is there some command available that would allow me to "paste" a block of data at once in Excel directly from a C# string, without without having to use the clipboard?
发布评论
评论(4)
创建一个与目标范围具有相同维度的二维对象数组(第一个数组索引是行数;第二个是列数)。然后使用该数组设置范围的 value 属性。
例子:
Create a 2-dimensional object array with the same dimensions as your target range (the first array index is the row count; the second is the column count). Then set the range's value property with that array.
Example:
您可以使用 HttpResponse 对象及其 write() 方法将字符串刷新到 Excel 中。首先创建一个 Excel 模板字符串。请参考这个例子。
You can use HttpResponse object and its write() method to flush the string into excel. Create an excel template string first. Refer to this example.
你能不能只创建一个 CSV 字符串,并使用:
Can you not just create a CSV string, and use:
我建议在 VB.NET 中创建一个支持可选参数(更简洁的代码)的库,然后从 C# 调用它。与其他答案一样,这一切都取决于
Range.Value2
调用。这是 VB.NET 中的一些示例代码
检查计数的原因是因为对于单个引用
.Value2
返回一个值,而不是可以转换为object[,] 的数组
,您实际上可以使用 object[,] 数组转换回
double[,]
数组.com/q/5083565/380384">此处发布了使用Array.Copy()
的技巧。I recommend creating a library in VB.NET which supports optional parameters (cleaner code), and then call it from C#. Like the other answers it all depends on the
Range.Value2
calls.here is some sample code in VB.NET
The reason for checking the count, is because for a singular reference
.Value2
returns a value and not an array that can be cast toobject[,]
,You can actually convert the
object[,]
array back and from adouble[,]
array using a trick posted here withArray.Copy()
.