Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Если кому-то интересно, пакет создания XML-Excel файлов.
Функционал пока только базовый.
Пример работы в методе Excel.Document.Test.

К сообщению приложен файл (Excel.rar - 5Kb) cкачать
16 дек 10, 09:45    [9946539]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Ymka2007
Member

Откуда:
Сообщений: 884
Блок А.Н.,

класса для тестирования нет в наличии
16 дек 10, 12:14    [9947860]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
d ##class(Excel.Document).Test()
16 дек 10, 14:53    [9949255]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Там только путь указывается напрямую, поправьте в исходниках метода.
В принципе, это практически необкатаный класс, но если есть интерес, могу доработать.
16 дек 10, 14:55    [9949271]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Еще сейчас разрабатываю ту же фигню для ворда.
Но там у самого ворда более сложная структура, классов в полтора раза больше получается и как-то более говнокодисто все.

Здесь по сути вся идея в том, чтобы построить дерево объектов, которое при выгрузке в XML становится сразу готорым документом.
17 дек 10, 06:07    [9952928]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
barl_alibek
Member

Откуда: Астана
Сообщений: 100
Блок А.Н.,

очень интересная работа, в итоге может получится очень даже интересная вещь
17 дек 10, 06:56    [9952958]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12894
Блок А.Н., я заинтригован.
У тебя есть исходное описани этой xml-структуры? По Экселю и по Ворду? Интересно было бы почитать на русском если есть...
17 дек 10, 09:40    [9953425]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Неа. Беру файл вордовый или экселевский и сохраняю его как XML, дальше смотрю текстовый файл.
И по его структуре дорисовываю классы :-)
Там правда много необязательных атрибутов и тегов, иногда вообще непонятных.

В ворде научился устанавливать параграфы, устанавливать интервал строк, ставить позиции табуляции, менять шрифт текста, атрибуты(подчеркнутый, жирный), выравнивание, работать с колонтитулами (пока только с верхним), ставить разрывы страниц, вставлять картинки.
Пока еще не сделал работу с таблицами.
17 дек 10, 11:06    [9954097]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Ymka2007
Member

Откуда:
Сообщений: 884
krvsa,

+1
17 дек 10, 11:30    [9954308]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 763
krvsa, этож стандарт Office Open XML от мелкомягких - всего 6000 страничек :). Будет работать начиная с офиса 2003 (если поставить вот это). Есть еще Open Document Format, но будет открываться с MS Office 2007 SP2. И то (.docx, .xlsx) и другое (.odt,.ods) - обычные zip архивы каталогов с xml файлами. Литературы много, но все на english. Проще делать как Александр, создать шаблон и посмотреть что к чему.
17 дек 10, 16:10    [9957329]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 763
Можно формировать не только данные, но и графики-диаграммы, например ;)
17 дек 10, 16:14    [9957362]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Вот с графиками-диаграммами облом, с рисунками в экселе тоже труба - при сохранении он просто из файла все это убирает.

В ворде картинки можно.
17 дек 10, 19:02    [9958519]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12894
doublefint
Литературы много, но все на english.

Вот ведь...

doublefint
Проще делать как Александр, создать шаблон и посмотреть что к чему.

Дык устал уже методом тыка...
17 дек 10, 19:13    [9958550]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 763
Блок А.Н.
Вот с графиками-диаграммами облом
Сделайте шаблон в Excel - 1 лист с данными, 2 лист - вставьте диаграмму на основе данных из первого листа. Сохраните в формате xlsx или OpenDocument. Откройте zip-ом ищите файл chart.xml для xlsx ( или Object 1\content.xml для OpenDocument). Там будут привязки к ячейкам данных. Сформировать такое же достаточно легко.

OpenDocument более понятный, все подробно расписано в тегах, но более избыточный. Office OpenXML - труднее соориентироваться что к чему, есть особенности вроде shared и inline строк, но формировать удобнее.
17 дек 10, 19:57    [9958754]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
В экселе все достаточно просто.
По крайней мере у нас был генератор на уровне OpenRow-CloseRow, но при работе с ним часто программист ошибался и объединенные ячейки пересекались (и другие ошибки тоже были). Эксель говорил "уупс" и файл не открывал. Поэтому я и решил сделать генератор на уровне объектов - тут можно прикрутить валидацию. Получилось достаточно просто.

