Выгрузка табличного документа в Excel

1. PrinzOfMunchen 84 11.11.12 10:25 Сейчас в теме
Как можно выгрузить заполненный табличный документ на конкретную страницу Excel-файла?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
16. sergsd15 3 21.11.12 20:19 Сейчас в теме
ДокЭкс = Получить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");
17. MrUnnamed 15 21.11.12 20:58 Сейчас в теме
(1) PrinzOfMunchen,

ИмяФайла = Строка(ИмяФайла) + ".xls";
Каталог = КаталогВременныхФайлов();
ПолныйПутьКФайлу = Каталог + ИмяФайла;
Попытка
ТабДокумент.Записать(ПолныйПутьКФайлу,ТипФайлаТабличногоДокумента.XLS);
Сообщить("Записан новый файл " + ПолныйПутьКФайлу);
ЗапуститьПриложение(ПолныйПутьКФайлу);
Исключение
СообщитьОбОшибке(ОписаниеОшибки());
КонецПопытки;

(8) PrinzOfMunchen,

как вариант: по каждому филиалу формировать отчёт и сохранять печатные формы в отдельные файлы
18. PrinzOfMunchen 84 21.11.12 21:12 Сейчас в теме
(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() приходится делать, чтобы задать листам свои имена.
19. MrUnnamed 15 21.11.12 21:26 Сейчас в теме
(18) PrinzOfMunchen,
Да, хороший вариант
21. Windsor77 14 30.04.13 12:05 Сейчас в теме
(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();
	
	Предупреждение("Экспорт в файл " + ИмяФайла + " выполнен успешно!");
КонецПроцедуры
Показать
Brook; extrim-style; myoker; atroxa; +4 Ответить
2. VicGuru 11.11.12 10:33 Сейчас в теме
//Пытаемся подключиться к Excel
Попытка
Excel = новый COMОбъект("Excel.Application");
Исключение
Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
Возврат;
КонецПопытки;

//Подключились удачно, открываем файл
Excel.Workbooks.Open(ИмяФайла);

//Открываем необходимый лист
Excel.Sheets(НомерЛиста).select();
3. PrinzOfMunchen 84 11.11.12 10:36 Сейчас в теме
(2) VicGuru, а как в этот самый лист выгрузить наш табдок? Задача вся в этом. Просто не хочется создавать кучу экселевских файлов, через "ТабДок.Записать(...)", а потом их сшивать.
4. HeadHunter2007 11.11.12 11:40 Сейчас в теме
http://www.1c-h.ru/?p=238 - Здесь описаны основные методы работы с Exel
5. PrinzOfMunchen 84 11.11.12 11:50 Сейчас в теме
(4) HeadHunter2007, Спасибо за ответ, но там такого нет.
6. HeadHunter2007 11.11.12 11:59 Сейчас в теме
Выгрузка данных в Excel

Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных.
Для создания новой книги можно использовать следующий код:

Книга = Excel.WorkBooks.Add();

При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:

Лист = Книга.WorkSheets(НомерЛиста);

Или добавить в книгу новый лист:

Лист = Книга.Sheets.Add();

Добавим в ячейку на листе значение:

Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
Вообще то вот тут описано добавление строк в файл эксель.только тебе надо будет не новый файл содавать а выбирать существующий!!!
7. HeadHunter2007 11.11.12 12:12 Сейчас в теме
Или вам надо печатную форму на лист Эксель скинуть???
8. PrinzOfMunchen 84 11.11.12 12:31 Сейчас в теме
(7) HeadHunter2007, сейчас объясню подробнее суть проблемы. Я делаю внешний отчет. У меня есть свой макет с большим количеством параметров, в который будут выводиться данные по филиалу. Я получаю данные из запроса по нескольким таким филиалам. Данные по каждому филиалу должны быть на новой странице. Если выводить эти данные в табличный документ, то всё просто - после окончания вывода информации о каждом предприятии делать "ТабДок.ВывестиГоризонтальныйРазделительСтраниц();". Но мне нужно, что бы эти данные были выведены в эксель, причём так же - каждый филиал на новой странице. Так вот, допустим, я вывожу данные по одному филиалу в табличный документ("ТабДок"), создаю в моём, заранее созданном файле экселя, новую страницу...а как вывести этот "ТабДок" в эту самую страницу экселя, не представляю.
10. HeadHunter2007 11.11.12 14:47 Сейчас в теме
(8)Как вариант сохранять в разные файлы,а потом средствами 1С -же лепить все в одну книгу.Или же формировать файл по шаблону не через ТабДок.Записать() а просто заполнять листы и ячейки в Exel по данным запроса!
11. PrinzOfMunchen 84 11.11.12 16:05 Сейчас в теме
(10) HeadHunter2007, именно от сохранения в разных файлах я и хотел избавиться. Но видимо всё таки придётся таким образом действовать. Спасибо за советы.
12. l_men 16 13.11.12 15:51 Сейчас в теме
(11) PrinzOfMunchen, Так вот же: Лист = Книга.Sheets.Add(); чем это не устраивает? В цикле обходите филиалы и для каждого филиала добавляете новый лист.
13. PrinzOfMunchen 84 13.11.12 16:55 Сейчас в теме
(12) (12) l_men, а как на этот самый лист выгрузить свой табличный документ? Единственным на данный момент способом, который я нашёл, является "склеивание" нескольких файлов экселя(полученных методом ТабДок.Записать(....)) в один, методом копирования листов.
15. l_men 16 14.11.12 11:06 Сейчас в теме
(13) PrinzOfMunchen, Только если формировать отчет по колонкам прямо в Excel) Муторно, но в дальнейшем сэкономит много времени по склеиванию страниц и прочих рутинных периодических операций.
20. bolush 22.11.12 07:49 Сейчас в теме
Нужно примерно так:)

//Номер листа в книге 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();
9. VicGuru 11.11.12 14:38 Сейчас в теме
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
14. nomadon 369 13.11.12 20:39 Сейчас в теме
дайте универсальную загрузку в эксель
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот