Преобразовать зубчатый массив в 2D-массив напрямую, не повторяя каждый элемент?

Я пытаюсь сохранить 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 требуется значение диапазона как array [,] но у меня DataTable как зубчатый массив [] [].

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

Есть ли какая-нибудь встроенная функция для прямого преобразования зазубренного массива [] [] в 2D-массив [] []? Итерации через Excel, DataTable и назначение кажутся медленнее с большими объемами данных.

Также я не хочу настраивать запросы с помощью DSN для excel .. Я выбрал хранилище Excel, чтобы избежать настройки каких-либо баз данных ..: PI нашел здесь подробное объяснение способов записи данных для Excel .. http://support.microsoft.com/kb/306023


person Sen Jacob    schedule 11.07.2012    source источник
comment
social.msdn.microsoft.com/ Форумы / en / netfxbcl / thread / могут помочь   -  person lc.    schedule 11.07.2012
comment
Спасибо за ответ .. у меня разные типы массивов. но позволь мне попробовать :)   -  person Sen Jacob    schedule 11.07.2012
comment
Получено исключение: «Указанные массивы должны иметь одинаковые размеры». Размер зубчатого массива отображается как [80] [], а размер массива отображается как [80,12]. Неровный массив имеет 12 элементов в каждой строке, но все же он не обнаруживается как массивы с такими же размерами.   -  person Sen Jacob    schedule 11.07.2012
comment
Возможно, вам придется перебирать каждую строку и копировать их по отдельности. Или, если вы знаете, что каждая строка в массиве с зазубринами имеет одинаковую длину (что, я думаю, так и есть), вы можете попробовать SelectMany (), чтобы сгладить ее в массив 1D, а затем скопировать это в 2D? Не уверен, что это сработает, хотя   -  person lc.    schedule 11.07.2012


Ответы (1)


Наконец, я использовал для этого библиотеку NPOI. Это довольно просто и бесплатно.

Код для преобразования 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);
            }
        }
person Sen Jacob    schedule 07.02.2013