19.09.2006, 17:35 | #1 |
Участник
|
Экспорт в эксель через XML, еще один вариант
была задача - сделать вывод в эксель счета, накладной и сч.-фактуры,
так как некоторые клиенты хотят именно так и никак иначе сначала пробовал сделать некое универсальное решение через форму стандартной печати, но мне это оказалось не по зубам )) к тому-же обязательное требование - сохранить форматирование отчета (чтобы было как в 1С) Excel 2003 нормально понимает XML поэтому сделал такой вариант - в отчете перегружается метод print формирую XML с помощью XMLDocument, Код: xmlDoc = new XMLDocument(); xmlDoc.loadXML('<?xml version="1.0" encoding="windows-1251"?><?xml-stylesheet type="text/xsl" href="smpl05.xsl"?><Bill/>'); Код: <CustVendFacture> <Header> <getFactureId>012345</getFactureId> <FactureDate>01/09/2006</FactureDate> <getCompanyName>ПРОДАВЕЦ</getCompanyName> <getCompanyAddress>АДРЕС ПРОДАВЦА</getCompanyAddress> <getINNOfCompany>ИНН ПРОДАВЦА</getINNOfCompany> <getKPPUOfCompany>КПП ПРОДАВЦА</getKPPUOfCompany> </Header> <Body> <Line> <ItemName>ТОВАР1</ItemName> <getUnitIdTxt>шт</getUnitIdTxt> <getQty>2400</getQty> <getPrice>570</getPrice> </Line> <Line> ... </Line> </Body> </CustVendFacture> XSL делаю так - подготавливаю шаблон, в нужных позициях подставляя имена переменных, например название компании - getCompanyName, сохраняю из Excel-я в XML, в файле заменяю заголовок Код: <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> Код: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> <xsl:template match="/"> <xsl:processing-instruction name="mso-application"> <xsl:text>progid="Excel.Sheet"</xsl:text> </xsl:processing-instruction> <Workbook> на Код: <xsl:value-of select="CustVendFacture/Header/getCompanyName"/> Код: <xsl:for-each select="CustVendFacture/Body/Line"> <Row ss:AutoFitHeight="0"> <Cell ss:Index="2" ss:StyleID="s38"><Data ss:Type="String"><xsl:value-of select="ItemName"/></Data></Cell> <Cell ss:StyleID="s39"><Data ss:Type="String"><xsl:value-of select="getUnitIdTxt"/></Data></Cell> <Cell ss:StyleID="s40"><Data ss:Type="Number"><xsl:value-of select="getQty"/></Data></Cell> <Cell ss:StyleID="s40"><Data ss:Type="Number"><xsl:value-of select="getPrice"/></Data></Cell> ... </Row> </xsl:for-each> Код: </xsl:template> </xsl:stylesheet> Код: <Table ss:ExpandedColumnCount="256" ss:ExpandedRowCount=" если его будет слишком мало - Excel будет грязно ругаться на несоответствие указанному и реальному количеству строк в файле также выводимые числа должны быть определенного вида, например num2Str(Price, 3, 2, 1, 0), то есть без пробелов и разделитель - точка полученый XML передаю в ActiveX Spreadsheet, положенный на форму. после этого нажимаем на кнопку экспорта и готово с принципе, думаю можно сразу передавать во внешний Excel через COM плюсы: работает быстро, формирует по шаблону готовый Excel-отчет минусы: почему-то не сохраняет форматирование (перенос слов в ячейке), потом нужно вручную менять формат ячейки |
|
|
За это сообщение автора поблагодарили: mazzy (5), alex55 (3). |
20.09.2006, 09:04 | #2 |
Участник
|
>>>формирую XML с помощью XMLDocument
довольно тормозной вариант (COM в Axapta больгшой тормоз)- через AsciiIO быстрее >>>с принципе, думаю можно сразу передавать во внешний Excel через COM можно просто запускать по WinApi::shellExecute - оно по <?mso-application progid="Excel.Sheet"?> должно определить что надо запускать Excel |
|
20.09.2006, 09:33 | #3 |
Пенсионер
|
а не проще хранить XML шаблон структурировано В таблицах, заполнять необходимые поля при формировании документа и выгружать это все через AsciiIO?
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
|
За это сообщение автора поблагодарили: Recoilme (4). |
20.09.2006, 11:28 | #4 |
Участник
|
Цитата:
Цитата:
>>>с принципе, думаю можно сразу передавать во внешний Excel через COM
можно просто запускать по WinApi::shellExecute - оно по <?mso-application progid="Excel.Sheet"?> должно определить что надо запускать Excel |
|
20.09.2006, 11:34 | #5 |
Участник
|
Цитата:
а не проще хранить XML шаблон структурировано В таблицах, заполнять необходимые поля при формировании документа и выгружать это все через AsciiIO?
|
|
20.09.2006, 12:26 | #6 |
Участник
|
AlexeyS, а проблема с итогами по странице решена? Кстати выравнивание по высоте наименований, напрямую связано с этими самыми итогами по странице
p.s. ХРО-шку было бы удобнее выложить, а то так сложно вникать. |
|
20.09.2006, 13:00 | #7 |
Пенсионер
|
Цитата:
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|