С вордом все иначе.
Во-первых, он для меня новый,
во-вторых, структура у него значительно сложнее,
в-третьих структура у него менее фиксированная.
например, в теге <w:r></w:r> может содержаться и текст, и табуляция, и перевод строки и разрыв страницы, и картинка. Но хуже, что это все может содержаться все вместе и причем вперемежку.
Ладно, тут я решил для себя, что в этом теге держим только что-то одно, и при каждом шевелении открываем новый. Так работает по-крайней мере, но на каждый тег <w:r> приходится выставлять шрифт и его атрибуты. Для программиста это процесс можно скрыть интерфейсом, но файл немножко распухнет. Фиг с ним, 30кб или 80кб не такая большая разница.
Тут еще выяснилось, что в теге <w:sect> могут быть как параграфы <w:p>, так и таблицы <w:tbl>.
Как сэмулировать последовательность <w:p><w:p/><w:tbl></w:tbl><w:p><w:p/> мне пока непонятно
Попробовал запихать <w:tbl> внутрь <w:p> - вроде работает. Но при этом внутри каждой ячейки таблицы тоже есть параграф <w:p>.
В общем, с вордом пока сумбур :-)
17 дек 10, 20:14    [9958819]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
doublefint,

В экселе я делал именно по известной мне уже схеме, т.е. я просто переписал генератор тот, что уже был. И так получилось, что это был формат не xlsx :-)

Shared и inline строки даж не знаю что такое. Стыдно должно быть, да? :-)
У нас просто достаточно простые потребности к генерации экселевских листов - это просто данные, как-то минимальным образом отформатированные.
А вот на в ворде они отрываются, приходится делать типа "красиво".
17 дек 10, 20:23    [9958848]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 763
Блок А.Н.,
Office OpenXML, OpenDocument - относительно новые форматы, у нас просто красоту запросили, пришлось присмотреться.

Shared строки - своеобразная оптимизация данных для формата OpenXML. Создается "индексный" файл sharedStrings.xml в который помещаются все текстовые значения из книги. При заполнении конкретной ячейки указывают индекс из sharedStrings. Все это жутко неудобно, народ это дело пытается через XSLT заполнять - вешаются. Мало кто знает, что можно указывать текстовые значения сразу - inline. Пример строки в Office OpenXML c числом и инлайн-строкой :
<row>
        <c><v>2010</v></c>
        <c t="inlineStr">
		<is><t>Привет мир!</t></is>
	</c>
</row>
с - column или cell, @t - type, v - value, is - inline string, t - text

Word отлично кушает обычный html, только сменить заголовок Content-type у csp-страницы. Схема та же - создали нужный файл в Worde, сохранили как web-страницу, открываем блокнотом и учимся. Из особенностей - часть css приходится прописывать в аттрибутах тегов, особенно ячеек таблиц.
17 дек 10, 21:04    [9959011]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
В том XML, в котором я работаю - работает вот так:
<Row ss:AutoFitHeight="1">
<Cell><Data ss:Type="String">Hello World</Data></Cell>
</Row>
Ваш пример в моем документе не отобразился, видимо разные форматы.

Что ворд и эксель можно делать из обычного html - я в курсе, но на практике получается довольно коряво, вплоть до того, что кривится кодировка и не нашли пути это побороть. А уж то, что стили работают как попало - это вообще как за здрасьте. XML формат гораздо стабильней, сейчас двигаемся в эту сторону.

А в чем смысл inline и shared string? Так как мы делаем - гораздо проще (хотя это формат другой, тут наверно нельзя сравнивать.)
17 дек 10, 21:45    [9959186]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 763
Блок А.Н., пример и не отобразится, так как это только часть файла из архива (.xslx). Приведен на случай, если кто-нить заинтересуется форматом.

Большинство проблем со стилями для word-html мы успешно забороли, с кодировкой проблем тоже нет. Но пользователь захотел Excel и обязательно с графиками.

