+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.
Недостатки метода
- Если макет достаточно сложный, есть вероятность, что он может сохраниться недостаточно корректно. Плюс могут возникать проблемы с форматом данных.
Во время реализации соответствующей задачи в 1С иногда возникает потребность где-то временно хранить табличные данные, помимо самой конфигурации.
Это может быть удобным для следующих случаев:
- Для хранения каких-либо настроек у отчётов или обработок;
- Для тестирования или ведения логов (для временного хранения результата) при выполнении кода или запроса в 1С;
- Для загрузки/выгрузки данных между информационными базами 1С.
Во многих случаях очень удобно всегда иметь под рукой кнопки «Выгрузить таблицу» и «Загрузить таблицу», чтобы, к примеру, не заполнять вручную табличную часть документов или обработок.
Алгоритм
Порядок программных действий при выгрузке в файл выглядит так:
- Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки);
- Конвертируем таблицу значений в табличный документ;
- Сохраняем табличный документ в MXL.
При загрузке таблицы порядок действий такой:
- Читаем из файла табличный документ;
- Конвертируем табличный документ в таблицу значений;
- Используем эту таблицу значений в своих целях (загружаем в табличную часть).
Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Функции и процедуры
Основные функции для реализации поставленной задачи следующие:
- ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
- ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
- ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
- ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Пример реализации
Ниже можно скачать обработку с примером реализации данного алгоритма.
Обработка имеет 3 функциональных кнопки:
- Выгрузить
- Загрузить
- Очистить.
Приведём здесь код 1С для всех вышеописанных функций:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
// Преобразовать табличный документ в таблицу значений. // // Параметры: // ТабДок - <ТабличныйДокумент> - Исходный табличный документ; // СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок; // НачалоСтрока - <Число> - Строка начала области; // НачалоСтолбец - <Число> - Столбец начала области; // КонецСтрока - <Число> - Строка конца области; // КонецСтолбец - <Число> - Столбец конца области. // // Возвращаемое значение: // <ТаблицаЗначений> - Полученная таблица значений. // Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт // Определение габаритов таблицы Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда НачалоСтрока = 1; НачалоСтолбец = 1; КонецЕсли; Если НачалоСтрока = Неопределено Тогда НачалоСтрока = 1; Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение И НачалоСтрока < ТабДок.ВысотаТаблицы Цикл НачалоСтрока = НачалоСтрока + 1; КонецЦикла; ИначеЕсли НачалоСтолбец = Неопределено Тогда НачалоСтолбец = 1; Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение И НачалоСтолбец < ТабДок.ШиринаТаблицы Цикл НачалоСтолбец = НачалоСтолбец + 1; КонецЦикла; КонецЕсли; КонецСтрока = ?(КонецСтрока = Неопределено, ТабДок.ВысотаТаблицы, КонецСтрока); КонецСтолбец = ?(КонецСтолбец = Неопределено, ТабДок.ШиринаТаблицы, КонецСтолбец); // Преобразование ЭтоТаблица = (ТипЗнч(СтруктураКолонок) = Тип("ТаблицаЗначений")); ТабЗначений = ПолучитьТаблицуВывода(СтруктураКолонок); Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл СтрокаТЗ = ТабЗначений.Добавить(); ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из СтруктураКолонок Цикл НаименованиеКолонки = ?(ЭтоТаблица, Колонка.Наименование, Колонка.Ключ); пИндексКолонки = ?(ЭтоТаблица, Колонка.СтолбецОтчёт, ИндексКолонки); Если ТабДок.Область(ИндексСтроки, пИндексКолонки).СодержитЗначение Тогда СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Значение; Иначе СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Текст; КонецЕсли; ИндексКолонки = ИндексКолонки + 1; КонецЦикла; КонецЦикла; Возврат ТабЗначений; КонецФункции; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
// Преобразовать таблицу значений в табличный документ. // // Параметры: // ТабЗначений - <ТаблицаЗначений> - Исходная таблица значений; // ТабДок - <ТабличныйДокумент> - Полученный табличный документ. Если параметр не задан, // то документ создаётся заново и возвращается функцией; // НачалоСтрока - <Число> - Строка начала области; // НачалоСтолбец - <Число> - Столбец начала области; // ВыводитьЗаголовки - <Булево> - Определяет выводить ли имена колонок или нет. // // Возвращаемое значение: // <ТабличныйДокумент> - Полученный табличный документ (возвращает параметр "ТабДок"). // Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт Если ТабДок = Неопределено Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; // Определение габаритов таблицы НачалоСтрока = ?(НачалоСтрока = Неопределено, 1, НачалоСтрока); НачалоСтолбец = ?(НачалоСтолбец = Неопределено, 1, НачалоСтолбец); // Преобразование ИндексСтроки = НачалоСтрока; Если ВыводитьЗаголовки Тогда ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из ТабЗначений.Колонки Цикл ТабДок.Область(ИндексСтроки, ИндексКолонки).Текст = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок); ИндексКолонки = ИндексКолонки + 1; КонецЦикла; ИндексСтроки = ИндексСтроки + 1; КонецЕсли; Для Каждого Элемент Из ТабЗначений Цикл ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из ТабЗначений.Колонки Цикл ТабДок.Область(ИндексСтроки, ИндексКолонки).СодержитЗначение = Истина; ТабДок.Область(ИндексСтроки, ИндексКолонки).ТипЗначения = Новый ОписаниеТипов(Колонка.ТипЗначения); ТабДок.Область(ИндексСтроки, ИндексКолонки).Значение = Элемент[Колонка.Имя]; ИндексКолонки = ИндексКолонки + 1; КонецЦикла; ИндексСтроки = ИндексСтроки + 1; КонецЦикла; Возврат ТабДок; КонецФункции; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// Читает табличный документ из файла MXL и преобразует его в таблицу значений. // // Параметры: // ИмяФайла - <Строка> - Путь к файлу MXL; // СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок. Если этот параметр // не задан, то структура колонок формируется из самого табличного документа; // ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет. // // Возвращаемое значение: // <ТаблицаЗначений> - Полученная таблица значений. // Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт ТабДок = Новый ТабличныйДокумент; ТабДок.Прочитать(ИмяФайла); Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда СтруктураКолонок = Новый Структура; Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл Обл1 = ТабДок.Область(1, ИндексКолонки); Обл2 = ТабДок.Область(2, ИндексКолонки); ИмяКолонки = СокрЛП(Обл1.Текст); ИмяКолонки = ?(Найти(ИмяКолонки, " ") > 0, СтрЗаменить(ТРег(ИмяКолонки), " ", ""), ИмяКолонки); СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов)); КонецЦикла; ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда СтруктураКолонок = Новый Структура; Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл Обл2 = ТабДок.Область(1, ИндексКолонки); ИмяКолонки = "К" + Формат(ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0"); СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов)); КонецЦикла; КонецЕсли; Таблица = ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, ?(ЕстьЗаголовок, 2, 1), 1); Возврат Таблица; КонецФункции; |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Сохраняет таблицу значений в файле в виде табличного документа. // // Параметры: // ИмяФайла - <Строка> - Путь к файлу MXL; // ТабЗначений - <ТаблицаЗначений> - Сохраняемая таблица значений; // ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет. // Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт ТабДок = ПреобразоватьТЗвТД(ТабЗначений, Неопределено, 1, 1, ЕстьЗаголовок); ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL); КонецПроцедуры; |
Целиком скачайте обработку по ссылке ниже.
Смело используйте этот код 1С для реализации своих проектов! Если в коде имеются баги (ошибки), просьба сообщить об этом, написав в комментариях ниже.
|
|||
picom
03.04.12 — 10:06 |
На форме обработки есть таблица значений. |
||
DrShad
1 — 03.04.12 — 10:10 |
ТабличныйДокумент.Записать() |
||
picom
2 — 03.04.12 — 10:13 |
(1) а как табличный документ сформировать из ТЗ то быстренько? |
||
Галахад
3 — 03.04.12 — 10:16 |
Через построитель. |
||
picom
4 — 03.04.12 — 10:21 |
Т.е. команду «вывести список» программно не вызвать? |
||
Maxus43
5 — 03.04.12 — 10:22 |
(4) нет |
||
picom
6 — 03.04.12 — 10:23 |
печалька |
||
Maxus43
7 — 03.04.12 — 10:25 |
(6) через построитель то быстро |
||
picom
8 — 03.04.12 — 10:28 |
Быстро если уже написан универсальный код, который сам колонки говорит нужные … |
||
Maxus43
9 — 03.04.12 — 10:31 |
(8) построитель сам всё сделает, ты ему ТЗ скорми просто как источник данных |
||
Maxus43
10 — 03.04.12 — 10:35 |
Запрос = Новый Запрос; |
||
picom
11 — 03.04.12 — 10:39 |
Постр = Новый ПостроительОтчета; (10) спасибо, все получилось |
||
Maxus43
12 — 03.04.12 — 10:42 |
«TZ» — извращенец) |
||
picom
13 — 03.04.12 — 10:43 |
А как потом обратиться к полученному табличному полю с целью его записи ? |
||
Maxus43
14 — 03.04.12 — 10:49 |
Постр.Вывести(ТабДок); |
||
picom
15 — 03.04.12 — 11:51 |
Подскажите пожалуйста еще, как удалить 3 пустые строки сверх и пустую первую колонку. |
||
Maxus43
16 — 03.04.12 — 11:56 |
Постр.ВыводитьШапкуТаблицы = Ложь; З.ы. издеваешся?) СП открой хоть немного |
||
picom 17 — 03.04.12 — 12:17 |
(16) сори, туплю |
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену… по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
Автор 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
Куда копать может кто подскажет ?
Нет, не спросил, почему лесенкой… спросил, почему в ШАХМАТНОМ ПОРЯДКЕ
Народная мудрость: Программу встречают по интерфейсу
Тема уже совсем не актуальна.