一尘不染

将数组写入Excel范围

c#

我目前正在尝试使用以下代码将对象数组中的数据写入Excel中的范围,其中objData仅是字符串数组:

private object m = System.Type.Missing;
object[] objData = getDataIWantToWrite();

Range rn_Temp;
rn_Temp = (Range)XlApp.get_Range(RangeName, m);
rn_Temp = rn_Temp.get_Resize(objData.GetUpperBound(), 1);
rn_Temp.value2 = objData;

这几乎可以正常工作,问题是范围被填充,但是每个单元格都获得的第一项的值objData

反函数,即

private object m = System.Type.Missing;
object[] objData = new object[x,y]

Range rn_Temp;
rn_Temp = (Range)XlApp.get_Range(RangeName, m);
rn_Temp = rn_Temp.get_Resize(objData.GetUpperBound(), 1);
objData = (object[])rn_Temp.value2;

会返回一个包含工作表中所有值的数组,所以我不确定为什么读取和分配的工作方式不同。

有没有人成功做到这一点?我目前正在逐个单元地编写数组,但是它需要处理很多(> 50,000)行,因此非常耗时。


阅读 531

收藏
2020-05-19

共1个答案

一尘不染

这是我的方法的摘录,该方法将DataTabledt变量)转换为数组,然后将该数组写入Range工作表(wshvar)中。您还可以将topRow变量更改为要放置字符串数组的任何行。

object[,] arr = new object[dt.Rows.Count, dt.Columns.Count];
for (int r = 0; r < dt.Rows.Count; r++)
{
    DataRow dr = dt.Rows[r];
    for (int c = 0; c < dt.Columns.Count; c++)
    {
        arr[r, c] = dr[c];
    }
}
Excel.Range c1 = (Excel.Range)wsh.Cells[topRow, 1];
Excel.Range c2 = (Excel.Range)wsh.Cells[topRow + dt.Rows.Count - 1, dt.Columns.Count];
Excel.Range range = wsh.get_Range(c1, c2);
range.Value = arr;

当然,您不需要DataTable像我一样使用中间体,代码摘录只是演示如何在单个调用中将数组写入工作表。

2020-05-19