Используем XML Spreadsheet для выгрузки в Excel

Как выгрузить данные в хорошо оформленный  Excel отчет, без вызова Еxcel.Application? Попробуем решить эту задачу с помощью XML Spreadsheet, который появился еще в Office XP, но на мой взгляд находится в тени других способов взаимодействия 1С и Excel.

Получить XML Spreadsheet можно сохранив рабочую книгу Excel как «Таблица XML». В результате мы получаем XML документ, c которым можно работать или при помощи Excel,  или как с обычным текстовым документом. Использование второго способа и позволит нам решить поставленную задачу.

Последовательность действий такова: создаем форматированный  шаблон в Excel — заголовки, границы, именованные диапазоны, параметры страницы, сквозные строки (столбцы), и.т.д. Кроме того шаблон может содержать несколько рабочих листов. Сохраняем шаблон как «Таблица XML». В 1С пишем обрабатывающую процедуру, которая считает шаблон, как обычный текстовый файл, вставит в него соответствующие данные и сохранит результат в  рабочую книгу (*.xls).

В данном примере, для простоты мы будем выгружать справочник банков.  Создадим рабочую книгу, отформатируем ячейки, сохраним её как «Таблица XML».

Шаблон отчета

 

 

 

 

 

 

 

 

 

Затем откроем получившийся файл в текстовом редакторе (я рекомендую Notepad++ — мощный удобный и бесплатный). Вставим метки (//1 и //2), ограничивающие строку данных, для того чтобы можно было выделить этот блок при разборе текста (если открыть этот файл в Excel и затем его сохранить, эти символы исчезнут).

Шаблон строки, куда будут выводиться данные, будет выглядеть так:

Шаблон строки данных

 

 

 

 

Далее (в среде 1С) считываем XML-файл в строковую переменную, вырезаем шаблон строки и в цикле создаем набор  строк с нашими данными, заменяя метки _num, _cod и _nam на №п/п, код и наименование банка.  Затем склеиваем полученный набор строк с остальными фрагментами файла и меняем количество строк:

Количество строк

В нашем случае, заменяем ss:ExpandedRowCount=»5″ на ss:ExpandedRowCount=»5+n-1″, где n — количество строк в выборке. И наконец сохраняем  полученную строку в файл, c расширением xls.

Описанный метод применим не только к Excel, но и к другим документам  MS Office.  Относительная простота форматов xml-документов Office  позволяет создавать такие документы «на лету» прямо в коде 1С.

Шаблон создан на Excel 2003,  пример выгрузки  на платформе  8.2.14.537.

35 Comments

  1. mtv:)

    (0) Довольно интересная технология.

    Возьму на заметку. В некоторых случаях может очень даже пригодиться.

    Reply ↓
  2. DoctorRoza

    За работу с xml + однозначно ..

    Reply ↓
  3. Zoomby
    Как выгрузить данные в хорошо оформленный  Excel отчет, без вызова Еxcel.Application?

    Однозначно плюс. Нужно будет попробовать. Спасибо.

    Reply ↓
  4. artbear

    (0) Хочется поставить плюс, но после прочтения описания все-таки не получен ответ на главный вопрос «Как выгрузить данные в хорошо оформленный Excel отчет, без вызова Еxcel.Application» ?

    получили шаблон Excel и что?

    нужно скачать файла из статьи и запустить его в 1С или еще что-то?

    Автор, доработай описание

    ЗЫ качать не хочу, принципиально хочу понять из описания.

    Reply ↓
  5. slimper

    (4) В приложении находится обработка, с открытым кодом и файл шаблона. Если есть приложение, это означает, что весь функционал в нем. Или об этом надо писать большими буквами?

    Reply ↓
  6. medanskiy

    Занимательная технология. Возьму на заметку. Автору плюс.

    Reply ↓
  7. DrAku1a

    Плюс за технологию.

    Как выгрузить данные в хорошо оформленный Excel отчет

    Сформировать табличный документ и сохранить его в Excel средствами 1С — не?

    Reply ↓
  8. slimper

    (7) Да в приведенном примере — делаем руками шаблон, а затем подсовываем его 1С. Но никто не запрещает формировать эти шаблоны программно в среде 1С, ведь это обычные XML файлы — описание их форматов (примеры), причем не только для Excel можно найти в MSDN. Цель публикации, в том, что документы МS Office (2003 и ниже) могут быть представлены в виде XML файлов, а уже как это использовать/не использовать каждый решает сам. Кстати, начиная с Office 2007, Excel, Word и другие уже в нативном виде являются контейнерами XML файлов.

    Reply ↓
  9. see1c.ru

    (8) в дополнение » Office 2007, Excel, Word и другие уже в нативном виде являются контейнерами XML файлов.» , берем файл , например «Книга1.xlsx«, переименовываем в «Книга1.zip«. Распаковываем и смотрим XML 🙂

    Reply ↓
  10. slimper

    (10) Да, именно это я имел ввиду.

    Reply ↓
  11. DrAku1a

    (8)(9)(10) Это все понятно. Молодцы!

    Но я имел в виду, что у 1С имеется свой мкеханизм записи в Excel-файл. Но вот чте-е-ение…… С этим проблемка… И тут наверное проще булет ВК обойтись (по-моему ВК в инете имеются, если что — есть Delphi и компонент TXLSReadWriteII — вооружаемся и пишем).

    Естественно, как вариант — берем *.zlsx — открываем его внутренним zip-упаковщиком, разбираем файлы внутри… Но для этого много и доло MSDN изучать нужно… может тут найдутся добровольцы?

    З.Ы. Кстати, в противоречие себе же вспомнил пару примеров: 1С не работает с книгой, а выгружает только один лист (может понадобиться несколько), и второй — 1С не сохраняет в *.xls поименованные области… Впрочем, еще много чего найти можно при желании — вплоть до макросов.

    Но все-же с простейшим сохранением в XLS справится и сама платформа.

    Reply ↓
  12. cool.vlad4

    (11) TXLSReadWriteII — кажется платный, а чтение и запись xlsx и docx средствами 1С уже делали. Смотри в профиле у Душелова. XML Spreadsheet это, конечно, хорошо, что автор обратил внимание, да вот только если потребуют результат именно в виде xls — все равно придется использовать Excel.Application.

    Reply ↓
  13. artbear
    slimper пишет:(4) В приложении находится обработка, с открытым кодом и файл шаблона. Если есть приложение, это означает, что весь функционал в нем. Или об этом надо писать большими буквами?

    Объясняю как модератор:

    Нужно писать, чтобы человек мог понять из описания, что и как делается в публикации без скачивания файла, у людей за скачивание баллы снимаются, и не хочется, чтобы они зря качали.

    Reply ↓
  14. artbear

    (0) Исправляй описание, иначе сниму публикацию до исправления

    Reply ↓
  15. slimper

    (14) 1.Публикация проходит предмодерацию, на этом этапе никаких замечений не было.

    2.Мне действительно непонятно, что нужно исправлять.

    Reply ↓
  16. slimper

    (11) XML Spreadsheet не поддерживает группировки, диаграммы, модули VBA, а в остальном это полноценная книга Excel.

    Reply ↓
  17. cool.vlad4

    (16) Такие небольшие вопросики — 1. Если сохранять с расширением xls, чем чревато? 2. Как лучше делать шаблоны? Я делаю комментарии <—! Price —> и затем просто заменяю на нужный мне блок. Может есть способ лучше?

    Reply ↓
  18. slimper

    (17) 1.У меня проблем не было. Может быть имел дело с не очень сложными отчетами. 2.Не могу дать конкретного совета. В «нормальных» языках я пользуюсь соответствующими пространствами имен, не прибегая к костылям.

    Reply ↓
  19. artbear

    (15) А (7) и (8) ни о чем не говорит?

    ЗЫ на будущее — премодерация также не гарантия качества, одни модераторы также могут ошибаться, но другие их могут поправить.

    Reply ↓
  20. kapustinag

    Поставил плюс.

    И лишний раз убедился, что эволюция идет по спирали.

    Именно такие решения (подготовка файла-шаблона средствами родного редактора, а затем его программный разбор и наполнение данными) больше десяти лет назад пришлось делать дважды:

    — работа с шаблонами .txt и .html из программы на Си и Pro*C (Oracle-исты поймут)

    — работа с шаблонами .doc, .rtf и .xls из программы на PL/SQL (тоже программный язык от Oracle).

    Reply ↓
  21. cool.vlad4

    (18) В 1С в любом случае придется делать костыли. Ради такой мелочи ВК писать нет смысла. И еще вопрос — а не знаешь как выявить группировки в xml Spreadsheet (это которые outlinelevel)? макросом это очень долго…

    Reply ↓
  22. slimper

    (21) Если я правильно понял о группировках, то:

    Items not persisted in the XML Spreadsheet format include:

    OLE objects

    Drawing shapes

    Charts

    Microsoft® Visual Basic® for Applications (VBA) code

    Groups and outlines

    Custom envelope information

    Может будет полезно:

    Office 2003: XML Reference Schemas

    Reply ↓
  23. Трактор

    Чем эта разработка лучше других?

    http://infostart.ru/public/16215/

    http://infostart.ru/public/19139/

    Reply ↓
  24. cool.vlad4

    (22) спс, блин, так я и думал…эти некрософты не могли нормально сделать работу с группировками…

    (23) Не лучше, просто другая. Это как раз те самые публикации Душелова , о которых я говорил выше — они вобще-то про форматы docx и xlsx, а здесь про способ формирования Excel файла — на основе xml. Удобно делать шаблоны.

    Reply ↓
  25. alon

    Идея интересна своей простотой и неприхотливостью к использованию ВК.

    Но я бы воспользовался технологией XSLT для наполнения шаблона. Все же 1С — не язык работы с текстом.

    Представим, что надо заполнить заголовок, потом одну таблицу на первой странице, потом еще парочку на других. Сколько всяких «_num», «_kod» и «_nam» нам нужно будет заполнить? И как разрастется процедура анализа строк в 1С?

    А вы помните наизусть, чем в xml заменяются спецсимволы типа «<«, «>», «/»..?

    Reply ↓
  26. alon

    …

    Другой вариант — создать простейший xml-файл с данными и преобразовать его в нужный вид с помощью xsl-шаблона. Функции работы с xml доступны в стандартной v7plus, и не придется думать о спецсимволах. А для работы с xsl есть множество инструментов визуальной разработки. Мышкой махать — не программы писать 🙂

    Reply ↓
  27. slimper

    (25)(26) Согласен, можно и так. Как говорил Великий Кормчий — «Пусть расцветают сто цветов».

    Reply ↓
  28. cool.vlad4

    (26) Да, собственно, многие так и делают — http://www.codeproject.com/KB/office/XMLSS_Transformation_-_XL.aspx

    Reply ↓
  29. artbear

    Полуофф. Народ, где можно почитать что-то внятное и не слишком мудреное для работы с xsl-шаблонами/схемами и формированием xml на их базе?

    Чувствую, что-то интересное пропустил 🙂

    Reply ↓
  30. alon

    (29)http://ru.wikipedia.org/wiki/Xslt :#k8SjZc9Dxk)

    Я начинал по книге Валикова Алексея «Технология XSLT» — доступно описано. В продаже нет наверное, в инете найдешь.

    Reply ↓
  31. cool.vlad4

    (29) см. личку

    Reply ↓
  32. vikorn

    Спасибо, интересно

    Reply ↓
  33. svs74

    В принципе неплохой подход. спс автору за труд. Возможно пригодится. Но все же лучше работать с

    Excel.Application на мой взгляд.

    Reply ↓
  34. AVVG

    Да очень классная вещь

    Reply ↓
  35. ZLENKO

    (33) Оно то может и лучше через Excel.Application, да вот только начиная с Excel 2007 почему то работа с ячейками на VBA настолько медленная, что выгрузить что то более менее объемное (типа прайса на несколько тыс. строк) просто нереально из-за быстрой деградации производительности. Перечитал интернет — многие жалуются на VBA в 2007-2010 и никакого решения этой проблемы не видно.

    Пришлось сделать экспорт в два этапа — сначала готовим оформление ячеек в Excel при помощи VBA, а потом вставляем туда данные при помощи программно создаваемого содержимого буфера обмена — программно эмулируем действия пользователя КАНТРРЭЛ-ЦЭ и КАНТРЭЛ-ВЭ. В ближайшее время оформлю это в виде обработки — выложу тут.

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *