将数组写入Excel范围

我正在尝试使用以下代码将对象数组中的数据写入Excel中的某个范围,其中objData只是一个string数组:

 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中的第一个项目的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)的行,这是非常耗时的。

这是我的方法摘录,它将DataTable(dtvariables)转换成数组,然后将数组写入工作表(wsh var)中的Range。 您也可以将topRowvariables更改为您希望放置的string数组的任何行。

  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,代码摘录只是为了演示如何在一次调用中将数组写入工作表。

感谢指针家伙 – 价值vs价值2的论点让我有了一套不同的search结果,这帮助我意识到了答案是什么。 顺便说一下,Value属性是一个参数化属性,必须通过C#中的访问器访问。 这些被称为get_Value和set_Value,并采取一个可选的枚举值。 如果任何人有兴趣, 这很好地解释 。

然而,可以通过Value2属性进行赋值,这是因为interop文档build议不要使用get_Value和set_Value方法,这是我理解的原因。

关键似乎是对象数组的维度。 对于调用工作,数组必须声明为二维的,即使您只分配一维数据。

我宣布我的数据数组作为一个object[NumberofRows,1]和分配调用工作。

你可以把你的数据放入一个logging集,并使用Excel的CopyFromRecordset方法 – 它比填充单元格要快得多。

您可以使用此代码从数据集创buildlogging集。 你将不得不做一些试验,看看使用这种方法是否比你现在正在做的更快。

出于某种原因,转换为二维数组不适合我。 但是,下面的方法做到了:

 public void SetRow(Range range, string[] data) { range.get_Resize(1, data.Length).Value2 = data; } 

数组定义的types似乎是关键:在我的情况下,它是一个17维项目的一维数组,必须转换为二维数组

定义列:object [,] Array = new object [17,1];

定义行对象[,] Array = new object [1,17];

value2的代码在两种情况下都是相同的Excel.Range cell = activeWorksheet.get_Range(Range); cell.Value2 = Array;

LG格奥尔格

在我的情况下,程序查询返回DataGridView的数据库。 然后我把它复制到一个数组。 我得到刚刚创build的数组的大小,然后将数组写入Excel电子表格。 该代码在大约两秒内输出5000行数据。

 //private System.Windows.Forms.DataGridView dgvResults; dgvResults.DataSource = DB.getReport(); Microsoft.Office.Interop.Excel.Application oXL; Microsoft.Office.Interop.Excel._Workbook oWB; Microsoft.Office.Interop.Excel._Worksheet oSheet; try { //Start Excel and get Application object. oXL = new Microsoft.Office.Interop.Excel.Application(); oXL.Visible = true; oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add("")); oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet; var dgArray = new object[dgvResults.RowCount, dgvResults.ColumnCount+1]; foreach (DataGridViewRow i in dgvResults.Rows) { if (i.IsNewRow) continue; foreach (DataGridViewCell j in i.Cells) { dgArray[j.RowIndex, j.ColumnIndex] = j.Value.ToString(); } } Microsoft.Office.Interop.Excel.Range chartRange; int rowCount = dgArray.GetLength(0); int columnCount = dgArray.GetLength(1); chartRange = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[2, 1]; //I have header info on row 1, so start row 2 chartRange = chartRange.get_Resize(rowCount, columnCount); chartRange.set_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType.xlRangeValueDefault, dgArray); oXL.Visible = false; oXL.UserControl = false; string outputFile = "Output_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx"; oWB.SaveAs("c:\\temp\\"+outputFile, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); oWB.Close(); } catch (Exception ex) { //... } 

当你想在Excel工作表中编写一维数组时, 你必须对它进行转置,不必像上面一样读取1列([n,1])的二维数组 。 这是一个代码示例:

  wSheet.Cells(RowIndex, colIndex).Resize(RowsCount, ).Value = _excel.Application.transpose(My1DArray) 

吉尔,祝你有美好的一天