Зачем это нужно? Дело в том, что при сохранении табличного документа в формате 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»);
Была же функция сохранения, но только в pdf? Я думаю они не сильно отличаются…
(1) Как-то не прижилась рассылка в PDF. Нужен именно Excel.
Хотя PDF у нас тоже используется, но для других целей.
(2) ну, я немного не то имел ввиду;-)
(3) Если имеется в видуНадстройка 2007 Microsoft Office: сохранение в формате PDF (Майкрософт) , то она устанавливается только для 2007. Для MS Office 2003 такой надстройки нет. А у нас в основном используется 2003.
Но, наверное, можно применить точно такой же принцип и для PDF. Только надо найти константу формата при использовании SaveAs 🙂
(4) Как раз на это я и намекал
с точностью до наоборот …на портале уже 2 или 3 раза публиковали ф-цию сохранения в pdf. Отличаются они несильно. Я, то не против нет…но как мне кажется нерационально для каждого формата по статье.
Вот кстати и совет — напишите сразу ф-цию сохранения в разные форматы — pdf, csv, чего там еще, xml — для полноты картины.
Т.е. как я понял процедура берет xls открывает его втихую екселем и сохраняет как xlsx.
Кстати у метода есть ограничения. попробуйте проделать такой фокус с таблой где число колонок более 256 либо строк более чем 65535.
(7) Кстати да, а для таблицы, например, в 80000 строк есть шансы сохранить в эксель? Чтоб сразу в xlsx безо всяких скрытных открытий-переоткрытий через com? Например, получается ли через ADO или, допустим, csv (не как текстовый)?
(7) Естественно, ограничение по количеству колонок и строк никто не отменял. Но это ограничение скорее не метода, а MS Excel до версии 2003 включительно. В 2007 ограничения не такие жесткие — 16к колонок и 1М строк.
Если есть метод сохранить MXL в XLS средствами платформы 8.1, обходящий это ограничение — в студию.
(8)Лично не пробовал но через ком или адо проблем не должно быть.
а чем вам мешает штатный механизм? через файл-сохранить копию
(11) Через штатный механизм файл получается очень большим, я это подробно описал в начале статьи. Попробуйте MXL сохранить средствами платформы 8.1, а потом сохранить в формате xlsx в Excel. Только файл возьмите размером в несколько Мб, чтобы почувствовать разницу.
(5) А такой вариант годится?
(13) ну, вот, теперь больше нет необходимости делать по статье на каждый формат
(12)
извеняюсь
читал быстро, и видемо это я пропустиЛ)
Спасибо, ediks, очень пригодилась статья!
В 2003 есть вот такая константа
,
а вот в 2010 офисе этот формат не прокатывает, постоянно выдает ошибку
Можно ли в 2010 офисе сохранить в формате xlDBF3 ???
(17) Сейчас попробовал под Excel 2003 сохранить mxl в DBF III — все ОК. Вечером попробую под 2010. Не пробовали mxl сохранить в xls, а потом в Excel сохранить в DBF III? Может Excel в принципе не может сохранить такой файл? Может какие-нибудь заголовки мешают? По идее, в файле должны быть только колонки данных без всяких красивостей и т.д. и т.п.
(17) Попробовал конвертировать файл отчета с заголовком — получил ошибку SaveAs. Удалил заголовки — все ОК.
(18) я из 1С сохраняю в xls и потом открываю этот xls и пытаюсь сохранить в dbfIII
Файл Excel выглядитслед. образом
зы: аттач — выгрузка в xls из демо базы ЗУП
(20) Попробуйте удалить строки в файле с 1 по 6 и сохранить в ДБФ. Что получится? Я писал в (19), что удалил заголовки и у меня сохранился ДБФ.
(21) удалил сверху непосредственно все, до лиц. счетов, ФИО и сумм…и все равно собака выдает ошибку «….Метод SaveAs из класса Workbook завершен неверно»
я начинаю подозревать, что причина в том, что у ячеек не указан формат, т.е. в mxl он не заполнен, если смотреть в xls, то стоит общий.
(22) тут ничего не могу сказать — пути Microsoft неисповедимы. Если сам Великий и Ужасный Excel не может сохранить свой xls, то никакая обработка 1С не спасет.
Подскажите, а если нет установленного Excel на компьютере, а при сохранении средствами платформы, создается файл 20мб, и картинки все «съезжают» со своих мест. Если сохранять этот же файл опен офисом, через сохранить как, устанавливаю тот же формат (Excel 2003-2007), и размер файла уменьшается до 2-3мб.
Так вот, вопрос, может знаете, как сохранять, чтобы файл сразу создавался размером 2-3мб, а не 20мб.
(24) Как уменьшить средствами 1С размер файла я не знаю. В самом Excel 2003 где-то есть пункт меню — сжать картинки. Платформа 8.2 умеет сохранять в формате Excel 2007.
Спасибо, полезная обработка!
Здравствуйте!
А как Word-овский документ, созданный в 1С, сохранить в PDF?
(27) Указать в параметрах пФорматФайла = 57 процедуры Процедура ЗаписатьMXLВФормате2007(пТабДок, пИмяФайла, пФорматФайла = 51). Но это прокатит только в Office 2007 и старше