Как записать таблицу значений в excel

Автор 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


Куда копать может кто подскажет ?


Нет, не спросил, почему лесенкой… спросил, почему в ШАХМАТНОМ ПОРЯДКЕ :ooifh::D :D

Народная мудрость: Программу встречают по интерфейсу


Тема уже совсем не актуальна.


 +2 

   

Распечатать

1С 8.x : Как выгрузить Таблицу значение в файл Excel?

Код 1C v 8.х

 Процедура СохранитьТаблицуВФайл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
 
    
КонецФункции

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как записать таблицу в файл excel
  • Как записать производную в excel
  • Как записать сумму ячеек в excel
  • Как записать произведение в excel
  • Как записать строку в ячейку vba excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии