Выгрузка таблицы значений в Excel
Примитивно, грубо, без дизайна, но очень быстро.
- Описание
- Подробнее
Описание
Честно говоря, это не столько публикация, сколько антисклерозник для меня самого. Вот как Трактор делает — собрал свои наработки, укомпоновал и выложил, удобно отовсюду доставать. А поскольку я этот блок свой уже пару раз про…любил и заново написал, то во избежание — пусть будет таким образом. Как говорится, «в копипасте — щастье».
// Внимание! Исходная таблица тДанных должна содержать только данные простых типов!!!
Процедура БыстроВывестиТаблицуЗначенийВExcel(тДанных,рПутьИмяФайла,рОткрыватьДляПросмотра=Ложь) Экспорт
Попытка
Если тДанных.Количество()=0 Или ПустаяСтрока(рПутьИмяФайла) Тогда Возврат КонецЕсли;
// если таблица для экселя спецслужебная, то выводим в двумерный массив, и теперь уже знаем его размеры
квоКолонокДЭ=тДанных.Колонки.Количество();
квоСтрокДЭ=тДанных.Количество()+1; // припуск на заголовок
РезДокумент=Новый Массив(квоКолонокДЭ,квоСтрокДЭ);
// заголовки
мКолонокДат=Новый Массив;
Для итерКолонок=1 По квоКолонокДЭ Цикл
кол=тДанных.Колонки[итерКолонок—1];
РезДокумент[итерКолонок—1][0]=кол.Заголовок;
Если кол.ТипЗначения.СодержитТип(Тип(«Дата»)) Тогда мКолонокДат.Добавить(кол.Имя) КонецЕсли;
КонецЦикла;
// основные данные
квоиз=» из «+СокрЛП(квоСтрокДЭ—1);
Для й=0 По квоСтрокДЭ—2 Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
Состояние(«Вывод в Excel: «+Строка(й+1)+квоиз);
#КонецЕсли
стро=тДанных.Получить(й);
Для итерКолонок=1 По квоКолонокДЭ Цикл
знч=стро[итерКолонок—1];
Если мКолонокДат.Найти(тДанных.Колонки[итерКолонок—1])<>Неопределено Тогда
// выгрузка в эксель через COMSafeArray не понимает совсем пустые даты, поэтому надо это учесть!!!
знч=?(ЗначениеЗаполнено(знч),знч,Дата(1900,1,1));
КонецЕсли;
РезДокумент[итерКолонок—1][й+1]=знч;
КонецЦикла;
КонецЦикла;
// сохраняем все в произвольный тип, подробнее см. типизацию в описании конструктора «По типу элемента 1»
рТипМассива=«VT_VARIANT»;
рМассив=Новый COMSafeArray(РезДокумент,рТипМассива,квоКолонокДЭ,квоСтрокДЭ);
Ексель=Новый COMОбъект(«Excel.Application»);
Книга=Ексель.Workbooks.Add();
Если Книга.WorkSheets.Count=0 Тогда
Лист=Книга.WorkSheets.Add();
Иначе
Лист=Книга.WorkSheets.Item(1); // нумерация с 1
КонецЕсли;
// самое главное: диапазону ячеек можно просто присвоить SafeArray со значениями
рНачало=Лист.Cells(1,1);
рКонец=Лист.Cells(квоСтрокДЭ,квоКолонокДЭ);
Лист.Range(рНачало,рКонец).Value=рМассив;
//
// соответствие форматов: xlOpenXMLWorkbook=51 это xlsx, xlExcel12=50 это xlsb, xlExcel8=56 это xls
стрпф=Новый Структура(«xls,xslx,xlsb»,56,51,50);
рФайл=Новый Файл(СокрЛП(рПутьИмяФайла));
расш=СтрЗаменить(рФайл.Расширение,«.»,«»);
рФормат=?(стрпф.Свойство(расш),стрпф[расш],51); // по умолчанию xlsx
Книга.SaveAs(СокрЛП(рПутьИмяФайла),рФормат);
Если рОткрыватьДляПросмотра Тогда
#Если Клиент Тогда
Ексель.Visible=Истина;
#КонецЕсли
КонецЕсли;
//
Ексель=Null;
Исключение
Сообщить(«БыстроВывестиТаблицуЗначенийВExcel, ошибка: «+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецПроцедуры
Желающим плюсить — сюда: //sale.itcity.ru/public/269846/
Ну а первоисточник, который применял я, здесь: http://kb.mista.ru/article.php?id=707
Поскольку моё тут только конкретное воплощение, публикацию особо плюсить не стоит, и вообще она life.

