powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Array to Excel
18 сообщений из 18, страница 1 из 1
C# Array to Excel
    #39781977
Фотография vah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите пожалуйста,
возможно ли данные из DataTable писать в Excel не в цикле, а записать сразу целиком массив, указав левую верхнюю и правую нижнюю границу?

Заранее благодарен.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39781986
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом ты взаимодействуешь с документом Эксель?
Если через Interop - по идее можешь тупо в Range вставить массив.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782171
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vah,
чем цикл не устраивает?
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782232
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vah,

​Сериализуй таблицу в формате ехцел-документа.
Сам - не делал, обхожусь писанием заголовков и дампом ЦСВ.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782265
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Range.Value = array, и нет вопросов.
Главное, чтобы размеры Range и array совпадали.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782266
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subvah,
чем цикл не устраивает?тормозами
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782280
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лень проверять, но...

Если поставить макрос на запись, выделить таблицу, вырезать, а потом также куда-то вставить, то не получим код, нужный ТС?

Вроде все уже должны знать, что следует использовать Range и если что не понятно, то записывай макрос и смотри.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782290
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAто не получим код, нужный ТС?Нет. Получим код, который портит буфер обмена. ТС не это нужно
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782295
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ado recordset копируется в excel - CopyFromRecordset

datatable в adodb recordset перегнать ессно нужно
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782316
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProskyANAто не получим код, нужный ТС?Нет. Получим код, который портит буфер обмена. ТС не это нужно
То есть код вставки не получим, точно?
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782319
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, фиг с ним, stackoverflow:
https://stackoverflow.com/questions/536636/write-array-to-excel-range

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        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;

dt - это DataTable

По ссылке и про CopyFromRecordset есть.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782397
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAТо есть код вставки не получим, точно?мы получим код вставки Range из буфера обмена. Код вставки массива из памяти мы не получим - это разные операции. Массив можно вставить напрямую, тащить его в буфер обмена совсем не требуется.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782432
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

тормозами
-----
​Тормоза на экстрагировании данных из таблицы или тормоза на вставке в Ехцел?
Думаю - Ехцел - там медленные олешные вызовы.

Попробуй исключить навигацию по колонкам - у DataRow есть ItemArray - обычно этого достаточно для повышения производительности.


В примере приведенном skyANA ​ можно исключить второй цикл и вставлять построчно.
Плюс, итератор по строкам должен быть быстрее индексатора по целому - там не массив, а дерево.


Есть еще один хитро выпернытый способ.
В ВБА таблица представляется как полностью плоская. Т.е. доступно dt[i,k].
В этом случае не нужно писать свои циклы, а можно задать Range() и присвоить range.Value = dt;
Какие именно библиотеки надо цеплять - не помню, но в басиковских аппах можно поискать.


Да, кстати, а почему бы просто не унаследоваться от DataTable и не написать свой двумерный indexer?
Для ехцеловского импортера его должно хватить...
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782445
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCatДумаю - Ехцел - там медленные олешные вызовы.
именно поэтому нужно не циклы крутить, а вставку одним вызовом делать
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782450
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCatтам медленные олешные вызовы.сам по себе Ole server имеет насколько помню вставку пачкой.
Какой тип не помню, но вроде было а API.
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782458
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В цикле сильно быстрее, если отменить автопересчет книги и еще немного всего (по материалам хабра, код VBA). Потом все вернуть на место
Код: vbnet
1.
2.
3.
4.
5.
6.
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782471
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,


именно поэтому нужно не циклы крутить, а вставку одним вызовом делать
-----
Вставку одним вызовом можно делать по-разному.
Все, что требуется в данном случае - дать Ехцелу что-то работающее как двумерный массив...
В смысле - не обязательно формировать сам массив...
...
Рейтинг: 0 / 0
C# Array to Excel
    #39782491
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЛадно, фиг с ним, stackoverflow:
https://stackoverflow.com/questions/536636/write-array-to-excel-range

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        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;



Да, пока не забыл...
Как-то натолкнулся у мелкомягких в их коде на конструкцию с запоминанием DataColumn.
Сначала не понял зачем такие сложности, потом потестил на предмет времени доступа.
Индексация DataRow посредством DataColumn оказалась самой быстрой.


Так что пример правильнее писать как:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
       
        object[,] arr = new object[dt.Rows.Count, dt.Columns.Count];
        int r = 0, c = 0;
        foreach (DataRow dr in dt.Rows)
        {
            c = 0;
            foreach (DataColumn dc in dt.Columns)
            {
                arr[r, c++] = dr[dc];
            }
            ++r;
        }



Можно так же вспомнить, что двумерные массивы в шарпе двух типов и - [,] - является одной сплошной областью и избавится от одного индекса - ехцелу должно быть без разницы. Но тестить надо...
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Array to Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]