LibreOffice и формирование XML

Автор Начинающий Макросер, 1 июня 2016, 11:41

0 Пользователи и 1 гость просматривают эту тему.

Начинающий Макросер

Здравствуйте, уважаемые форумчане.

Помогите пожалуйста вот с каким вопросом:

Можно ли, в Calc(или другой программе офисного пакета) формировать XML файл?

Задача:

существует таблица, в которой в колонках содержатся некоторые значения, к примеру в первом ID, во втором название, в третьем каталог(ID  папки, к которой привязан элемент)

На выходе нужно получить что то типа:
<элементы>
 <элемент>
   <ИД>ID элемента из первого столбца</ИД>
   <Название>Название элемента из второго столбца</Название>
   <Категории>
       <Категория>ID каталога из третьего столбца</Категория>
   </Категории>
 </элемент>
</элементы>

Это нужно для формирования файла, который можно было бы загрузить на сайт.
Сейчас для этого используется файл CSV(создается таблица, потом "сохранить копию" как CSV), но в последний раз макрос наработал в него 25 599 строк, по 109 ячеек каждая = файл занял 52 Мб, и сайт его не осилил =(((


Не могу сориентироваться куда копать в сторону фыгрузки XML из Calc...
Как это можно сделать???

Помогите пожалуйста, буду благодарен за любую помощь...

За ранее спасибо.

JohnSUN

Добро пожаловать на форум, Начинающий Макросер!
А не страшно, что XML будет чуток побольше, чем CSV? А он точно будет длиннее, за счет тегов...
Как варианты решения твоей задачи:
1. Продолжать выгружать в CSV. Только предварительно нарезать данные на несколько отдельных листов приемлемой длины.
2. Писать макрос, который будет разбирать строки данных и формировать текстовый XML-подобный файл
3. Воспользоваться возможностью использовать XSLT (Сервис - Параметры фильтра XML)

Первый вариант - проще всего (поскольку первоначальная работа уже проделана, осталось прикрутить небольшой костыль).
Третий вариант - правильней всего, но потребует дополнительных усилий
Второй вариант - неоднократно сделан, и каждый раз сделан не достаточно хорошо: каждый раз заточен под фиксированный набор данных и четко описанный формат (Гугль в помощь)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Начинающий Макросер

Спасибо за быстрый ответ, уважаемый JohnSUN.

Первый вариант - сайт сам разбивает файл на удобоваримые куски, но сам механизм импорта через CSV "не новый" и давно не обновлялся, импорт занимает более 1.5 часа, а разработчики советуют использовать XML - так как формат обмена стал более популярным и поэтому обновляется его парсер постоянно и скорость самого импорта выше(не могу точно сказать на сколько это соответствует действительности)

А вот второй вариант интереснее:

Если я правильно понял, то во втором варианте, мне нужно открыть текстовый документ и записать туда "просто текст", который выглядит как XML, а потом сохранить копию как сам XML? Правильно?

Третий вариант пока трогать не буду.

Спасибо за наводку.

JohnSUN

Цитата: Начинающий Макросер от  1 июня 2016, 12:59
А вот второй вариант интереснее:

Если я правильно понял, то во втором варианте, мне нужно открыть текстовый документ и записать туда "просто текст", который выглядит как XML, а потом сохранить копию как сам XML? Правильно?
Очень похоже на окончательный вариант, но чревато неприятным глюком - первая строка XML'я у нас какая?
<?xml version="1.0" encoding="UTF-8"?>А при обычной записи в текстовый файл с помощью стандартных Open-Print мы получим, скорее всего, CP-1251. Поэтому писать придется через поток. Пример можно увидеть в стандартной библиотеке Tools, в модуле UCB, процедура называется SaveDataToFile(). Тогда всё должно работать согласованно (имею в виду кодовые страницы)
Цитата: Начинающий Макросер от  1 июня 2016, 12:59
Третий вариант пока трогать не буду.
А может быть и зря! Там, вообще-то, не очень сложно. Вот инструкция
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Начинающий Макросер

Спасибо что указали на этот нюанс, по сайту, там кодировка Windows CP-1251.

Выгрузил катаог товаров через XML, что бы использовать как шаблон, там первая строчка такая:
<?xml version="1.0" encoding="windows-1251"?>

В этом случае тоже черз поток лучше?

JohnSUN

А как раз в этом случае через поток хуже  >:(
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Вячеслав070424

В целях самообучения хочу написать фильтр XML для Calc, для чего, взяв за основу материалы интернета, сделал простой документ и черновик простого преобразования xslt. При проверке столкнулся с тем что преобразование не производится и предполагаю что ошибся в указании пути преобразования.

     <xsl:for-each select="office/table/text">
     <tr>
       <td><xsl:value-of select="title"/></td>
       <td><xsl:value-of select="artist"/></td>
     </tr>



<table:table-cell table:style-name="ce6" office:value-type="string" calcext:value-type="string">
<text:p>The Communards</text:p>
</table:table-cell>
</table:table-row>
<table:table-row table:style-name="ro2">
<table:table-cell table:style-name="ce6" office:value-type="string" calcext:value-type="string">
<text:p>Unchain my heart</text:p>
</table:table-cell>
<table:table-cell table:style-name="ce6" office:value-type="string" calcext:value-type="string">
<text:p>Joe Cocker</text:p>
</table:table-cell>
</table:table-row>
<table:table-row table:style-name="ro1" table:number-rows-repeated="1048548">
<table:table-cell table:number-columns-repeated="2"/>
</table:table-row>
<table:table-row table:style-name="ro1">
<table:table-cell table:number-columns-repeated="2"/>
</table:table-row>
</table:table>
<table:named-expressions/>
</office:spreadsheet>
</office:body>
</office:document>


mikekaganski

Вы не обозначили, что Вы хотите получить; не указали, что за код Вы прикладываете. Я подозреваю, что первый - это собственно сам фильтр, а второй - какой-то случайный кусок исходного документа (почему-то вырезанный из общего XML).

Но XPath в select (может быть) неверный. Что такое "office/table/text"? Вероятнее всего, требуется полное указание неймспейсов; я подозреваю, что указанный путь неверен (и либо требуется добавить отсутствующие промежуточные узлы, либо использовать // "всё что угодно между"). Что такое "title" и "artist"? Где они в исходнике?

В общем, лучше всего приложить и XSL, и исходный документ прямо в сообщение здесь; и обязательно ещё расписать точно, что ожидается в результате (прямо готовый XML).
С уважением,
Михаил Каганский

Вячеслав070424

Цитата: mikekaganski от Вчера в 19:16В общем, лучше всего приложить и XSL, и исходный документ прямо в сообщение здесь
Прикладываю. Хотел получить из таблицы Calc таблицу для веббраузера.
https://disk.yandex.ru/d/jiUEyKZ_1MCAjw
https://disk.yandex.ru/d/QfjPiLjBQCW8Jw

mikekaganski

#9
Цитата: Вячеслав070424 от Сегодня в 09:14Хотел получить из таблицы Calc таблицу для веббраузера

Это не похоже на точное описание ожидаемого результата (в виде "Я хочу получить из этого такой HTML: <html><body>...").

Ну, да неважно. Вы, похоже, просто скопировали фильтр из www.w3schools.com, и не пробовали понять, что это всё значит. Фильтр будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
   xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
   xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">

<xsl:template match="/">
   <html>
   <body>
   <h2>My CD Collection</h2>
   <table border="1">
     <tr bgcolor="#9acd32">
       <th>Title</th>
       <th>Artist</th>
     </tr>
     <xsl:for-each select="office:document/office:body/office:spreadsheet/table:table/table:table-row">
     <tr>
       <td><xsl:value-of select="table:table-cell[1]/text:p"/></td>
       <td><xsl:value-of select="table:table-cell[2]/text:p"/></td>
     </tr>
     </xsl:for-each>
   </table>
   </body>
   </html>
</xsl:template>

</xsl:stylesheet>
С уважением,
Михаил Каганский