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

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

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

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

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

datatable в adodb recordset перегнать ессно нужно
...
Рейтинг: 0 / 0
05.03.2019, 07:43
    #39782316
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
Shocker.ProskyANAто не получим код, нужный ТС?Нет. Получим код, который портит буфер обмена. ТС не это нужно
То есть код вставки не получим, точно?
...
Рейтинг: 0 / 0
05.03.2019, 07:50
    #39782319
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
Ладно, фиг с ним, 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
05.03.2019, 11:22
    #39782397
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
skyANAТо есть код вставки не получим, точно?мы получим код вставки Range из буфера обмена. Код вставки массива из памяти мы не получим - это разные операции. Массив можно вставить напрямую, тащить его в буфер обмена совсем не требуется.
...
Рейтинг: 0 / 0
05.03.2019, 12:32
    #39782432
PinkCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
Antonariy,

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

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


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


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


Да, кстати, а почему бы просто не унаследоваться от DataTable и не написать свой двумерный indexer?
Для ехцеловского импортера его должно хватить...
...
Рейтинг: 0 / 0
05.03.2019, 12:40
    #39782445
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
PinkCatДумаю - Ехцел - там медленные олешные вызовы.
именно поэтому нужно не циклы крутить, а вставку одним вызовом делать
...
Рейтинг: 0 / 0
05.03.2019, 12:47
    #39782450
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
PinkCatтам медленные олешные вызовы.сам по себе Ole server имеет насколько помню вставку пачкой.
Какой тип не помню, но вроде было а API.
...
Рейтинг: 0 / 0
05.03.2019, 12:55
    #39782458
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
В цикле сильно быстрее, если отменить автопересчет книги и еще немного всего (по материалам хабра, код 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
05.03.2019, 13:18
    #39782471
PinkCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
Изопропил,


именно поэтому нужно не циклы крутить, а вставку одним вызовом делать
-----
Вставку одним вызовом можно делать по-разному.
Все, что требуется в данном случае - дать Ехцелу что-то работающее как двумерный массив...
В смысле - не обязательно формировать сам массив...
...
Рейтинг: 0 / 0
05.03.2019, 13:54
    #39782491
PinkCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# Array to Excel
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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Array to Excel / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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