【问题标题】:Convert a jagged array to a 2D array directly without iterating each item?直接将锯齿状数组转换为二维数组而不迭代每个项目?
【发布时间】:2026-01-13 19:40:01
【问题描述】:

我正在尝试将 DataTable 保存到 Excel 工作表中。我的代码是这样的。

Excel.Range range = xlWorkSheet.get_Range("A2");
range = range.get_Resize(dtExcel.Rows.Count, dtExcel.Columns.Count);
object[,] rng1 = new object[dtExcel.Rows.Count, dtExcel.Columns.Count];

Excel 范围需要范围值作为数组 [,],但我将 DataTable 设置为锯齿状数组 [][]。

object[][] rng2 = dtExcel.AsEnumerable().Select(x => x.ItemArray).ToArray();

是否有任何内置函数可以将锯齿状数组[][] 直接转换为二维数组[][] ? 对于批量数据,遍历 Excel、DataTable 和分配似乎更慢..

我也不想为 excel 设置 DSN 查询。我选择了 excel 存储以避免配置任何数据库。:P 我在这里找到了有关将数据写入excel的方法的详细说明.. http://support.microsoft.com/kb/306023

【问题讨论】:

  • 感谢您的回复。在我的情况下,数组类型不同。但让我试试:)
  • 出现异常,提示“指定的数组必须具有相同的维度。”锯齿状数组大小显示为 [80][],数组大小显示为 [80,12]。锯齿状数组每行有 12 个项目,但它仍然没有检测为具有相同维度的数组。
  • 您可能必须遍历每一行并单独复制它们。或者,如果您知道锯齿状数组中的每一行长度相同(我认为您这样做),您可以尝试使用 SelectMany() 将其展平为一维数组,然后将其复制到二维数组?不确定它是否会起作用

标签: c# multidimensional-array type-conversion export-to-excel jagged-arrays


【解决方案1】:

最后我为此使用了NPOI library。它非常简单且免费。

DataTable转excel的代码如下。

HSSFWorkbook hssfworkbook = new HSSFWorkbook();
        foreach (DataTable dt in DataSource.Tables)
        {
            ISheet sheet1 = hssfworkbook.CreateSheet(dt.TableName);

            //Set column titles
            IRow headRow = sheet1.CreateRow(0); 
            for (int colNum = 0; colNum < dt.Columns.Count; colNum++)
            {
                ICell cell = headRow.CreateCell(colNum);
                cell.SetCellValue(dt.Columns[colNum].ColumnName);
            }

            //Set values in cells
            for (int rowNum = 1; rowNum <= dt.Rows.Count; rowNum++)
            {
                IRow row = sheet1.CreateRow(rowNum);
                for (int colNum = 0; colNum < dt.Columns.Count; colNum++)
                {
                    ICell cell = row.CreateCell(colNum);
                    cell.SetCellValue(dt.Rows[rowNum - 1][colNum].ToString());
                }
            }

            // Resize column width to show all data
            for (int colNum = 0; colNum < dt.Columns.Count; colNum++)
            {
                sheet1.AutoSizeColumn(colNum);
            }
        }

【讨论】: