Вывод данных в Excel при изменяемых исходных данных и формах вывода.

Автор Тема: Вывод данных в Excel при изменяемых исходных данных и формах вывода.  (Прочитано 26754 раз)

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

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Привет и с новым годом.
Если не отвлеку у меня маленький вопрос:
У меня есть набор данных, мне необходимо из них сформировать таблицу в xlsx файле.
При этом структура исходных данных может меняться и соответственно таблица так же должна меняться. Очевидно что где то вне программы должна быть описана структура данных и куда/как их распихивать.

Условно:
"Бетон В25 W6 F150" ->
в столбец 1 запихнуть "Бетон"
в столбец 2 запихнуть "В25"
в столбец 3 запихнуть "W6"
в столбец 4 запихнуть "F150"

или
"1 ГОСТ5781-82 %%с 12 L= 1000 п.м. 152"
в столбец 1 запихнуть "1"
в столбец 2 запихнуть "ГОСТ5781-82"
в столбец 4 запихнуть "%%с"
в столбец 5 запихнуть "12"
в столбец 6 запихнуть "=столбец5" (формула)
в столбец 7 запихнуть "L="
в столбец 8 запихнуть "1000"
в столбец 9 запихнуть "п.м."
в столбец 10 запихнуть "152"

Как видишь, данные и таблицы разные, собственно вопрос в том, КАК их выгрузить в xlsx с помощью одного кода и описания во внешнем файле? Все что сам придумал при реализации получается очень громоздко и костно.

Есть какие нибудь идеи или подсказки как это сделать красиво? Или может я вообще не с того конца подошел к вопросу?

Для большей наглядности, это один из вариантов того, что должно получиться в итоге:
http://experement.spb.ru/wiki/lib/exe/fetch.php?media=armspec.png


ЗЫ.
Для работы с xlsx использую EPPlus

ЗЫЫ.
По мотивам http://adn-cis.org/forum-rules.html п.4.3
Локализация: Ru-ru (utf-8)
разрядность ПО: x64
Среда выполнения: AutoCAD 2012x64 Rus
ОС: Win 7 x64
.net 4.0
MS Visual Studio 2012 Express
« Последнее редактирование: 21-01-2014, 16:28:47 от Boxa.Shu »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #1 : 10-01-2014, 16:58:07 »
Привет. Я бы пошёл по такому пути:
Данные -> XML [+ XSD [+ XSLT]] -> импорт в Excel.

Пробовал реализовать такой вариант?
« Последнее редактирование: 11-01-2014, 21:35:26 от Андрей Бушман »

Оффлайн xSAKABSx

  • ADN Club
  • Сообщений: 36
  • Карма: 1
Re: Вывод данных в xlsx
« Ответ #2 : 10-01-2014, 17:15:36 »
Привет. Я бы пошёл по такому пути:
Данные -> XML [+ XSD [+ XLST]] -> импорт в Excel.

Пробовал реализовать такой вариант?
по моему все таки проще родными средствами обертки на эксель  проще будет
Данные-> xlsx  там ничего сложного нет ;
если же лень матушка то более простой вариант все это в csv http://ru.wikipedia.org/wiki/CSV

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #3 : 10-01-2014, 17:18:57 »
CSV файлы не содержат информации о форматировании ячеек и их объединениях.

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #4 : 10-01-2014, 17:19:11 »
Нет, не пробовал. Если можно ссылку почитать об этом подробнее.

Все на что меня хватило это состряпать вот такой файлик с описанием и внутри кода проверять на похожесть, читать делитель и соответственно разносить данные в соответствующую колонку 1 (<c name="1">0</c>) из ячейки массива с индексом 0.

НО чувство велосипедо-строительства и раскиданных грабель просто завораживает.

Код - XML [Выбрать]
  1. <root name="Спецификация">
  2.     <like name="Бетон В#* W#* F##*" >
  3.     <Title>Материал</Title>
  4.     <Divide>" "</Divide>
  5.     <C name="1">0</C>
  6.     <C name="2">1</C>
  7.     <C name="2">2</C>
  8.     <C name="4">3</C>
  9.   </like>
  10.  
  11.   <like name="#* ГОСТ5781-82 %%с #* L= #* п.м. #*" >
  12.     <Title>Арматура в п.м.</Title>
  13.     <Divide>" "</Divide>
  14.     <C name="1">0</C>
  15.     <C name="2">1</C>
  16.     <C name="2">2</C>
  17.     <C name="4">3</C>
  18.     <C name="5">4</C>
  19.     <C name="6">5</C>
  20.     <C name="7">6</C>
  21.     <C name="8">7</C>
  22.   </like>
  23.  </root>
  24.  


CSV не вариант, документ много листовой и содержит формулы

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #5 : 10-01-2014, 17:43:09 »
Тут нужно сразу определиться: либо ты настроен на изобретение велосипеда, либо ты готов потратить некоторое время на изучение того, как это делается грамотно. Практика показывает, что 99,9% спрашивающих не готова ко второму варианту.

XML - это универсальный способ передачи, а нередко и хранения данных. Для проверки корректности структуры XML используют файлы XSD, описывающие структуру этих XML. Проверка на соответствие XSD может выполняться в т. ч. и программно. Визуальное отображение XML контента (например в браузере, хотя и не только в нём) управляется с помощью файлов XSLT. Форматы XSD и XSLT - это тот же самый XML.

Во вложении архив, содержащий в себе несколько плагинов. Каждый плагин имеет в себе определённый набор файлов XML, XSD и XSLT. Непосредственно в каталогах плагинов находится файл readme.html. Открой этот файл в браузере Internet Explorer (для корректного отображения в Google Chrom потребуется указать специальную опцию при запуске).

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

Если это у тебя не вызывает отторжения, то возможно имеет смысл продолжить разговор в обозначенном мною направлении.

P.S. Ты можешь кликнуть мышкой на страничке и из контекстного меню выбрать пункт "Просмотр HTML-кода". В этом случае откроется исходный код XML и ты сможешь его посмотреть.
« Последнее редактирование: 11-01-2014, 21:43:47 от Андрей Бушман »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #6 : 10-01-2014, 17:57:16 »
На тот случай, если захочешь разобраться как это работает (в обозначенных мною примерах архива), выкладываю подробный файл справки - acadPluginDevelop.zip.

Вся выше обозначенная присказка с XML+XSD+XSLT была вот ради чего - см. вложенные изображения (кликни мышкой, чтобы увеличить их). Примеры плагинов даны лишь для наглядной демонстрации того, как обозначенные технологии работают в связке.
« Последнее редактирование: 11-01-2014, 21:33:57 от Андрей Бушман »

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #7 : 11-01-2014, 17:37:41 »
Если я правильно понимаю и копаю в правильном направлении, то мне поможет xslt,
а конкретнее функция fn:tokenize
и элемент XSL:IF

Копаю в правильном направлении?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #8 : 11-01-2014, 21:43:00 »
XSLT предназначен для преобразования "на лету" формата XML в любой нужный тебе формат. Я использовал его для представления XML в читабельной форме в виде HTML.  В твоём случае, если ты не планируешь просматривать XML в браузере, то вполне достаточно связки XML + XSD (Excel при работе с XML не использует XSLT, но использует XSD).

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #9 : 13-01-2014, 08:31:06 »
Видимо я совсем не понятно объясняю, потому как никакой конкретики пока нет.... Попробую написать что есть и что надо получить.

Есть вот это:
Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="utf-16"?>
  2. <ArrayOfString>
  3.   <string>Бетон В25 W6 F150 5797</string>
  4.   <string>1 ГОСТ 5781-82 %%С12 L=1000 57774</string>
  5.   <string>Кр 1 31</string>
  6. </ArrayOfString>
  7.  

Получить надо вот это, excel документ в виде xml (не ругайте за форматирование, это сгенерировано  О.О.оrg):

Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  3.         <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  4.                 <Colors>
  5.                         <Color>
  6.                                 <Index>3</Index>
  7.                                 <RGB>#c0c0c0</RGB>
  8.                         </Color>
  9.                         <Color>
  10.                                 <Index>4</Index>
  11.                                 <RGB>#ff0000</RGB>
  12.                         </Color>
  13.                 </Colors>
  14.         </OfficeDocumentSettings>
  15.  
  16.         <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  17.                 <WindowHeight>9000</WindowHeight>
  18.                 <WindowWidth>13860</WindowWidth>
  19.                 <WindowTopX>240</WindowTopX>
  20.                 <WindowTopY>75</WindowTopY>
  21.                 <ProtectStructure>False</ProtectStructure>
  22.                 <ProtectWindows>False</ProtectWindows>
  23.         </ExcelWorkbook>
  24.  
  25.         <Styles>
  26.                 <Style ss:ID="Default" ss:Name="Default"/>
  27.                 <Style ss:ID="Result" ss:Name="Result">
  28.                         <Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/>
  29.                 </Style>
  30.                 <Style ss:ID="Result2" ss:Name="Result2">
  31.                         <Font ss:Bold="1" ss:Italic="1" ss:Size="10" ss:Underline="Single"/>
  32.                         <NumberFormat ss:Format="Currency"/>
  33.                 </Style>
  34.                 <Style ss:ID="Heading" ss:Name="Heading">
  35.                         <Font ss:Bold="1" ss:Italic="1" ss:Size="16"/>
  36.                 </Style>
  37.                 <Style ss:ID="Heading1" ss:Name="Heading1">
  38.                         <Font ss:Bold="1" ss:Italic="1" ss:Size="16"/>
  39.                 </Style>
  40.                 <Style ss:ID="co1"/>
  41.                 <Style ss:ID="co2"/>
  42.                 <Style ss:ID="co3"/><Style ss:ID="co4"/>
  43.                 <Style ss:ID="co5"/><Style ss:ID="co6"/>
  44.                 <Style ss:ID="co7"/><Style ss:ID="co8"/>
  45.                 <Style ss:ID="co9"/><Style ss:ID="co10"/>
  46.                 <Style ss:ID="ta1"/><Style ss:ID="ce1">
  47.                         <Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
  48.                 </Style>
  49.                 <Style ss:ID="ce2">
  50.                         <Alignment ss:Horizontal="Right" ss:Indent="0"/>
  51.                 </Style><Style ss:ID="ce3">
  52.                         <Alignment ss:Horizontal="Left" ss:Indent="0"/>
  53.                 </Style>
  54.         </Styles>
  55.  
  56.  
  57.         <ss:Worksheet ss:Name="Лист1">
  58.                 <Table ss:StyleID="ta1">
  59.                         <Column ss:Width="28.6583"/>
  60.                         <Column ss:Width="71.0929"/>
  61.                         <Column ss:Width="34.2142"/>
  62.                         <Column ss:Width="34.1008"/>
  63.                         <Column ss:Width="37.8142"/>
  64.                         <Column ss:Width="20.4094"/>
  65.                         <Column ss:Width="31.4362"/>
  66.                         <Column ss:Width="28.5449"/>
  67.                         <Column ss:Width="42.4913"/>
  68.                         <Column ss:Width="64.0063"/>
  69.                        
  70.                         <Row ss:Height="12.8409">
  71.                                 <Cell>
  72.                                         <Data ss:Type="String">Поз.</Data>
  73.                                 </Cell>
  74.                                 <Cell>
  75.                                         <Data ss:Type="String">Обозначение</Data>
  76.                                 </Cell>
  77.                                 <Cell ss:MergeAcross="5" ss:StyleID="ce1">
  78.                                         <Data ss:Type="String">Наименование</Data>
  79.                                 </Cell>
  80.                                 <Cell>
  81.                                         <Data ss:Type="String">Кол-во</Data>
  82.                                 </Cell>
  83.                                 <Cell>
  84.                                         <Data ss:Type="String">Масса, кг.</Data>
  85.                                 </Cell>
  86.                         </Row>
  87.                        
  88.                         <Row ss:Height="12.8409">
  89.                                 <Cell>
  90.                                         <Data ss:Type="Number">1</Data>
  91.                                 </Cell>
  92.                                 <Cell>
  93.                                         <Data ss:Type="String">ГОСТ 5781-82</Data>
  94.                                 </Cell>
  95.                                 <Cell ss:StyleID="ce2">
  96.                                         <Data ss:Type="String">%%С</Data>
  97.                                 </Cell>
  98.                                 <Cell>
  99.                                         <Data ss:Type="Number">12</Data>
  100.                                 </Cell>
  101.                                 <Cell>
  102.                                         <Data ss:Type="String">AIII</Data>
  103.                                 </Cell>
  104.                                 <Cell ss:StyleID="ce2">
  105.                                         <Data ss:Type="String">L=</Data>
  106.                                 </Cell>
  107.                                 <Cell ss:StyleID="ce3">
  108.                                         <Data ss:Type="Number">1000</Data>
  109.                                 </Cell>
  110.                                 <Cell ss:StyleID="ce3"/>
  111.                                 <Cell>
  112.                                         <Data ss:Type="Number">57774</Data>
  113.                                 </Cell>
  114.                                 <Cell ss:Formula="=[.I2]*0.888">
  115.                                         <Data ss:Type="Number">51303.312</Data>
  116.                                 </Cell>
  117.                         </Row>
  118.                         <Row ss:Height="12.8409">
  119.                                 <Cell ss:Index="2">
  120.                                         <Data ss:Type="String">Кр 1</Data>
  121.                                 </Cell>
  122.                                 <Cell ss:Index="9">
  123.                                         <Data ss:Type="Number">31</Data>
  124.                                 </Cell>
  125.                                 <Cell ss:Index="10"/>
  126.                         </Row>
  127.                         <Row ss:Height="12.8409">
  128.                                 <Cell ss:Index="2">
  129.                                         <Data ss:Type="String">Бетон</Data>
  130.                                 </Cell>
  131.                                 <Cell ss:Index="5">
  132.                                         <Data ss:Type="String">В25 W6 F150</Data>
  133.                                 </Cell><Cell ss:Index="8">
  134.                                         <Data ss:Type="String">м3</Data>
  135.                                 </Cell>
  136.                                 <Cell>
  137.                                         <Data ss:Type="Number">5797</Data>
  138.                                 </Cell>
  139.                                 <Cell ss:Formula="=[.I4]*2500">
  140.                                         <Data ss:Type="Number">14492500</Data>
  141.                                 </Cell>
  142.                         </Row>
  143.                 </Table>
  144.         <x:WorksheetOptions/>
  145.         </ss:Worksheet>
  146.  
  147.         <ss:Worksheet ss:Name="Лист2">
  148.                 <Table ss:StyleID="ta1">
  149.                         <Column ss:Width="64.0063"/>
  150.                         <Row ss:AutoFitHeight="0" ss:Height="12.8409">
  151.                                 <Cell ss:Index="1"/>
  152.                         </Row> 
  153.                 </Table>
  154.                 <x:WorksheetOptions/>
  155.         </ss:Worksheet>
  156.  
  157.         <ss:Worksheet ss:Name="Лист3">
  158.                 <Table ss:StyleID="ta1">
  159.                         <Column ss:Width="64.0063"/>
  160.                         <Row ss:AutoFitHeight="0" ss:Height="12.8409">
  161.                                 <Cell ss:Index="1"/>
  162.                         </Row>
  163.                 </Table>
  164.                 <x:WorksheetOptions/>
  165.         </ss:Worksheet>
  166. </Workbook>
  167.  


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

Собственно мне нужно подтверждение от более опытных коллег, в правильности выбранной технологии и отсутствия велосипеда.
Если все хорошо, то порекомендуйте книгу для вдумчивого изучения xslt.
« Последнее редактирование: 13-01-2014, 12:29:12 от Boxa.Shu »

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #10 : 13-01-2014, 12:10:31 »
Вроде бы все правильно и технология  подходит.
Исходные данные:
Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ArrayOfString>
  3.   <string>Бетон В25 W6 F150 5797</string>
  4.   <string>Бетон В30 W8 F150 800</string>
  5.   <string>Бетон В7.5 W0 F50 70</string>
  6.   <string>1 ГОСТ 5781-82 %%С6 L=1000 5774</string>
  7.   <string>2 ГОСТ 5781-82 %%С8 L=1250 10</string>
  8.   <string>3 СТО АСПЧ %%С18 L=1750 300</string>
  9.   <string>7 СТО АСПЧ %%С12 L=11700 450</string>
  10.   <string>10 СТО АСПЧ %%С22 L=12000 500</string>
  11.   <string>Кр 1 31</string>
  12.   <string>Кр 2 74</string>
  13.   <string>Кр 5 1</string>
  14. </ArrayOfString>
  15.  

Шаблон XLST
Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version = "1.0"
  3.     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4. <xsl:template match="ArrayOfString">
  5.     <xsl:for-each select="string">
  6.         <xsl:if test="contains(string(), 'ГОСТ')">
  7.          <p align="left">
  8.                 <b color="red"><xsl:value-of select="substring-before(string(), ' ')"/></b>
  9.                 <i><xsl:value-of select="substring-before(substring-after(string(), ' '),'%%С')"/></i>
  10.             <b>%%С<xsl:value-of select="substring-before(substring-after(substring-after(string(), ' '),'%%С'),'L=')"/></b>
  11.               <i>L=<xsl:value-of select="substring-before(substring-after(substring-after(substring-after(string(), ' '),'%%С'),'L='),' ')"/></i>  
  12.                 <b><xsl:value-of select="substring-after(substring-after(substring-after(substring-after(string(), ' '),'%%С'),'L='),' ')"/></b>
  13.         </p>
  14.         </xsl:if>
  15.     </xsl:for-each>
  16.  
  17.     <xsl:for-each select="string">
  18.         <xsl:if test="contains(string(), 'СТО')">
  19.          <p align="left">
  20.                 <b color="red"><xsl:value-of select="substring-before(string(), ' ')"/></b>
  21.                 <i><xsl:value-of select="substring-before(substring-after(string(), ' '),'%%С')"/></i>
  22.             <b>%%С<xsl:value-of select="substring-before(substring-after(substring-after(string(), ' '),'%%С'),'L=')"/></b>
  23.               <i>L=<xsl:value-of select="substring-before(substring-after(substring-after(substring-after(string(), ' '),'%%С'),'L='),' ')"/></i>  
  24.                 <b><xsl:value-of select="substring-after(substring-after(substring-after(substring-after(string(), ' '),'%%С'),'L='),' ')"/></b>
  25.         </p>
  26.         </xsl:if>
  27.     </xsl:for-each>
  28.  
  29.  
  30.     <xsl:for-each select="string">
  31.         <xsl:if test="starts-with(string(), 'Кр')">
  32.                 <p align="left">
  33.                         <b><xsl:value-of select="substring-before(string(), ' ')"/></b>
  34.                         <i><xsl:value-of select="substring-before(substring-after(string(), ' '), ' ')"/></i>
  35.                         <b><xsl:value-of select="substring-after(substring-after(string(), ' '), ' ')"/></b>
  36.                 </p>
  37.         </xsl:if>
  38.     </xsl:for-each>
  39.  
  40.     <xsl:for-each select="string">
  41.         <xsl:if test="starts-with(string(), 'Бетон')">
  42.                 <p align="left">
  43.                         <b><xsl:value-of select="substring-before(string(), ' ')"/></b>
  44. <i><xsl:value-of select="substring-before(substring-after(string(), ' '),substring-after(substring-after(substring-after(substring-after(string(), ' '),' '),' '),' '))"/></i>
  45. <b><xsl:value-of select="substring-after(substring-after(substring-after(substring-after(string(), ' '),' '),' '),' ')"/></b>
  46.  
  47.                 </p>
  48.         </xsl:if>
  49.     </xsl:for-each>
  50. </xsl:template>
  51. </xsl:stylesheet>
  52.  

И результат (не пинайте за корявость, важно было помсотреть вообще возможность разобрать строчки):


ЗЫ.
Отладчит и просмотрщик для xslt брал тут Отладчик XSL

ЗЫЫ.
Как убрать код под кат?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #11 : 13-01-2014, 12:47:36 »
порекомендуйте книгу для вдумчивого изучения xslt.
Хорошую книгу по XSLT я рекомендовал здесь.

Теперь по поводу
никакой конкретики пока нет....
Я тебе обозначил способ, при котором для одних и тех же данных XML ты можешь формировать совершенно разные визуальные представления, за счёт подключения того или иного XSLT файла. Насколько я тебя понял, ты именно об этом спрашивал - о том, как для одних и тех же данных формировать разные визуальные представления, не внося правку в код и в исходную структуру данных (с последующим импортом результата преобразований в MS Excel).

Например в браузере твой XML будет выглядеть как HTML страничка с грамотно оформленной таблицей (цвета, толщины, объединения ячеек, ширины столбцов и т.д. и т.п.). Но по факту, за кулисами это будет не HTML а XML, в чём ты можешь убедиться, выбрав в браузере из контекстного меню этой страницы пункт "Просмотр HTML-кода".

Если ты хочешь быть уверенным в корректности структуры XML, с которым ты работаешь, то для этого подключаешь к нему свою схему XSD.

Теперь по поводу импорта в Excel результата, сгенерированного посредством XSLT...

К сожалению, MS Excel пока не в состоянии самостоятельно корректно обрабатывать XSLT, поэтому в справке Excel рекомендуется сохранить результат преобразования XSLT в файл и затем производить импорт именно этого сохранённого результата (выше я показывал скрин справки и красным обвёл этот момент).

Собственно, как ты уже знаешь, программно результат применения XSLT получаем так:

Код - C# [Выбрать]
  1. String inputFile = @".\in.xml";
  2. String transformFile = @".\in.xsl";
  3. String outputFile = @".\out.xml";
  4. UTF8Encoding encoding = new System.Text.UTF8Encoding(false); // UTF-8 без BOM
  5. XslCompiledTransform myXslTransform = new XslCompiledTransform();
  6. myXslTransform.Load(transformFile);
  7. using (XmlReader reader = XmlReader.Create(inputFile)) {
  8.         using (MemoryStream ms = new MemoryStream()) {
  9.                 using (XmlWriter writer = XmlWriter.Create(ms)) {
  10.                         myXslTransform.Transform(reader, writer);
  11.                         ms.Flush();
  12.                         ms.Position = 0;
  13.                         using (XmlReader reader2 = XmlReader.Create(ms)) {
  14.                                 XDocument xmlDoc = XDocument.Load(reader2, LoadOptions.None);
  15.                                 xmlDoc.Declaration.Encoding = encoding.ToString();
  16.                                 using (XmlTextWriter writer2 = new XmlTextWriter(outputFile, encoding)) {
  17.                                         writer2.Formatting = Formatting.Indented;
  18.                                         xmlDoc.Save(writer2);
  19.                                 }
  20.                         }
  21.                 }
  22.         }
  23. }

При желании можно выполнить это и вручную, хотя это будет и не самый лучший вариант... Пошаговое описание действий, выполняемых вручную (скрины к ним смотри ниже) по импорту XML данных в Excel в том виде, в котором благодаря XSLT они отображаются в браузере:

1. В браузере открываешь свой XML файл, к которому подключен нужный тебе XSLT, и отображаемую страницу ты первым делом сохраняешь (Ctrl + S) как HTML файл.

2. В MS Excel запускаешь команду импорта XML.

3. В диалоговом окне Выбор источника данных в качестве фильтра указываешь Все файлы и выбираешь сохранённый тобой HTML файл.

4. В диалоговом окне Создание веб-запроса устанавливаешь галочку возле левого верхнего угла твоей таблицы и затем жмёшь кнопку Параметры...

5. В диалоговом окне Настройка веб-запроса выбираешь опцию Полностью формат HTML и жмёшь кнопку Ок.

6. Теперь в диалоговом окне Создание веб-запроса жмёшь кнопку Импорт.

7. Откроется диалоговое окно Импорт данных, в котором ты можешь указать левую верхнюю ячейку для вставки данных, а так же, при необходимости, настроить некоторые свойства. Жми кнопку Ок.

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

Прилагаю модифицированную под твой вопрос копию плагина SelSim - копия.zip (для наглядности, именно с неё сделаны скрины). В этой модификации я внёс изменения в файл ./support/appinfo.xslt (убрал лишнюю информацию, не нужную для данного примера), дабы в браузере содержимое файла ./settings/info/appinfo.xml отображалось лишь в виде таблицы, игнорируя ту часть данных, которая к таблице не относится. Попробуй выполнить обозначенные мною выше пункты 1-7 на файле ./settings/info/appinfo.xml, для примера.[/code]
« Последнее редактирование: 14-01-2014, 16:33:15 от Андрей Бушман »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #12 : 13-01-2014, 13:13:32 »
Вроде бы все правильно и технология  подходит.
Т. е. вопрос решён, как я понял? :) Кстати, в твоём XML не указано подключение к XSLT. Должно присутствовать нечто подобное:
Код - XML [Выбрать]
  1. <?xml-stylesheet type="text/xsl" href="./someXsltFileName.xslt"?>

Отладчит и просмотрщик для xslt брал тут Отладчик XSL

Не пользовался, гляну как время будет. Я писал в редакторе MS VS и в Notepad++ (когда как), результаты смотрел в браузере.

Как убрать код под кат?

Это к модераторам. :)
« Последнее редактирование: 13-01-2014, 13:37:36 от Андрей Бушман »

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #13 : 13-01-2014, 14:32:00 »
Предполагалось что все это будет работать как то вот так:

Собственно шаблон в xml не прописан, потому что я хочу иметь возможность выбирать какой шаблон использовать
и вставлять программно:
Код - vb.net [Выбрать]
  1. ''# load style sheet
  2. transformer = New XslTransform()
  3. transformer.Load("firelist.xslt")

Да, ответ на свой вопрос я получил. Велосипедостроения избежал. За что огомное спасибо.
Так же замечу, что приведенный выше xml с таблицей, спокойно и без плясок, открывается в Excel и все формулы работают.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #14 : 15-01-2014, 10:00:56 »
Код, который я привёл выше в сообщении #11, можно оптимизировать, записав решение более компактно и не прибегая к помощи дополнительного буфера (как я это сделал в первом варианте):

Код - C# [Выбрать]
  1. String inputFile = @".\in.xml";
  2. String outputFile = @".\out2.xml";
  3. String transformFile = @".\in3.xsl";
  4. UTF8Encoding encoding = new System.Text.UTF8Encoding(false); // UTF-8 без BOM
  5. XslCompiledTransform myXslTransform = new XslCompiledTransform();
  6. myXslTransform.Load(transformFile);
  7. XmlWriterSettings xws = myXslTransform.OutputSettings.Clone();
  8. xws.Encoding = encoding;
  9. xws.Indent = true; // не лепить результат в одну строку
  10. using (XmlWriter xw = XmlWriter.Create(outputFile, xws)) {
  11.         myXslTransform.Transform(inputFile, xw);
  12. }

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #15 : 20-01-2014, 21:05:48 »
 MS Excel не тримет данные самостоятельно и потому вываливается! OOorg или LiberOfice  справляются с этим самостоятельно.
А поэтому для ячеек типа namber нужно предусмотреть очистку данных от лишних пробелов.

          <Cell>
          <!-- Это очень важно! -->
            <Data ss:Type="Number">
              <xsl:value-of select="normalize-space(substring-before(string(), ' '))" />
            </Data>
          </Cell>

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Вывод данных в xlsx
« Ответ #16 : 21-01-2014, 14:31:08 »
Для чтения/генерации готовых xlsx без наличия экселя есть ещё OpenXML SDK от майкрософт. Удобно тем, что можно использовать LINQ, и оно строго типизировано.
Алексей

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #17 : 21-01-2014, 15:26:21 »
Вы не внимательно читали первое сообщение. Вот это предложение:
Цитировать
При этом структура исходных данных может меняться и соответственно таблица так же должна меняться. Очевидно что где то вне программы должна быть описана структура данных и куда/как их распихивать.

Глубоко в Open XML SDK я не залезал, ограничился http://habrahabr.ru/post/109820/
Как я понял, Open XML SDK позволяет получить код по уже имеющемуся документу/шаблону. Вот только если я захочу подправить формулу в документе, мне перекомпилировать всю программу?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #18 : 21-01-2014, 15:42:22 »
если я захочу подправить формулу в документе, мне перекомпилировать всю программу?
А это смотря как написать. Если подобные вещи ты не зашиваешь в коде, а хранишь во внешнем файле настроек и читаешь их оттуда по мере необходимости, то не придётся.

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Вывод данных в xlsx
« Ответ #19 : 21-01-2014, 15:48:19 »
Почему же. Используйте в качестве шаблонов xlsx-файлы. Нужно что там поменять - меняйте в шаблоне. При этом адреса ячеек для заполнения прописывайте в отдельном xml-файле. Это если формулу поменять, а вот если структуру данных - нужно получше подумать, но тоже реализуемо без особых велосипедов, ИМХО
Алексей

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #20 : 21-01-2014, 15:58:57 »
Используйте в качестве шаблонов xlsx-файлы
И насколько же корректно LibreOffice будет работать с xlsx? Я помню был свидетелем (неоднократно) различного рода проблем, как по части форматирования, так и по части неуспешного (порой) открытия файла. Сейчас точно не помню, но кажется в MS Excel не удавалось открыть xls файл, отредактированный в LibreOffice, а те, что открывались - нередко имели вид отличный от того, который отображается в LibreOffice (порой отличия не существенны, но тем не менее).

Далее... Насколько я знаю, у автора темы повсеместно используется именно LibreOffice, однако весьма вероятно, что результат ему придётся передать в стороннюю организацию, которая использует как раз MS Excel.

Кроме того, похоже что ты не уловил основную "фичу", желаемую автором: отделить содержимое от представления. Именно это он получает в случае использования XML + XSLT.

Оффлайн Владимир ШуАвтор темы

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вывод данных в xlsx
« Ответ #21 : 21-01-2014, 16:02:17 »
Хорошо, более радикальный пример:
У меня изменился состав исходных данных и форма таблицы куда выводить данные.
Пример:
Сейчас я считаю армирование и вывожу данные в соответствии с по  ГОСТ 21.101-97. ПРИЛОЖЕНИЕ Ж. Форма 7,
а захочу использовать программу и для составления спецификаций трубопроводов по ГОСТ 21.401-88. Приложение 9. Спецификация трубопровода

Применение xsl мне это позволяет, при этом менять программу нет никакой необходимости, нужно будет просто составить новый xsl файл.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Вывод данных в xlsx
« Ответ #22 : 21-01-2014, 16:03:34 »
Вот именно о подобных ситуациях я и писал выше :)