Смысл sharedStrings.xml - позволяет Microsoft говорить что у них самый компактный (размер итоговых файлов) xml формат для офисных документов :)
17 дек 10, 22:07    [9959258]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Я понял, что это часть, я просто попытался в свой файл затолкать, естественно, ничего из этого не вышло :-)

До графиков мы своих еще не распустили.
Я страшные глаза делаю, когда надо картинки вставить :-)
А у вас какой способ генерации файлов, в общих чертах?
17 дек 10, 22:46    [9959381]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
doublefint
Member

Откуда: Беларусь, Минск
Сообщений: 763
Блок А.Н., создаем файл Excel (xlsx или ods), распаковываем его (для использования в качестве шаблона), на csp-странице получаем параметры запроса, делаем копию шаблона, дописываем данные в файлы.xml копии шаблона, пакуем zip-ом, выдаем на странице. Формирование собственно файла xml, как и предлагал - глобал и команда w (при условии что в данных не будет <> ;)).
///Создает файл с основными данными
ClassMethod wDataSheet(gln as %String) {
 &html<<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<sheetData>>
	s row="" f { s row=$o(@gln@("row",row)) q:row=""
		w !,"<row>"
		s cell="" f { s cell=$o(@gln@("row",row,"c",cell)) q:cell=""
			s t=$d(@gln@("row",row,"c",cell,"t")) ;type
			s v=$g(@gln@("row",row,"c",cell,"v")) ;value
			w "<c ",$s(t:"t=""inlineStr""",1:""),">"
			w:'t "<v>",v,"</v>"
			w:t "<is><t>",v,"</t></is>"
			w "</c>"
		}
 		w "</row>"
	}
 &html<</sheetData></worksheet>>
 Q
}
19 дек 10, 14:07    [9963007]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Пойти по пути шаблонов я пробовал для отправки писем, правда шаблон хранил на диске.
Первый пример стал последним - слишком мало гибкости, в шаблон как переменную приходитось вставлять целые таблицы, а это не айс.

Затолкать готовый файл прямо в CSP-шку мне как-то даже в голову не пришло :-)
В любом случае, напрямую через теги это сильно страшно, ошибиться же легко?

Надо со своим способом мне попробовать xlsx сделать, а то в том формате XML, в котором мы работает, даже картинки нельзя вставлять. Графики очень интересно делать сразу в отчетах.

А zip вы через $zf запускаете? Или есть алгоритмы сжатия данных в потоках каше?
19 дек 10, 21:34    [9963731]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3079
Блог
Блок А.Н.
А zip вы через $zf запускаете? Или есть алгоритмы сжатия данных в потоках каше?

Методы: %SYSTEM.Util.Compress(), %SYSTEM.Util.Decompress()
Классы: %Stream.GblBinCompress, %Stream.GblChrCompress

PS: я тоже думал когда-то об использовании XML для генерации Excel-отчётов, но потом отказался из-за ограничений, которые здесь упоминаются.
19 дек 10, 21:57    [9963765]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Пока не понял, что за алгоритм сжатия у них. Но вроде не zip?

А какие ограничения xml формата для вас критичны?
19 дек 10, 22:30    [9963844]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
doublefint,
у вас там в Минске что-то серьезное творится?
19 дек 10, 23:38    [9964009]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3079
Блог
Блок А.Н.
Пока не понял, что за алгоритм сжатия у них. Но вроде не zip?

В документации к методам указан используемый алгоритм.

Блок А.Н.
А какие ограничения xml формата для вас критичны?

Всё то, к чему привык пользователь: ЭЦП, шифрация данных, графики, изображения и т.п.
Для разработчика: поддержка Excel с версии 97, функции постобработки типа AutoFit, документируемость SDK.
19 дек 10, 23:53    [9964048]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3542
Я человек темный, zlib это же еще не совсем zip?

А какой метод генерации используете? Activate?
20 дек 10, 00:12    [9964080]     Ответить | Цитировать Сообщить модератору
 Re: Генерация XML-Excel файлов  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3079
Блог
Блок А.Н.
zlib это же еще не совсем zip?
  • Zlib
  • Zip
    Блок А.Н.
    А какой метод генерации используете? Activate?
    Ни в коем случае. Не нужно забывать про ActiveX и x64.

    PS: спасибо за поддержку, особенно за марсианские яблони и ви... Впрочем, нет. Только за яблони.
  • 20 дек 10, 00:36    [9964104]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3542
    По zip надо подумать, похоже zlib это какая-то заготовка к нему, про те же заголовки нефига непонятно. Если всерьез займусь xlsx - а повод к этому есть, хотя бы претензия на маленький размер, если у нас тут файлы по 200Мб, которые через веб передаются.

    Про яблони - так это нам нужно спасибо сказать вам.
    Вы единственный, кого я замечаю борющимся за каше на чужом поле. Обычно я избегаю встревать в такие дискуссии, но тут что-то зацепило.
    Еще мне кажется, что мы призы с krvsa(сорри) незаслуженно получили, особенно если с вами сравнивать, хотя это фигня, конечно.
    И русский отдел маркетинга ИС зря получает свою зарплату, если он вообще есть.
    20 дек 10, 05:36    [9964291]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 763
    Блок А.Н., Шаблон хранится на диске, сжимаем через $zf, читаем и отправляем через csp.
    Блок А.Н.
    В любом случае, напрямую через теги это сильно страшно, ошибиться же легко?
    Если честно, не понял почему. Сделали базовый интерфейс и больше про теги никто не вспоминает, на вход передать глобал определенной структуры...
    20 дек 10, 10:01    [9964691]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3542
    А там шрифты-границы, и всякие объединения ячеек через глобал удобно передавать?
    Или не используете?
    20 дек 10, 11:25    [9965142]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 763
    Блок А.Н., не могу вспонить ситуацию, когда что-то нельзя передать через глобал... :)
    s @gl@("row",row,"c",cell,"class")="myclass"
    s @gl@("merges",1,"ref")="A$1:B$1"
    
    20 дек 10, 11:41    [9965222]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Ymka2007
    Member

    Откуда:
    Сообщений: 884
    doublefint,

    Приветствую!
    если есть возможность, можете описать или скинуть что нить такое, что бы понять как именно нужно работать из Cache с файлами MS Office Excel 2007. Ну очень заинтересовала эта темка. Особенно интересует часть про разархивирование и архивирование

    Заранее спасибо
    30 мар 11, 16:21    [10446868]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 763
    Ymka2007, постараюсь выложить пример в ближайшее время.
    31 мар 11, 13:07    [10450946]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Ymka2007
    Member

    Откуда:
    Сообщений: 884
    doublefint, ок буду ждать
    31 мар 11, 14:40    [10451866]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Ymka2007
    Member

    Откуда:
    Сообщений: 884
    Привет ты про меня не забыл?

    doublefint
    <row>
            <c t="inlineStr">
    		<is><t>Привет мир!</t></is>
    	</c>
    </row>
    
    с - column или cell, @t - type, v - value, is - inline string, t - text

    Такое формирование данных - это файл sheet1.xml верно?
    я написал так:
    <sheetData>
     <row r="4"><c r="B4" t="inlineStr"><is><t>Привет мир!</t></is></row>
    </sheetData>
    
    выдал ошибку:
    <removedPart>Замененный компонент: часть /xl/worksheets/sheet1.xml с ошибкой XML. Недопустимый знак xml. Строка 2, столбец 571.</removedPart>

    с чем это связано? не подскажешь?
    12 апр 11, 12:20    [10505475]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Ymka2007
    Member

    Откуда:
    Сообщений: 884
    я написал так:
    <sheetData>
     <row r="4"><c r="B4" t="inlineStr"><is><t>Привет мир!</t></is></c></row>
    </sheetData>
    
    забыл тег закрыть </c>
    )))
    12 апр 11, 12:50    [10505686]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 763
    Ymka2007, не забыл. Были проблемы (переезжали с 2008 на 2010 ;), был сильно занят, прошу прощения.
    Собственно, сам пример (сильно упрощенный):
    +

    /// Сложная страница, которая сформирует новые xml данные, 
    /// запакует их в формат xls, 
    /// отдаст пользователю
    Class csp.out Extends %CSP.Page {
    
    /// подменим на excel
    Parameter CONTENTTYPE = "application/excel";
    
    ///Parameter CHARSET не определен, так как будем отдавать Excel
    
    
    /// "text/html";
    /// Пишет файл с данными
    /// см. исходный файл : template\xl\worksheets\sheet1.xml
    ClassMethod wSheet1() As %String
    {
     ;Код ниже просто скопирован из файла шаблона и оставлен как есть
     &html<<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <worksheet 
         xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
         xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">>
         ;<dimension ref="A1:D2"/> - вывод этой строки подавляем, так как данных у нас будет больше
         &html<<sheetViews>
          <sheetView workbookViewId="0">
          <pane xSplit="2" ySplit="1" topLeftCell="C2" activePane="bottomRight" state="frozenSplit"/>
          <selection pane="bottomLeft" activeCell="A2" sqref="A2"/>
          <selection pane="topRight" activeCell="C1" sqref="C1"/>
          <selection pane="bottomRight" activeCell="C2" sqref="C2"/>
         </sheetView>
         </sheetViews>
         <sheetFormatPr defaultRowHeight="12.75"/>
         <cols>
          <col min="1" max="1" width="10" customWidth="1"/>
          <col min="2" max="2" width="8.7109375" customWidth="1"/>
          <col min="3" max="3" width="19.42578125" customWidth="1"/>
          <col min="4" max="4" width="14.28515625" customWidth="1"/>
         </cols>
         <sheetData>>
          
          ;Обратите внимание на описание заголовков колонок 
          ;вместо строковых значений - ссылки справочник в файле sharedStrings.xml
          
          &html<<row r="1" spans="1:4" ht="15.75" thickBot="1">
           <c r="A1" s="1" t="s"><v>0</v></c>
           <c r="B1" s="1" t="s"><v>1</v></c>
           <c r="C1" s="1" t="s"><v>2</v></c>
           <c r="D1" s="1" t="s"><v>3</v></c>
          </row>>
          
          /******ДИНАМИЧЕСКАЯ ЧАСТЬ ОТЧЕТА**************/
          d ##class(test.data).%KillExtent() ;каждый раз разный отчет
          d ##class(test.data).Populate(1000)
          &sql(Declare rs Cursor For
           Select code,name,amount Into :code,:name,:amount
           From test.data
          ) &sql(Open rs)
          s i=0
          for { &sql(Fetch rs) q:SQLCODE
           s i=i+1 &html<<row><c><v>#(i)#</v></c>> ;числовые данные отдаем сразу
           
           ;текстовые значения пакуем в инлайн-стринг 
           &html<
                <c t="inlineStr"><is><t>#(code)#</t></is></c>
                <c t="inlineStr"><is><t>#(name)#</t></is></c>
           > 
           ;опять числовые
           &html<<c><v>#(amount)#</v></c>
           </row>>
           
          } &sql(Close rs)
          
        ;дальше снова просто копия из файла шаблона  
        &html<</sheetData>
        <autoFilter ref="A1:D2"/>
         <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
         <pageSetup paperSize="9" orientation="portrait" horizontalDpi="300" verticalDpi="300" r:id="rId1"/>
         </worksheet>
     >
    }
    
    /// Перед тем как отдать файл 
    /// копируем каталог шаблона во временный каталог
    /// в каталог генерим новый файл со своими данными
    /// зипуем каталог в файл, выдаем на странице
    ClassMethod OnPage() As %Status
    {
     ;Определяем абсолютные пути
     s cspPath=$system.CSP.GetFileName(%request.URL) ;csp-приложение
     
     #define FILE ##class(%File)
     s appPath=$$$FILE.GetDirectory(cspPath) ;по нему определили каталог
     s templatePath=appPath_"\Template\" ;предопределенное положение шаблона
      
     ;создаем случайный каталог для отчета
     s ext="xlsx"
     s tempFile=$$$FILE.TempFilename("xlsx") ;будущий архив
     s tempDir=$$$FILE.GetDirectory(tempFile) ;абсолютный путь к временному каталогу
     s var=$$$FILE.GetFilename(tempFile) ;нужна только "случайная" часть от имени временного файла
     s var=$p(var,"."_ext)
     s tempDir=tempDir_var ;абсолютный путь к временному каталогу нового отчета
     
     ;копируем файлы шаблона
     d $$$FILE.CopyDir(templatePath,tempDir,1,1,1) ;надо бы проверить
     
     ;файл с новыми данными 
     s dataFile=tempDir_"\xl\worksheets\sheet1.xml" ;предопределенное положение файла с данными (см. стандарт)
     ;записываем его 
     open dataFile:"WNUK\UTF8\" ;Открываем для записи - проверить
     use dataFile d ..wSheet1()
     close dataFile
     
     ;архивируем результат
     s zipper=appPath_"zipper\pkzipc.exe" ;путь к архиватору
     s cmd=zipper_" -add -move -attr=all -dir -path=relative -nozip "_tempFile_" "_tempDir_"\*.*"
     ;w "cmd: ",cmd
     d $zf(-1,cmd) ;мне повезет!
     
     ;отдаем на страницу
     s file=$$$FILE.%New(tempFile)
     d file.Open("RU:/TRANSLATE=0")
     d file.OutputToDevice()
     d file.Close() k file
     
     Q $$$OK
    }
    
    ClassMethod OnPreHTTP() As %Boolean [ ServerOnly = 1 ] {
     s %response.ContentType = "application/excel"
     d %response.SetHeader("content-disposition","attachment; filename=Report.xlsx")
     Q 1
    }
    }
    

    И он же в виде проекта (см. приложение)
    Тестировалось на WinXP, MS Office2007, Cache 2010.2.3 UTF8 (область USER, csp приложение \csp\user)

    К сообщению приложен файл (ooxml.zip - 12Kb) cкачать
    13 апр 11, 05:00    [10509913]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 763
    Размер приложений ограничен, не смог добавить сам упаковщик
    Это файл pkzipc.exe (брал из комплекта FAR-managera), его надо поместить в каталог: csp\user\zipper
    13 апр 11, 05:06    [10509914]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Ymka2007
    Member

    Откуда:
    Сообщений: 884
    doublefint,

    Спасибо большое, есть что почерпнуть
    я тут вот еще что выяснил про передачу string:
    <row r="1">
     <c r="B1" t="str">
      <v>TTTT</v>
     </c>
    </row>
    
    XSD Schema Code: 
    <xsd:simpleType name="ST_CellType">
        <xsd:annotation>
            <xsd:documentation>Cell Type</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="b">
                <xsd:annotation>
                    <xsd:documentation>Boolean</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="n">
                <xsd:annotation>
                    <xsd:documentation>Number</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="e">
                <xsd:annotation>
                    <xsd:documentation>Error</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="s">
                <xsd:annotation>
                    <xsd:documentation>Shared String</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="str">
                <xsd:annotation>
                    <xsd:documentation>String</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="inlineStr">
                <xsd:annotation>
                    <xsd:documentation>Inline String</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>
    
    http://schemas.liquid-technologies.com/OfficeOpenXML/2006/
    search/"inlineStr"
    и вот еще что, я тут тоже задумался над таким формированием отчетов
    есть уже некий пакет классов, который позволяет формировать пока только стандартный пустой документ Excel2007 с помощью %XML.Adapter, работаю над передачей данных и формированием ссылочной целостности стилей
    если нитересует тоже могу скинуть поделиться
    13 апр 11, 11:32    [10511069]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    doublefint
    Member

    Откуда: Беларусь, Минск
    Сообщений: 763
    Ymka2007, спасибо, буду знать. Мне идея с шаблонами нравится из-за возможности быстро разработать его с помощью визуальных средств (Excel, Word) и хранения кучи разметки вне базы данных.
    13 апр 11, 14:06    [10512446]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3542
    Теперь создание больших файлов.
    Генератор не выжирает память процесса, так как ячейки переделал на хранимые объекты в глобале процесса.
    Стало немножко медленнее, так как теперь при обращении объекты открываются/закрываются.

    К сообщению приложен файл (Excel.rar - 7Kb) cкачать
    7 дек 11, 11:47    [11719773]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3542
    Упс, под каше 2011 не работает.
    8 дек 11, 10:59    [11727263]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: Генерация XML-Excel файлов  [new]
    DragonVDA
    Member

    Откуда:
    Сообщений: 2
    вклинюсь в обсуждение со своей проблемой http://www.sql.ru/forum/1084615/oracle-to-excel

    на сколько я понимаю изложенными вами способом можно реализовать часть того что мне нужно
    1. по размеченным диапазонам Excel вставка данных: результат может быть из запроса или текст, изображение (не обязательно из БД)
    2. соблюдение всех начальных форматирований в шаблоне (размещение на листе тескольких диапазонов, в том числе рядом)
    3. !контроль завершения процесса Excel.exe по окончании процесса!
    4. способы добавления форматирования внутри данных, например: выделение цветом, зачеркивание, курсив для отдельных слов в ячейках и т.д.
    5. авто нумерация страниц
    6. создание авто содержания
    7. группировки текста внутри диапазонов (в том числе не одинаковых данных, т.е. объединение по заранее заданному кол-ву ячеек)
    8. формирование отчета должно быть приемлемо по скорости ("ненамного" превышать отработку запросов)


    есть ли какие то видимые проблемы, которые не получится сделать? и на сколько корректно править шаблон Excel руками?

    очень интересует нумерация страниц и форматирование данных внутри одной ячейки
    24 мар 14, 15:16    [15778047]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3542
    DragonVDA,

    У меня генерация файла с нуля, впрочем, на мой взгляд, довольно простой интерфейс, для меня проблем не составляет.
    С шаблонами я не работаю, уже существующий файл открыть не смогу, установленный эксель для создания файла не нужен.
    Формат xml-excel, как он называется точно, я не знаю. Он выглядит как эксель и имеет многие возможности экселя, но не все.
    В частности, нельзя вставить картинки, сводные таблицы, скрипты.
    Форматирование ячеек есть, объединение, установка размеров тоже. С границами мне лень было разбираться, что-то есть, но не особо много, но доработать проблем не будет. Для отдельных слов в ячейке форматирование нельзя установить.
    Генерация файла намного дольше выборки данных (но выборка данных обычно вообще ничтожна по времени), но в принципе сравнима с другими способами формирования отчетов по скорости, так что приемлимо.

    Текущая версия в этой ветке слегка багнутая, но так как особо никто интереса не проявил, я более свежие не выкладывал.
    16 апр 14, 17:29    [15892261]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3542
    И да, генерация заточена чисто под каше.
    16 апр 14, 17:30    [15892263]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: Генерация XML-Excel файлов  [new]
    Charlie2017
    Member

    Откуда:
    Сообщений: 1
    Блок А.Н.
    Текущая версия в этой ветке слегка багнутая, но так как особо никто интереса не проявил, я более свежие не выкладывал.

    Есть интерес! Если вы ещё не забросили, поделитесь, пожалуйста. :-)
    12 июл 17, 09:58    [20635758]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    Блок А.Н.
    Member

    Откуда: Новосибирск
    Сообщений: 3542
    Charlie2017,

    Я больше в той организации не работаю, а выносить код (хоть и написанный собой) посчитал неэтичным, да и правила той организации это прямо запрещают. Так что сейчас у меня ничего нет, а мои коллеги, насколько я в курсе, на этот форум не заходят.
    Есть своя ветка этой разработки у ребят из СибЭКО, некоторые форум этот читают. Возможно, поделятся.
    12 июл 17, 10:46    [20635969]     Ответить | Цитировать Сообщить модератору
     Re: Генерация XML-Excel файлов  [new]
    drakut
    Member

    Откуда: Москва
    Сообщений: 78
    Charlie2017,

    Попробуйте для работы с XLSX-файлами использовать вариант из моего поста: http://www.sql.ru/forum/1262232/namerennoe-ignorirovanie-tegov-pri-correlate-i-next-klassa-xml-reader - сможете распарсить файл любой структуры, так как вы уже будуте обращаться с файлом как с набором объектов, а это гораздо удобнее. Плюс сэкономите время на изобретение своих классов. Пока единственная проблема, с которой я столкнолся и не решил - парсинг больших файлов, по 10-15 мб (пока резал файл на приемлемые сторонним инструментом)
    17 июл 17, 14:23    [20650327]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2      [все]
    Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить