Йоксель » Главный форум

Вывод больших таблиц в EXCEL

(2 posts)
  1. При выводе в excel таблицы, которая умещается на одном листе, проблем нет. Но если таблица содержит больше 65536 строк, то выводятся только 65536 строк, остальные обрезаются. (MS EXCEL 2003). Я решил сам разбить таблицу на части и вывести ее на нескольких листах по частям. Но, поскольку я использую один табличный документ, в результате у меня получается на всех листах одинаковая информация, точнее последий лист. (При формировании следующего листа, его содержимое сохраняется и во всех предыдущих листах) Я написал обработку, в которую в качестве параметра передается таблица для вывода в excel. В обработке для проверки я установил вывод 100 строк таблицы на один лист. Текст процедуры приведен ниже. Что нужно сделать, чтобы на каждом листе выводилась своя информация? Что я сделал не так? Спасибо.

    Процедура Выполнить()
    Таб=Форма.Параметр;
    Конвертер = СоздатьОбъект ("КонвертерExcel");
    гКнига = Конвертер.Создать ();
    Параметры=гКнига.ПараметрыКонвертера;
    Параметры.РаспознаватьЧисловыеЗначения = 1;
    Параметры.ЧислаВыравненыПоПравомуКраю = 1;
    ТД = СоздатьОбъект ("ТабличныйДокумент");
    ТД.ЗагрузитьИзТаблицы(Таб);
    КолС=ТД.ВысотаТаблицы(); //Общее количество строк в таблице
    гКнига.Листы.Очистить();
    Если КолС<=100 Тогда // Если умещается на одном листе
    гКнига.Листы.Добавить("Лист 1",ТД);
    гКнига.Записать(ИмяФайла);
    Иначе
    НачС=1; // начальный
    КонС=100; // и конечный номера строк диапазона для вывода
    НомЛ=1; // Номер текущего листа книги
    Пока 1=1 Цикл
    Если КонС<КолС Тогда
    ТД.УдалитьСтроки(КонС+1,КолС-КонС); //Удаляем ненужные строки в конце
    КонецЕсли;
    Если НачС>1 Тогда
    ТД.УдалитьСтроки(1,НачС-1); //Удаляем ненужные строки в начале
    КонецЕсли;
    ИмяЛ="Лист "+СокрЛП(Строка(НомЛ));

    гКнига.Листы.Добавить(ИмяЛ,ТД); //Добавляется лист с текущим содержимым ТД

    Номл=НомЛ+1;
    Если КонС<КолС Тогда //Еще есть строки для вывода
    ТД.Очистить();
    ТД.ЗагрузитьИзТаблицы(Таб);//Снова загружаем всю таблицу
    НачС=КонС+1; //Изменяем диапазон вывода строк для следующего листа
    КонС=КонС+100;
    Если КонС>КолС Тогда
    КонС=КолС; //Если будет последний лист
    КонецЕсли;
    Иначе //Больше строк нет
    Прервать;
    КонецЕсли;
    КонецЦикла;
    гКнига.Записать(ИмяФайла);
    КонецЕсли;
    КонецПроцедуры

    Отправлено 16 года(лет) назад #
  2. Правильно, в качестве каждого листа добавляется ссылка на один и тот же табличный документ. Сам документ записывается в момент записи книги Excel. Поэтому все модификации документа будут учтены даже после добавления документа в качестве листа книги.

    Если все же хочется провернуть такой трюк с удалением строк, то в качестве каждого листа нужно добавлять НОВЫЙ табличный документ. Наиболее тупой алгоритм: из Мокселя загружаем документ в Йоксель, удаляем все ненужное, потом повторяем для второго листа и т.д. Но это наверняка очень медленно - документ будет загружаться столько раз, сколько нужно листов.

    Другой вариант: загружаем документ из Мокселя и записываем во временный файл, удаляем последние строки и добавляем документ как первый лист. Потом загружаем временный файл и удаляем первые ненужные строки. Если все равно количество строк больше максимального полученный документ опять записываем во временный файл, а из документа удаляем последние строки и добавляем документ как второй лист. И т.д. Все равно небыстро будет но, наверное, лучше, чем первый вариант - для каждого листа загружается все меньше и меньше данных.

    По хорошему, конечно, надо бы добавить в Йоксель возможность разбивать документ на несколько листов. Это даже в плане есть, но все никак руки не дойдут.

    Отправлено 16 года(лет) назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.