|
простой пример с использованием XML и XSL - Ошибка объема данных | ☑ | ||
---|---|---|---|---|
0
Kerk
08.11.11
✎
18:02
|
Вот пример взятый из ветки v8: Как ускорить выгрузку в эксель? последний пост.
тз = Новый ТаблицаЗначений; тз.Колонки.Добавить("Число", Новый ОписаниеТипов("Число"), "Число", 10); тз.Колонки.Добавить("Строка", Новый ОписаниеТипов("Строка"), "Строка", 30); тз.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"), "Дата", 10); Для инд = 1 По 10 Цикл стр = тз.Добавить(); стр.Число = инд; стр.Строка = "Строка"; стр.Дата = ТекущаяДата(); КонецЦикла; записьXML = Новый ЗаписьXML; записьXML.УстановитьСтроку("windows-1251"); записьXML.ЗаписатьОбъявлениеXML(); записьXML.ЗаписатьНачалоЭлемента("ТаблицаЗначений"); записьXML.ЗаписатьНачалоЭлемента("Колонки"); Для Каждого колонка из тз.Колонки Цикл записьXML.ЗаписатьНачалоЭлемента("Колонка"); записьXML.ЗаписатьАтрибут("Заголовок", колонка.Заголовок); записьXML.ЗаписатьАтрибут("Ширина", Строка(колонка.Ширина)); записьXML.ЗаписатьКонецЭлемента(); КонецЦикла; записьXML.ЗаписатьКонецЭлемента(); Для Каждого строка из тз Цикл записьXML.ЗаписатьНачалоЭлемента("Строка"); Для Каждого колонка из тз.Колонки Цикл записьXML.ЗаписатьНачалоЭлемента(колонка.Имя); записьXML.ЗаписатьТекст(XMLСтрока(строка[колонка.Имя])); записьXML.ЗаписатьКонецЭлемента(); КонецЦикла; записьXML.ЗаписатьКонецЭлемента(); КонецЦикла; записьXML.ЗаписатьКонецЭлемента(); хсл = Новый ПреобразованиеXSL; хсл.ЗагрузитьИзСтроки( "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""> | | <xsl:template match=""/""> | <ss:Workbook> | <ss:Styles> | <ss:Style ss:ID=""1""> | <ss:Font ss:Bold=""1""/> | </ss:Style> | </ss:Styles> | <ss:Worksheet ss:Name=""Test""> | <ss:Table> | <xsl:apply-templates /> | </ss:Table> | </ss:Worksheet> | </ss:Workbook> | </xsl:template> | | <xsl:template match=""ТаблицаЗначений/Колонки""> | <ss:Row ss:StyleID=""1""> | <xsl:for-each select=""Колонка""> | <ss:Cell> | <ss:Data ss:Type=""String""><xsl:value-of select=""@Заголовок""/></ss:Data> | </ss:Cell> | </xsl:for-each> | </ss:Row> | <xsl:apply-templates /> | </xsl:template> | | <xsl:template match=""ТаблицаЗначений/Строка""> | <ss:Row> | <xsl:for-each select=""*""> | <ss:Cell> | <ss:Data ss:Type=""String""> | <xsl:value-of select=""."" /> | </ss:Data> | </ss:Cell> | </xsl:for-each> | </ss:Row> | </xsl:template> | |</xsl:stylesheet>"); результат = Новый ЗаписьXML; результат.ОткрытьФайл("c:\work\temp\test.xls"); хсл.ПреобразоватьИзСтроки(записьXML.Закрыть(), результат); результат.Закрыть(); Если Просто поменять количество 10 на 50 то вываливается ошибка. {Форма.Форма.Форма(521)}: Ошибка при вызове метода контекста (ПреобразоватьИзСтроки) хсл.ПреобразоватьИзСтроки(записьXML.Закрыть(), результат); по причине: по причине: Ошибка разбора XML: - [96,13] Фатальная ошибка: Premature end of data in tag ТаблицаЗначений line 2 И как это победить? P.S. Если брать из Книга знаний: v8: Быстрый вывод данных в Excel по OLE с помощью COMSafeArray. что "Обязательно в строке соединения указывать параметр IMEX=1" тогда вообще не создается файл. |
|||
1
Kerk
08.11.11
✎
18:04
|
(0) про IMEX=1 я перепутал с ADODB.Connection :)
|
|||
2
Kerk
08.11.11
✎
18:27
|
Платформа 8.2.13.205, конфигурация не типовая.
|
|||
3
Kashemir
08.11.11
✎
18:38
|
(0) Не пробовал инструмент, однако судя по ошибке скорее проблема в структуре хмл, чем в объеме.
|
|||
4
Kerk
08.11.11
✎
19:08
|
(3) Ошибка про структуру, но если взять 40 строк, уже "структура" нормальная.
По данной ошибке, на этом форуме нашел догадку, что сама 1С плохо преобразовывает XML... |
|||
5
Kashemir
08.11.11
✎
19:17
|
(4) Похоже на то. Попробовал то же реализовать через ПреобразоватьИзФайла на ТЗ из 60000 строк - осилило без ошибок.
|
|||
6
Kerk
09.11.11
✎
10:32
|
(5) Если можешь скинь кусок кода. Или хотя бы текст "хсл.ЗагрузитьИзСтроки( "<xsl:stylesheet version=""1.0"" ... "
|
|||
7
Kashemir
09.11.11
✎
19:57
|
Процедура КнопкаВыполнитьНажатие(Кнопка)
тз = Новый ТаблицаЗначений; тз.Колонки.Добавить("ТипЧисло", Новый ОписаниеТипов("Число"), "ЗаголовокЧисло", 10); тз.Колонки.Добавить("ТипСтрока", Новый ОписаниеТипов("Строка"), "ЗаголовокСтрока", 30); тз.Колонки.Добавить("ТипДата", Новый ОписаниеТипов("Дата"), "ЗаголовокДата", 10); Для инд = 1 По 60000 Цикл стр = тз.Добавить(); стр.ТипЧисло = инд; стр.ТипСтрока = "ЗначениеСтрока"; стр.ТипДата = ТекущаяДата(); КонецЦикла; записьXML = Новый ЗаписьXML; записьXML.ОткрытьФайл("D:\test.xml", "windows-1251"); //записьXML.УстановитьСтроку("windows-1251"); записьXML.ЗаписатьОбъявлениеXML(); записьXML.ЗаписатьНачалоЭлемента("ТаблицаЗначений"); записьXML.ЗаписатьНачалоЭлемента("Колонки"); Для Каждого колонка из тз.Колонки Цикл записьXML.ЗаписатьНачалоЭлемента("Колонка"); записьXML.ЗаписатьАтрибут("Заголовок", колонка.Заголовок); записьXML.ЗаписатьАтрибут("Ширина", Строка(колонка.Ширина)); записьXML.ЗаписатьКонецЭлемента(); КонецЦикла; записьXML.ЗаписатьКонецЭлемента(); Для Каждого строка из тз Цикл записьXML.ЗаписатьНачалоЭлемента("Строка"); Для Каждого колонка из тз.Колонки Цикл записьXML.ЗаписатьНачалоЭлемента(колонка.Имя); записьXML.ЗаписатьТекст(XMLСтрока(строка[колонка.Имя])); записьXML.ЗаписатьКонецЭлемента(); КонецЦикла; записьXML.ЗаписатьКонецЭлемента(); КонецЦикла; записьXML.ЗаписатьКонецЭлемента(); хсл = Новый ПреобразованиеXSL; хсл.ЗагрузитьИзСтроки( "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""> | | <xsl:template match=""/""> | <ss:Workbook> | <ss:Styles> | <ss:Style ss:ID=""1""> | <ss:Font ss:Bold=""1""/> | </ss:Style> | </ss:Styles> | <ss:Worksheet ss:Name=""Test""> | <ss:Table> | <xsl:apply-templates /> | </ss:Table> | </ss:Worksheet> | </ss:Workbook> | </xsl:template> | | <xsl:template match=""ТаблицаЗначений/Колонки""> | <ss:Row ss:StyleID=""1""> | <xsl:for-each select=""Колонка""> | <ss:Cell> | <ss:Data ss:Type=""String""> | <xsl:value-of select=""@Заголовок""/> | </ss:Data> | </ss:Cell> | </xsl:for-each> | </ss:Row> | <xsl:apply-templates /> | </xsl:template> | | <xsl:template match=""ТаблицаЗначений/Строка""> | <ss:Row> | <xsl:for-each select=""*""> | <ss:Cell> | <ss:Data ss:Type=""String""> | <xsl:value-of select=""."" /> | </ss:Data> | </ss:Cell> | </xsl:for-each> | </ss:Row> | </xsl:template> | |</xsl:stylesheet>"); результат = Новый ЗаписьXML; результат.ОткрытьФайл("D:\test.xls"); СтрокаХМЛ = записьXML.Закрыть(); //хсл.ПреобразоватьИзСтроки(СтрокаХМЛ, результат); хсл.ПреобразоватьИзФайла("D:\test.xml", Результат); результат.Закрыть(); КонецПроцедуры |
|||
8
Kerk
10.11.11
✎
10:08
|
Спасибо, попробую.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |