Автор cobra77777, 23 июн 2014, 19:27
0 Пользователей и 1 гость просматривают эту тему.
Здравствуйте!
Как выгрузить таблицу значений в excel ?
самое простое создайте табличный документ, туда выведите свою таблицу значений, и этот табличный документ сохраните как файл Ексель.
если помогло нажмите: Спасибо!
Вывести таблицу значений в excel можно через преобразование ее к табличному документу. Сделать это быстро можно через построитель отчета. Примерно так:
ТабДок = Новый ТабличныйДокумент;
Построитель = Новый ПостроительОтчета();
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТестоваяТаблица);
Построитель.ВыводитьЗаголовокОтчета = Ложь;
Построитель.Вывести(ТабДок );
ИмяФайла = "C:UsersAbisSoftDesktoptest.xls";
ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLS97);
ЗапуститьПриложение(ИмяФайла);
Недостаток в том, что работает только в толстом клиенте.
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
сделал через таблицу значений (ТЗ) выгрузку в excel, но выгружается только ОТЧЕСТВО (Результат.xls и КОД прикреплён). Где подправить?
i = 1;
Для Каждого Стр из ТЗ Цикл
Лист.Cells (i,1).Value = Стр.СтраховойНомер;
Лист.Cells (i,2).Value = Стр.Фамилия;
Лист.Cells (i,3).Value = Стр.Имя;
Лист.Cells (i,4).Value = Стр.Отчество;
КонецЦикла;
Для размышления тебе…
i = 1;
Для Каждого Стр из ТЗ Цикл
i = i + 1;
Лист.Cells (i,1).Value = Стр.СтраховойНомер;
Лист.Cells (i,2).Value = Стр.Фамилия;
Лист.Cells (i,3).Value = Стр.Имя;
Лист.Cells (i,4).Value = Стр.Отчество;
КонецЦикла;
Добавлено: 29 июн 2014, 03:39
(Только не спрашивай почему вывод у тебя получается лесенкой = )) )
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Да спасибо. Всё выгрузилось только в ШАХМАТНОМ ПОРЯДКЕ (см.Результат.xls), а как сделать в нормальном варианте (см.внизу) ?
Страховой номер Фамилия Иия Отчество
111-222-333 44 Иванов Иван Иванович
и т.д.
Добавлено: 30 июн 2014, 09:03
Куда копать может кто подскажет ?
Нет, не спросил, почему лесенкой… спросил, почему в ШАХМАТНОМ ПОРЯДКЕ 

Народная мудрость: Программу встречают по интерфейсу
Тема уже совсем не актуальна.
+2
1С 8.x : Как выгрузить Таблицу значение в файл Excel?
Процедура СохранитьТаблицуВФайлExcel(Таблица, ПолноеИмяФайла="", ОткрыватьДиалогВыбораФайла=Истина, ВыгружаемыеКолонки="") Экспорт
Если ПустаяСтрока(ПолноеИмяФайла) ИЛИ ОткрыватьДиалогВыбораФайла Тогда
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранение документа Excel";
Диалог.Фильтр = "Документ Excel (*.xls)|*.xls";
Диалог.Расширение = "xls";
Диалог.ПолноеИмяФайла = ПолноеИмяФайла;
Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойКаталогФайлов");
Если (Диалог.Выбрать()) И (НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла)) Тогда
ПолноеИмяФайла = Диалог.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
ФайлНаДиске = Новый Файл(ПолноеИмяФайла);
Попытка
// Загрузка Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Книга = ExcelПриложение.WorkBooks.Add();
Лист = Книга.WorkSheets(1);
Исключение
Сообщить("Ошибка при загрузке Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
Если ПустаяСтрока(ВыгружаемыеКолонки) Тогда
ТаблицаВыгрузки = Таблица.Скопировать();
Иначе
ТаблицаВыгрузки = Таблица.Скопировать(, ВыгружаемыеКолонки);
КонецЕсли;
Для Кол = 0 По ТаблицаВыгрузки.Колонки.Количество()-1 Цикл
Лист.Cells(1, Кол + 1).Value = ТаблицаВыгрузки.Колонки[Кол].Заголовок;
КонецЦикла;
Попытка
Для Стр = 0 По ТаблицаВыгрузки.Количество()-1 Цикл
Для Кол = 0 По ТаблицаВыгрузки.Колонки.Количество()-1 Цикл
Если ТипЗнч(ТаблицаВыгрузки[Стр][Кол]) = Тип("Число") Тогда
// Установним формат для типа Число
//Лист.Cells(Стр + 2, Кол + 1).NumberFormat = "0,00";
Лист.Cells(Стр + 2, Кол + 1).Value = ТаблицаВыгрузки[Стр][Кол];
Иначе
// Для всех других типов установим формат "Текстовый"
//Лист.Cells(Стр + 2, Кол + 1).NumberFormat = "@";
Лист.Cells(Стр + 2, Кол + 1).Value = Строка(ТаблицаВыгрузки[Стр][Кол]);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ExcelПриложение.DisplayAlerts = False;
Книга.SaveAs(ПолноеИмяФайла);
ExcelПриложение.ActiveWorkbook.Close();
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + ПолноеИмяФайла);
Исключение
Сообщить("Ошибка записи данных файла :" + ПолноеИмяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
- Главная
- О сайте
- Главная
- Содержание
Категории
—>
рубрики: Excel | Дата: 15 июня, 2017
Если провести опрос среди программистов 1С на тему «Как сохранить информацию из 1С в файл ексель», то большинство голосов, как мне кажется займет вариант с созданием объекта Excel.Application с последующим заполнением листа с помощью методов и свойств встроенного в Excel языка VBA. Но многие ли из вас помнят вышеупомянутые методы и свойства? А ведь между тем есть способ который позволяет сделать это гораздо проще, только с использованием языка программирования 1С.
Для этого достаточно сформировать ТабличныйДокумент (сделать это можно как с использованием макета табличного документа, так и программно), а потом просто записать его с помощью метода Записать() сразу в файл Excel, благо платформа без проблем позволяет это сделать. Напомню, что синтаксис этого метода выглядит следующим образом
Записать(ИмяФайла, ТипФайлаТаблицы)
ИмяФайла — строка в которой указан путь к файлу;
ТипФайлаТаблицы — тип файла в который мы будем записывать табличный документ.
Платформа 1С предоставляет следующие типы файлов:
- ANSITXT (ANSITXT)
- DOCX (DOCX)
- HTML (HTML)
- HTML3 (HTML3)
- HTML4 (HTML4)
- HTML5 (HTML5)
- MXL (MXL)
- MXL7 (MXL7)
- ODS (ODS)
- PDF (PDF)
- TXT (TXT)
- XLS (XLS)
- XLS95 (XLS95)
- XLS97 (XLS97)
- XLSX (XLSX)
Пример использования
В качестве примера создадим процедуру в которую в качестве параметра будет передаваться таблица значений, которую будем выводить в табличный документ, который в свою очередь будем сохранять в ексель.
Вот код этой процедуры
&НаСервере
Процедура ЗаписатьТаблицуЗначенийВФайлЕксель(Таблица)
ТабДок = Новый ТабличныйДокумент;
КоличествоКолонок = Таблица.Колонки.Количество();
//Формируем строку с заголовками
Для Счетчик = 1 По КоличествоКолонок Цикл
ТекущаяКолонка = Таблица.Колонки[Счетчик - 1];
ТабДок.Область("R1C" + Счетчик).Текст = ТекущаяКолонка.Имя;
КонецЦикла;
//Добавляем строки из таблицы
НомерСтроки = 2;
Для каждого СтрокаТаблицы Из Таблица Цикл
Для НомерКолонки = 1 По КоличествоКолонок Цикл
ТабДок.Область("R" + НомерСтроки + "C" + НомерКолонки).Текст = Строка(СтрокаТаблицы[НомерКолонки - 1]);
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
//Записываем табличный документ в файл Excel
ТабДок.Записать("D:musorTest.xlsx", ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
В общем то все элементарно. Пусть у нас есть вот такая таблица значений:
| Товар | Количество |
|---|---|
| Яблоки | 5 |
| Груши | 10 |
После того как прогнал ее через процедуру выше, получил вот такой результат в ексель

Достоинства метода
- Простота. Не требуется знаний VBA. Доступны синтаксический контроль и отладка кода в процессе написания.
- Не требуется наличия установленного Excel.
Недостатки метода
- Если макет достаточно сложный, есть вероятность, что он может сохраниться недостаточно корректно. Плюс могут возникать проблемы с форматом данных.
Изложена методика вывода таблицы значений в Excel с помощью именованных ячеек.
Творчество — вот залог долгой и счастливой жизни. Радость познания и открытий, решение задач и головоломок делают наш земной путь увлекательным и полезным. Подобно герою Владимира Гиляровского любой программист в 1С может привести немало примеров нечаянной радости, которую дарит ему его профессия. В моем случае дело было так.
Однажды мне понадобилось вывести в Excel небольшую таблицу. Задача была выполнена и программа пылилась на полке до следующего случая. В начале года этот случай настал, но обнаружилась неприятная вещь. Для больших объемов данных реализованный метод вывода оказался крайне неэффективны, поэтому пришлось заняться оптимизацией. И вот что получилось.
Основная идея состояла в обращении к именованным ячейкам. Причем именованные ячейки использовались для табличной, многострочной части отчета. В 1С это реализовано просто. В шаблоне отчета размещается область с именованными ячейками, затем при выводе данных идет заполнение параметров области и сформированная строка добавляется в табличный документ. Что-то подобное сделаем и в Excel. На первом шаге подготовим шаблон, который мы планируем использовать для вывода.
На рисунке показан список именованных ячеек. Все они находятся в области СтрокаДанных, которая размещена под заголовком таблицы, и образует пустую строку. В этой области в колонке Страна мы предусмотрели вывод значения по умолчанию «РФ». Следующий шаг — создать на основании данного шаблона таблицу Excel и прочитать все имена, которые мы присвоили ячейкам. Фрагмент кода приведен ниже.
xlDown=-4121;
xlUp =-4162;
xlFormatFromLeftOrAbove = 0 ;
xlFormatFromRightOrBelow = 1;
мСОМ=Новый COMОбъект("Excel.Application");
мСОМ.Application.DisplayAlerts =False;
мИмяШаблона="...";
mBook=мСОМ.Application.WorkBooks.Add(КаталогСШаблонами+""+мИмяШаблона+".xltx");
mSheet=mBook.WorkSheets(1);
Область=mSheet.Range("СтрокаДанных");
//*****************************************
/ Перечислим все именнованные ячейки листа
//*****************************************
мИменаЯчеек=новый массив;
для каждого запись из mBook.Names цикл
мИменаЯчеек.Добавить(запись.Name)
конеццикла;
Предполагается, что имена ячеек на листе совпадают с именами колонок таблицы значений (мТЗ), которую мы подготовим для формирования отчета. В общем случае, разумеется, не все именованные ячейки могут дублироваться в структуре таблицы. Теперь заполним структуру данных типа Соответствие (Map в английской записи), при этом ключ — это имя ячейки, а значение — номер колонки, в которой ячейка располагается. Код приводим ниже.
DefaultValue=new Map; imax=Область.Columns.Count(); for i=1 to imax do value=Область.Cells(1,i).Text; if ValueIsFilled(value) then DefaultValue.Insert(i,value); endif; enddo; мИмяДанных=новый Map; для каждого кол из мТЗ.Колонки цикл мИмя=кол.Имя; если мИменаЯчеек.Найти(мИмя)<>Неопределено тогда мИмяДанных.Insert(мИмя,mSheet.Range(мИмя).Column) конецесли; конеццикла;
В данном фрагменте, мы не только заполняем соответствие с именем мИмяДанных, но и готовим информацию со значениями по умолчанию (соответствие DefaultValue). Кроме этого, предусмотрим возможность выводить числа и даты в нужном формате. С этой целью сформируем два массива с именами колонок, которые надо форматировать при выводе (мЧислоФормат и мДатаФормат).
мЧислоеФормат=новый Массив;
мЧислоФормат.Добавить("Количество");
мЧислоФормат.Добавить("Стоимость");
мДатаФормат=новый Массив;
мДатаФормат.Добавить("ДатаПартии");
НомерСтроки=0;
row=Область.Row;
для каждого стр из мТЗ цикл
mSheet.Rows(row).Insert(xlUp,xlFormatFromRightOrBelow);
НомерСтроки=НомерСтроки+1;
состояние(НомерСтроки);
для каждого record из мИмяДанных цикл
мИмя=record.Ключ;
i =record.Значение;
если ТипЗнч(стр[мИмя])=Тип("Число") тогда
если мЧислоФормат.Найти(мИмя)<>Неопределено тогда
mSheet.Cells(row,i).Value=Формат(стр[мИмя],"ЧДЦ=2; ЧН=; ЧГ=0");
иначе
mSheet.Cells(row,i).Value=стр[мИмя];
конецесли;
иначе
если мДатаФормат.Найти(мИмя)<>Неопределено тогда
mSheet.Cells(row,i).Value=Формат(стр[мИмя],"ДФ=dd.MM.yyyy");
иначе
mSheet.Cells(row,i).Value=сокрЛП(стр[мИмя]);
конецесли;
конецесли;
конеццикла;
for each record in DefaultValue do
mSheet.Cells(row,record.Ключ).Value=record.Значение;
enddo;
row=row+1;
КонецЦикла;
Область.Clear();
Небольшой комментарий к приведенному коду. Строку для вывода мы добавляем перед строкой с номером, который хранится в переменной row, при этом используем форматирование ячеек, расположенных ниже и правее. В результате именованная область ОбластьДанных постоянно смещается вниз. Поэтому,закончив вывод таблицы значений, мы ее очищаем, чтобы убрать размещенные в шаблоне значения по умолчанию.
Ключевые слова: Excel, 1С, таблица, значений, выгрузка
Функция ЧтениеТаблицы(ТабЗнач)
Перем Excel;
Excel = СоздатьОбъект("Excel.Application"); //Создаем объект Excel
Excel.Visible = 1; //Определяем видимость документа 1-видимы; 0-Невидимый
WB = Excel.Workbooks.Add(); //Добавляем книгу
Sh = WB.ActiveSheet(); //Определяем активный лист
Sh.Visible = 1; //Видимость листа 1-видимы; 0-Невидимый
//Создаем на листе Excel колонки начиная с первой колонки i=1
Для i=1 По ТабЗнач.КоличествоКолонок() Цикл
Sh.Cells(1, i).Value = ТабЗнач.ПолучитьПараметрыКолонки(i);
КонецЦикла;
Row = 2; //Номер строки на листе Excel
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
//Выводим строку состояния для строк кратных 10
Если (ТабЗнач.НомерСтроки%10)=0 Тогда
Состояние("Обработано "+ТабЗнач.НомерСтроки+"/"+ТабЗнач.КоличествоСтрок());
КонецЕсли;
//Заполняем столбцы на листе Excel для строки номер Row
Для i=1 По ТабЗнач.КоличествоКолонок() Цикл
Значение = ТабЗнач.ПолучитьЗначение(Row-1, i);
//Переводим значение, не являющееся Числом,Строкой, Датой и Неопределенным, в тип Строка
Если ТипЗначения(Значение)>3 Тогда
Значение = Строка(Значение);
КонецЕсли;
//Установка формата данных ячейки на листе Excel
Если ТипЗначения(Значение)=2 Тогда
Sh.Cells(Row, i).NumberFormat = "@";
КонецЕсли;
//Устанавливаем текущее Значение в в ячейку листа Excel
Sh.Cells(Row, i).Value = Значение;
КонецЦикла;
Row = Row + 1;
КонецЦикла;
Sh.Cells(1,1).AutoFilter(); //Устанавливаем фильтр
Sh.Cells(2,1).Select(); //Выбор области для закрепления
Excel.ActiveWindow.FreezePanes = 1; //Закрепляем область
Sh = ""; //Обнуляем лист
Excel = ""; //Обнуляем объект Excel
Возврат WB; //Возвращаем книгу Excel
КонецФункции




