Автор 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 КонецФункции