Используем 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 не будет опубликован. Обязательные поля помечены *