gifts2017

Сохранение табличных документов 8.1 в различных форматах MS Excel 2003-2007

Опубликовал ediks (ediks) в раздел Обмен - Загрузка и выгрузка в Excel

Как известно, 1С:Предприятие 8.1 имеет довольно ограниченное количество форматов в которых можно сохранить табличный документ. Вашему вниманию предлагается простая процедура, которая восполняет в какой-то мере этот недостаток.

Зачем это нужно? Дело в том, что при сохранении табличного документа в формате Excel средствами платформы 8.1 файл получается просто неприличных размеров и совершенно непригоден к рассылке. К примеру, прайс-листы с картинками могли иметь размер до 15-20 Мб. После сохранения в формате 2007 размер уменьшался на порядок. В результате я написал процедуру, которая сохраняет MXL в XLSX. Но умные люди посоветовали, что не нужно плодить обработки и процедуры для одного формата. Поэтому я написал более универсальную процедуру, которая в идеале поддерживает все форматы MS Excel 2003 - 2007, в том числе Dbf, Pdf и таблицы Open (Libre) office. Я включил в процедуру наиболее востребованные по моему мнению форматы. Но каждый для себя может добавить необходимые форматы. Как говорится, MSDN Вам в помощь.

 

Тестировалось на MS Office 2003 с установленным пакетом совместимости и MS Office 2010.

Ниже приведена процедура сохранения табличного документа. Идея проста - табличный документ сохраняется средствами 1С в формате Excel 97, а потом средствами Excel сохраняется в выбранном формате. Прилагается простенькая обработка, демонстрирующая этот метод. Вы можете не скачивать обработку - модуль прост и понятен. А интерфейсную часть реализовать - как Ваша фантазия позволит.

Ограничения:

Необходимо иметь установленный MS Excel 2003 с пакетом совместимости 2007 или MS Excel 2007 - 2010

 

 

// константы форматов 2003
//  xlCSVWindows = 23;
//  xlDBF2 = 7;
//  xlDBF3 = 8;
//  xlDBF4 = 11;
//  xlDIF = 9;
//  xlExcel9795 = 43;
//  xlTextWindows = 20;
//  xlUnicodeText = 42;
//  xlWebArchive = 45;
//  xlXMLSpreadsheet = 46;
//  xlXMLData = 47;

// основные константы 2007
//  These are the main file formats in Excel 2007-2010:
//  51 = xlOpenXMLWorkbook (without macro's in 2007-2010, xlsx)
//  52 = xlOpenXMLWorkbookMacroEnabled (with or without macro's in 2007-2010, xlsm)
//  50 = xlExcel12 (Excel Binary Workbook in 2007-2010 with or without macro's, xlsb)
//  56 = xlExcel8 (97-2003 format in Excel 2007-2010, xls)

//  57 = PDF 
//  60 = xlOpenDocumentSpreadsheet  OpenDocument Spreadsheet

////////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем СоответствиеРасширений;
Перем
СоответствиеВерсий;
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

// Запись табличного документа в формате 2007 EXCEL
//
// Параметры
//  <пТабДок>  - <ТабличныйДокумент> - табличный документ
//  <пИмяФайла>  - <Строка> - имя исходного файла.
//  <пФорматФайла>  - <Число> - константа, определяющая формат файла
//
Процедура ЗаписатьMXLВФормате2007(пТабДок, пИмяФайла, пФорматФайла = 51) Экспорт

    Если НЕ
ЗначениеЗаполнено(пИмяФайла) Тогда Возврат КонецЕсли;
   
ОбъектФайл = Новый Файл(пИмяФайла);
   
Расширение = СоответствиеРасширений.Получить(пФорматФайла);
   
ИмяНовогоФайла = ОбъектФайл.Путь + ОбъектФайл.ИмяБезРасширения + Расширение;
   
ИмяВременногоФайла = КаталогВременныхФайлов() + Лев(Строка(Новый УникальныйИдентификатор), 8) + ".xls";
   
пТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);
   
Excel = Новый COMОбъект("Excel.Application");
    Если
Excel.Version < СоответствиеВерсий.Получить(пФорматФайла) Тогда
       
Сообщить("В текущей версии Excel выбранный формат файла не поддерживается. Преобразование не выполнено!", СтатусСообщения.Важное);
       
Excel.Quit();
       
Excel = Неопределено;
        Возврат;
    КонецЕсли;
   
Excel.Visible = Ложь;
   
Excel.DisplayAlerts = Ложь;//чтобы EXCEL не спрашивал о перезаписи файла
   
КнигаExcel = Excel.WorkBooks.Open(ИмяВременногоФайла);
    Попытка
        Если
пФорматФайла = 57 Тогда //PDF
           
КнигаExcel.ExportAsFixedFormat(0, ИмяНовогоФайла, 0);
        Иначе
           
КнигаExcel.SaveAs(ИмяНовогоФайла, пФорматФайла);
        КонецЕсли;
    Исключение
       
Сообщить("Не удалось сохранить файл: " + ОписаниеОшибки());
    КонецПопытки;
   
КнигаExcel.Close();
   
Excel.DisplayAlerts = Истина;
   
Excel.Quit();
   
Excel = Неопределено;
   
УдалитьФайлы(ИмяВременногоФайла);

КонецПроцедуры
// ЗаписатьВФормате2007()

////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА

////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ

СоответствиеРасширений = Новый Соответствие;
СоответствиеРасширений.Вставить(51, ".xlsx");
СоответствиеРасширений.Вставить(45, ".mht");
СоответствиеРасширений.Вставить(46, ".xml");
СоответствиеРасширений.Вставить(23, ".csv");
СоответствиеРасширений.Вставить(9".dif");
СоответствиеРасширений.Вставить(8".dbf");
//работает только в 2007
СоответствиеРасширений.Вставить(47, ".xml");
СоответствиеРасширений.Вставить(57".pdf");
СоответствиеРасширений.Вставить(60".ods");

СоответствиеВерсий = Новый Соответствие;
СоответствиеВерсий.Вставить(51, "11.0");
СоответствиеВерсий.Вставить(45, "11.0");
СоответствиеВерсий.Вставить(46, "11.0");
СоответствиеВерсий.Вставить(23, "11.0");
СоответствиеВерсий.Вставить(9"11.0");
СоответствиеВерсий.Вставить(8"11.0");
//работает только в 2007
СоответствиеВерсий.Вставить(47, "12.0");
СоответствиеВерсий.Вставить(57,"12.0");
СоответствиеВерсий.Вставить(60,"12.0");

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Сохранение в формате 2007
.epf 9,53Kb
03.10.11
74
.epf 9,53Kb 74 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Ийон Тихий (cool.vlad4) 01.10.11 15:04
Была же функция сохранения, но только в pdf? Я думаю они не сильно отличаются...
2. ediks (ediks) 01.10.11 15:34
(1) Как-то не прижилась рассылка в PDF. Нужен именно Excel.
Хотя PDF у нас тоже используется, но для других целей.
3. Ийон Тихий (cool.vlad4) 01.10.11 15:37
(2) ну, я немного не то имел ввиду;-)
4. ediks (ediks) 01.10.11 15:45
(3) Если имеется в виду Надстройка 2007 Microsoft Office: сохранение в формате PDF (Майкрософт), то она устанавливается только для 2007. Для MS Office 2003 такой надстройки нет. А у нас в основном используется 2003.
Но, наверное, можно применить точно такой же принцип и для PDF. Только надо найти константу формата при использовании SaveAs :)
5. Ийон Тихий (cool.vlad4) 02.10.11 20:46
(4) Как раз на это я и намекал
Но, наверное, можно применить точно такой же принцип и для PDF. Только надо найти константу формата при использовании SaveAs :)
с точностью до наоборот ...на портале уже 2 или 3 раза публиковали ф-цию сохранения в pdf. Отличаются они несильно. Я, то не против нет...но как мне кажется нерационально для каждого формата по статье.
6. Ийон Тихий (cool.vlad4) 02.10.11 20:51
Вот кстати и совет - напишите сразу ф-цию сохранения в разные форматы - pdf, csv, чего там еще, xml - для полноты картины.
7. Доржи Балбаров (Angeros) 03.10.11 05:17
Т.е. как я понял процедура берет xls открывает его втихую екселем и сохраняет как xlsx.

Кстати у метода есть ограничения. попробуйте проделать такой фокус с таблой где число колонок более 256 либо строк более чем 65535.
8. Яков Коган (Yashazz) 03.10.11 10:36
(7) Кстати да, а для таблицы, например, в 80000 строк есть шансы сохранить в эксель? Чтоб сразу в xlsx безо всяких скрытных открытий-переоткрытий через com? Например, получается ли через ADO или, допустим, csv (не как текстовый)?
9. ediks (ediks) 03.10.11 10:41
(7) Естественно, ограничение по количеству колонок и строк никто не отменял. Но это ограничение скорее не метода, а MS Excel до версии 2003 включительно. В 2007 ограничения не такие жесткие - 16к колонок и 1М строк.
Если есть метод сохранить MXL в XLS средствами платформы 8.1, обходящий это ограничение - в студию.
10. Доржи Балбаров (Angeros) 03.10.11 13:16
(8)Лично не пробовал но через ком или адо проблем не должно быть.
11. Василий Пупкин (Vitaslon) 03.10.11 19:37
а чем вам мешает штатный механизм? через файл-сохранить копию
12. ediks (ediks) 03.10.11 20:06
(11) Через штатный механизм файл получается очень большим, я это подробно описал в начале статьи. Попробуйте MXL сохранить средствами платформы 8.1, а потом сохранить в формате xlsx в Excel. Только файл возьмите размером в несколько Мб, чтобы почувствовать разницу.
13. ediks (ediks) 03.10.11 20:49
(5) А такой вариант годится?
14. Ийон Тихий (cool.vlad4) 03.10.11 20:52
(13) ну, вот, теперь больше нет необходимости делать по статье на каждый формат
15. Василий Пупкин (Vitaslon) 03.10.11 21:02
(12)
извеняюсь
читал быстро, и видемо это я пропустиЛ)
16. Алексей Северянин (Ledokol-alt) 31.10.11 22:19
Спасибо, ediks, очень пригодилась статья!
17. Михаил (Santur) 05.12.11 19:07
В 2003 есть вот такая константа
//  xlDBF3 = 8;
,
а вот в 2010 офисе этот формат не прокатывает, постоянно выдает ошибку
Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Excel): Метод SaveAs из класса Workbook завершен неверно

Можно ли в 2010 офисе сохранить в формате xlDBF3 ???
18. ediks (ediks) 06.12.11 09:38
(17) Сейчас попробовал под Excel 2003 сохранить mxl в DBF III - все ОК. Вечером попробую под 2010. Не пробовали mxl сохранить в xls, а потом в Excel сохранить в DBF III? Может Excel в принципе не может сохранить такой файл? Может какие-нибудь заголовки мешают? По идее, в файле должны быть только колонки данных без всяких красивостей и т.д. и т.п.
19. ediks (ediks) 06.12.11 09:53
(17) Попробовал конвертировать файл отчета с заголовком - получил ошибку SaveAs. Удалил заголовки - все ОК.
20. Михаил (Santur) 06.12.11 11:59
(18) ediks, я из 1С сохраняю в xls и потом открываю этот xls и пытаюсь сохранить в dbfIII
oBook.SaveAs(КаталогЭкспортаДанных+"\"+ИмяDbfФайла, 8, , , , , , , , 866);

Файл Excel выглядит след. образом
зы: аттач - выгрузка в xls из демо базы ЗУП
21. ediks (ediks) 06.12.11 13:24
(20) Попробуйте удалить строки в файле с 1 по 6 и сохранить в ДБФ. Что получится? Я писал в (19), что удалил заголовки и у меня сохранился ДБФ.
22. Михаил (Santur) 07.12.11 11:27
(21) ediks, удалил сверху непосредственно все, до лиц. счетов, ФИО и сумм...и все равно собака выдает ошибку "....Метод SaveAs из класса Workbook завершен неверно"
я начинаю подозревать, что причина в том, что у ячеек не указан формат, т.е. в mxl он не заполнен, если смотреть в xls, то стоит общий.
23. ediks (ediks) 07.12.11 21:08
(22) тут ничего не могу сказать - пути Microsoft неисповедимы. Если сам Великий и Ужасный Excel не может сохранить свой xls, то никакая обработка 1С не спасет.
24. Жека Moscow (SpartakM) 07.02.12 22:25
Подскажите, а если нет установленного Excel на компьютере, а при сохранении средствами платформы, создается файл 20мб, и картинки все "съезжают" со своих мест. Если сохранять этот же файл опен офисом, через сохранить как, устанавливаю тот же формат (Excel 2003-2007), и размер файла уменьшается до 2-3мб.
Так вот, вопрос, может знаете, как сохранять, чтобы файл сразу создавался размером 2-3мб, а не 20мб.
25. ediks (ediks) 08.02.12 07:27
(24) Как уменьшить средствами 1С размер файла я не знаю. В самом Excel 2003 где-то есть пункт меню - сжать картинки. Платформа 8.2 умеет сохранять в формате Excel 2007.
26. Андрей (andru_dv) 15.02.12 00:31
Спасибо, полезная обработка!
27. Seven2000 (Seven2000) 29.03.12 11:34
Здравствуйте!

А как Word-овский документ, созданный в 1С, сохранить в PDF?
28. ediks (ediks) 29.03.12 19:56
(27) Указать в параметрах пФорматФайла = 57 процедуры Процедура ЗаписатьMXLВФормате2007(пТабДок, пИмяФайла, пФорматФайла = 51). Но это прокатит только в Office 2007 и старше
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа