По теме из базы знаний
- Как сохранить данные табличного поля в табличный документ / файл Excel программно
- Описание выгрузки табличного документа в excel
- Сохранение табличного документа в EXCEL (xlsx) с форматом ячеек Число, Дата, Дата время
- Быстрая выгрузка в Excel с оформлением (числа, даты, колонтитулы, гиперссылки) через OpenXML
- Как сохранить любой табличный документ в excel так, чтобы даты сохранились как даты?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ДокЭкс = ПолучитьCOMОбъект("", "Excel.Application");
ДокЭкс.SheetsInNewWorkbook = 1; //Один лист в новой книге
ДокЭкс.DisplayAlerts = 0; //Не выводить предупреждения Excel
тзЧастей="";
тзЧастей=Новый ТаблицаЗначений;
тзЧастей.Колонки.Добавить("Ссылка");
тзЧастей.Колонки.Добавить("ПутьКФайлу");
//создадим список файлов которые нужно свалить в один
для ии=1 по НомерТаблицы цикл
//стр<индекс> - это "ПолеТабличногоДокумента" они формируются динамически их может быть много
ЭлементыФормы["стр"+Строка(ии)].Записать(КаталогВременныхФайлов()+"tmp"+Строка(ии)+".xls",ТипФайлаТабличногоДокумента.XLS);
вр_файл=ДокЭкс.Workbooks.Open(КаталогВременныхФайлов()+"tmp"+Строка(ии)+".xls");
новСтр=тзЧастей.Добавить();
новСтр.Ссылка=вр_файл;
новСтр.ПутьКФайлу=КаталогВременныхФайлов()+"tmp"+Строка(ии)+".xls";
конецЦикла;
Файл = ДокЭкс.Workbooks.Add(); //Создаем файл куда все пишем
Файл.Sheets(1).Name="Удалить"; //Этот лист потом будет лишним ... удалим
Файл.SaveAs(КаталогВременныхФайлов()+"result.xls",-4143);
текЛист=0;
для каждого стрТЗ из тзЧастей цикл
текЛист=текЛист+1;
стрТЗ.Ссылка.Sheets(1).Copy(Файл.Sheets(текЛист));//копирем очередно файл на следующую закладку
// это впринципе ключевой момент .. именно здесь происходит заполнение по закладкам
конецЦикла;
//меняем имна закладок
для ии=1 по ЭлементыФормы.Панель1.Страницы.Количество()-1 цикл
Файл.Sheets(ии).Name = ЭлементыФормы.Панель1.Страницы[ии].Заголовок;
конецЦикла;
//удаляем все лишнее
попытка
Файл.Sheets("Удалить").Delete();
исключение
конецПопытки;
//сохраняем результат
ИмяФайлаВложений=Формат(ТекущаяДата(),"ДФ=ггггММдд")+".xls";
ДиалогОткрытияФайла=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогОткрытияФайла.ПолноеИмяФайла=ИмяФайлаВложений;
ДиалогОткрытияФайла.Каталог=Константы.ПутьTHMS.Получить();
ДиалогОткрытияФайла.Фильтр="Файлы Microsoft Excel (*.xls)|*.xls|Все файлы (*.*)|*.*";
ДиалогОткрытияФайла.МножественныйВыбор=Ложь;
ДиалогОткрытияФайла.Заголовок="Сохранение файла для отправки";
если ДиалогОткрытияФайла.Выбрать() тогда
Файл.SaveAs(ДиалогОткрытияФайла.ПолноеИмяФайла,-4143);
конецЕсли;
ДокЭкс.DisplayAlerts = 1;
ДокЭкс.WorkBooks.Close();
ДокЭкс.Quit();
//удаляем все лишнее
для каждого стрТЗ из тзЧастей цикл
УдалитьФайлы(КаталогВременныхФайлов()+стрТЗ.ПутьКФайлу);
конецЦикла;
УдалитьФайлы(КаталогВременныхФайлов()+"result.xls");
ДокЭкс.SheetsInNewWorkbook = 1; //Один лист в новой книге
ДокЭкс.DisplayAlerts = 0; //Не выводить предупреждения Excel
тзЧастей="";
тзЧастей=Новый ТаблицаЗначений;
тзЧастей.Колонки.Добавить("Ссылка");
тзЧастей.Колонки.Добавить("ПутьКФайлу");
//создадим список файлов которые нужно свалить в один
для ии=1 по НомерТаблицы цикл
//стр<индекс> - это "ПолеТабличногоДокумента" они формируются динамически их может быть много
ЭлементыФормы["стр"+Строка(ии)].Записать(КаталогВременныхФайлов()+"tmp"+Строка(ии)+".xls",ТипФайлаТабличногоДокумента.XLS);
вр_файл=ДокЭкс.Workbooks.Open(КаталогВременныхФайлов()+"tmp"+Строка(ии)+".xls");
новСтр=тзЧастей.Добавить();
новСтр.Ссылка=вр_файл;
новСтр.ПутьКФайлу=КаталогВременныхФайлов()+"tmp"+Строка(ии)+".xls";
конецЦикла;
Файл = ДокЭкс.Workbooks.Add(); //Создаем файл куда все пишем
Файл.Sheets(1).Name="Удалить"; //Этот лист потом будет лишним ... удалим
Файл.SaveAs(КаталогВременныхФайлов()+"result.xls",-4143);
текЛист=0;
для каждого стрТЗ из тзЧастей цикл
текЛист=текЛист+1;
стрТЗ.Ссылка.Sheets(1).Copy(Файл.Sheets(текЛист));//копирем очередно файл на следующую закладку
// это впринципе ключевой момент .. именно здесь происходит заполнение по закладкам
конецЦикла;
//меняем имна закладок
для ии=1 по ЭлементыФормы.Панель1.Страницы.Количество()-1 цикл
Файл.Sheets(ии).Name = ЭлементыФормы.Панель1.Страницы[ии].Заголовок;
конецЦикла;
//удаляем все лишнее
попытка
Файл.Sheets("Удалить").Delete();
исключение
конецПопытки;
//сохраняем результат
ИмяФайлаВложений=Формат(ТекущаяДата(),"ДФ=ггггММдд")+".xls";
ДиалогОткрытияФайла=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогОткрытияФайла.ПолноеИмяФайла=ИмяФайлаВложений;
ДиалогОткрытияФайла.Каталог=Константы.ПутьTHMS.Получить();
ДиалогОткрытияФайла.Фильтр="Файлы Microsoft Excel (*.xls)|*.xls|Все файлы (*.*)|*.*";
ДиалогОткрытияФайла.МножественныйВыбор=Ложь;
ДиалогОткрытияФайла.Заголовок="Сохранение файла для отправки";
если ДиалогОткрытияФайла.Выбрать() тогда
Файл.SaveAs(ДиалогОткрытияФайла.ПолноеИмяФайла,-4143);
конецЕсли;
ДокЭкс.DisplayAlerts = 1;
ДокЭкс.WorkBooks.Close();
ДокЭкс.Quit();
//удаляем все лишнее
для каждого стрТЗ из тзЧастей цикл
УдалитьФайлы(КаталогВременныхФайлов()+стрТЗ.ПутьКФайлу);
конецЦикла;
УдалитьФайлы(КаталогВременныхФайлов()+"result.xls");
(1) PrinzOfMunchen,
ИмяФайла = Строка(ИмяФайла) + ".xls";
Каталог = КаталогВременныхФайлов();
ПолныйПутьКФайлу = Каталог + ИмяФайла;
Попытка
ТабДокумент.Записать(ПолныйПутьКФайлу,ТипФайлаТабличногоДокумента.XLS);
Сообщить("Записан новый файл " + ПолныйПутьКФайлу);
ЗапуститьПриложение(ПолныйПутьКФайлу);
Исключение
СообщитьОбОшибке(ОписаниеОшибки());
КонецПопытки;
(8) PrinzOfMunchen,
как вариант: по каждому филиалу формировать отчёт и сохранять печатные формы в отдельные файлы
ИмяФайла = Строка(ИмяФайла) + ".xls";
Каталог = КаталогВременныхФайлов();
ПолныйПутьКФайлу = Каталог + ИмяФайла;
Попытка
ТабДокумент.Записать(ПолныйПутьКФайлу,ТипФайлаТабличногоДокумента.XLS);
Сообщить("Записан новый файл " + ПолныйПутьКФайлу);
ЗапуститьПриложение(ПолныйПутьКФайлу);
Исключение
СообщитьОбОшибке(ОписаниеОшибки());
КонецПопытки;
(8) PrinzOfMunchen,
как вариант: по каждому филиалу формировать отчёт и сохранять печатные формы в отдельные файлы
(17) MrUnnamed, ну я так в общем-то и сделал. И именно этого я и хотел избежать, когда создавал этот пост.
Вот как в итоге выглядит процедура для объединения файлов экселя в один
ДокЭксель = Новый COMОбъект("Excel.Application");
ДокЭксель.DisplayAlerts = Ложь;
ОбщаяКнига = ДокЭксель.WorkBooks.Add();
Индекс = 0;
Для каждого ПутьКЭксель Из МассивПутей Цикл
ДокЭксель.WorkBooks.Open(ПутьКЭксель);
ТекущийЛист = ДокЭксель.ActiveWorkbook.Sheets(1);
// Задаём область для копирования
НачОбл = ТекущийЛист.Cells(1,1);
КонОбл = ТекущийЛист.Cells(100,50);
// Выделяем необходимую область
ДокЭксель.ActiveWorkbook.Sheets(1).Range(НачОбл, КонОбл).Select();
ДокЭксель.Selection.Copy();
// Добавляем новый лист, задаём ему имя, и вставляем данные
Лист = ОбщаяКнига.WorkSheets.add();
Лист.name = Строка(МассивИмен[Индекс]);
Лист.paste();
ДокЭксель.ActiveWorkbook.close();
Индекс = Индекс + 1;
КонецЦикла;
ОбщаяКнига.WorkSheets("Лист1").delete();
ОбщаяКнига.saveAs(ПутьДоФайла);
Попытка
Для каждого ПутьКЭксель Из МассивПутей Цикл
УдалитьФайлы(СокрЛП(ПутьКЭксель));
КонецЦикла;
Исключение
КонецПопытки;
P.S. Копирование через copy() - > paste() приходится делать, чтобы задать листам свои имена.
Вот как в итоге выглядит процедура для объединения файлов экселя в один
ДокЭксель = Новый COMОбъект("Excel.Application");
ДокЭксель.DisplayAlerts = Ложь;
ОбщаяКнига = ДокЭксель.WorkBooks.Add();
Индекс = 0;
Для каждого ПутьКЭксель Из МассивПутей Цикл
ДокЭксель.WorkBooks.Open(ПутьКЭксель);
ТекущийЛист = ДокЭксель.ActiveWorkbook.Sheets(1);
// Задаём область для копирования
НачОбл = ТекущийЛист.Cells(1,1);
КонОбл = ТекущийЛист.Cells(100,50);
// Выделяем необходимую область
ДокЭксель.ActiveWorkbook.Sheets(1).Range(НачОбл, КонОбл).Select();
ДокЭксель.Selection.Copy();
// Добавляем новый лист, задаём ему имя, и вставляем данные
Лист = ОбщаяКнига.WorkSheets.add();
Лист.name = Строка(МассивИмен[Индекс]);
Лист.paste();
ДокЭксель.ActiveWorkbook.close();
Индекс = Индекс + 1;
КонецЦикла;
ОбщаяКнига.WorkSheets("Лист1").delete();
ОбщаяКнига.saveAs(ПутьДоФайла);
Попытка
Для каждого ПутьКЭксель Из МассивПутей Цикл
УдалитьФайлы(СокрЛП(ПутьКЭксель));
КонецЦикла;
Исключение
КонецПопытки;
P.S. Копирование через copy() - > paste() приходится делать, чтобы задать листам свои имена.
(18) PrinzOfMunchen, а в чём проблема с именами листов? Я сделал так (у меня динамически формирующиеся страницы, содержащие по одному ПолеТабличногоДокумента):
Процедура ОсновныеДействияФормыЭкспорт(Кнопка)
Перем ОбщаяКнига;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Укажите имя файла для сохранения:";
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.Фильтр = "Файл Excel (*.xls)|*.xls";
Если Не Диалог.Выбрать() Тогда Возврат; КонецЕсли;
ИмяФайла = Диалог.ПолноеИмяФайла;
П = ЭлементыФормы.ПанельРегистров;
////// Инициализация экселя
Попытка
Эксл = Новый COMОбъект("Excel.Application");
Исключение
СообщитьОбОшибке("Не удалось запустить MS Excel!");
Возврат;
КонецПопытки;
Эксл.DisplayAlerts = Ложь;
ВрФайл = ПолучитьИмяВременногоФайла("xls");
Для й = 1 По П.Страницы.Количество()-1 Цикл
ТДок = ЭлементыФормы.Найти("Результат"+й);
Если ТДок = Неопределено Тогда
Эксл.Quit();
ВызватьИсключение "Ошибка нумерации листов! Не найден ""Результат"+й+"""!";
КонецЕсли;
/////// Сохраняем страницу
ТДок.Записать(ВрФайл, ТипФайлаТабличногоДокумента.XLS);
Если ОбщаяКнига = Неопределено Тогда ///// Создаём новую книгу, в которую будем сшивать страницы
ОбщаяКнига = Эксл.WorkBooks.Add(ВрФайл);
ОбщаяКнига.Windows(1).DisplayWorkbookTabs = Истина;
ОбщаяКнига.Windows(1).TabRatio = 0.35;
Иначе //// копируем в новую книгу:
ТКнига = Эксл.WorkBooks.Add(ВрФайл);
ТКнига.Sheets(1).Copy(, ОбщаяКнига.Sheets(ОбщаяКнига.Sheets.Count));
ТКнига.Close();
КонецЕсли;
ИмяЛиста = П.Страницы[й].Заголовок;
ТЛист = ОбщаяКнига.Sheets(ОбщаяКнига.Sheets.Count);
Попытка // переименовать
ТЛист.Name = ИмяЛиста;
Исключение
ТЛист.Name = "Регистр "+й;
КонецПопытки;
ТЛист.PageSetup.LeftMargin = 44.8;
ТЛист.PageSetup.RightMargin = 22.4;
ТЛист.PageSetup.TopMargin = 22.4;
ТЛист.PageSetup.BottomMargin = 22.4;
ТЛист.PageSetup.Orientation = 1;
ТЛист.PageSetup.FitToPagesWide = 1;
ТЛист.PageSetup.FitToPagesTall = False;
УдалитьФайлы(ВрФайл);
КонецЦикла;
ОбщаяКнига.Sheets(1).Select();
ОбщаяКнига.SaveAs(ИмяФайла);
ОбщаяКнига.Close();
Эксл.Quit();
Предупреждение("Экспорт в файл " + ИмяФайла + " выполнен успешно!");
КонецПроцедуры
Показать
//Пытаемся подключиться к Excel
Попытка
Excel = новый COMОбъект("Excel.Application");
Исключение
Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
Возврат;
КонецПопытки;
//Подключились удачно, открываем файл
Excel.Workbooks.Open(ИмяФайла);
//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();
Попытка
Excel = новый COMОбъект("Excel.Application");
Исключение
Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
Возврат;
КонецПопытки;
//Подключились удачно, открываем файл
Excel.Workbooks.Open(ИмяФайла);
//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();
Выгрузка данных в Excel
Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных.
Для создания новой книги можно использовать следующий код:
Книга = Excel.WorkBooks.Add();
При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:
Лист = Книга.WorkSheets(НомерЛиста);
Или добавить в книгу новый лист:
Лист = Книга.Sheets.Add();
Добавим в ячейку на листе значение:
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
Вообще то вот тут описано добавление строк в файл эксель.только тебе надо будет не новый файл содавать а выбирать существующий!!!
Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных.
Для создания новой книги можно использовать следующий код:
Книга = Excel.WorkBooks.Add();
При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:
Лист = Книга.WorkSheets(НомерЛиста);
Или добавить в книгу новый лист:
Лист = Книга.Sheets.Add();
Добавим в ячейку на листе значение:
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
Вообще то вот тут описано добавление строк в файл эксель.только тебе надо будет не новый файл содавать а выбирать существующий!!!
(7) HeadHunter2007, сейчас объясню подробнее суть проблемы. Я делаю внешний отчет. У меня есть свой макет с большим количеством параметров, в который будут выводиться данные по филиалу. Я получаю данные из запроса по нескольким таким филиалам. Данные по каждому филиалу должны быть на новой странице. Если выводить эти данные в табличный документ, то всё просто - после окончания вывода информации о каждом предприятии делать "ТабДок.ВывестиГоризонтальныйРазделительСтраниц();". Но мне нужно, что бы эти данные были выведены в эксель, причём так же - каждый филиал на новой странице. Так вот, допустим, я вывожу данные по одному филиалу в табличный документ("ТабДок"), создаю в моём, заранее созданном файле экселя, новую страницу...а как вывести этот "ТабДок" в эту самую страницу экселя, не представляю.
Нужно примерно так:)
//Номер листа в книге Excel для получения данных
НомерЛиста = 1;
//Пытаемся подключиться к Excel
Попытка
Excel = новый COMОбъект("Excel.Application");
Исключение
Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
Возврат ;
КонецПопытки;
//Подключились удачно, открываем файл
Excel.Workbooks.Open(ИмяФайла);
//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();
//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
// Выбираем данные из файла
Для а = 1 по ФайлСтрок Цикл
НаименованиеXSL = СокрЛП(Excel.Cells(а,НомерСтроки).Value);
КоличествоТЗ = (Excel.Cells(а,НомерКол).Value);
СуммаТЗ = (Excel.Cells(а,НомерСуммы).Value);
ТЗ = Объект.ТабличнаяЧасть.Добавить();
ТЗ.Наименование = НаименованиеXSL;
ТЗ.Количество = КоличествоТЗ;
Тз.Сумма = СуммаТЗ;
КонецЦикла;
//Закрываем Excel
Excel.ActiveWorkbook.Close();
//Номер листа в книге Excel для получения данных
НомерЛиста = 1;
//Пытаемся подключиться к Excel
Попытка
Excel = новый COMОбъект("Excel.Application");
Исключение
Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
Возврат ;
КонецПопытки;
//Подключились удачно, открываем файл
Excel.Workbooks.Open(ИмяФайла);
//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();
//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
// Выбираем данные из файла
Для а = 1 по ФайлСтрок Цикл
НаименованиеXSL = СокрЛП(Excel.Cells(а,НомерСтроки).Value);
КоличествоТЗ = (Excel.Cells(а,НомерКол).Value);
СуммаТЗ = (Excel.Cells(а,НомерСуммы).Value);
ТЗ = Объект.ТабличнаяЧасть.Добавить();
ТЗ.Наименование = НаименованиеXSL;
ТЗ.Количество = КоличествоТЗ;
Тз.Сумма = СуммаТЗ;
КонецЦикла;
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот