AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.03.2023, 14:09   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Отчет Excel, созданный через OpenXML, открывеается в Экселе несколько часов
Отчет Excel, созданный через OpenXML, открывается в Экселе несколько часов

Привет!
AX 2012 R3.
Через класс - наследник от XmlExcelReport_RU сохраняется файл в формате xlsx. В этом файле 180 тыс. строк. Размер файла 27 мегабайт. Если открыть этот файл в Экселе, то Эксель его открывает 3-4 часа. Если потом пересохранить файл из Экселя, то после пересохранения файл открывается за 30 секунд.
Формул в файле нет. Просто таблица из 40 полей. И шапка из 10 полей.

Вопрос: можно ли задать какой-то параметр, чтобы отчет сохранялся без сжатия, или еще чего-то такого, что мешает его быстрому открытию без пересохранения через Эксель.
И второй вопрос: кто-то мне когда-то давал код, который умеет создавать экселевский файл без использования OpenXML, путем прямой записи в ZIP-файл и переименование расширения этого файла с ZIP на XLSX. К сожалению, я забыл кто мне давал, и куда я подевал тот пример. Может ли кто-то выложить пример, который создает экселевский файл без использования OpenXML и тем более без использования Excel ?
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 15.03.2023, 14:24   #2  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
Если открыть этот файл в Экселе, то Эксель его открывает 3-4 часа. Если потом пересохранить файл из Экселя, то после пересохранения файл открывается за 30 секунд.
Попробуйте распаковать xlsx как архив ДО пересохранения и после, чтобы сравнить папки и понять, что при пересохранении меняется.

Цитата:
Может ли кто-то выложить пример, который создает экселевский файл без использования OpenXML и тем более без использования Excel ?
XLSX - это zip-архив с определенной структурой папок и xml-файлами внутри. То есть вы можете создавать эти файлы хоть в блокноте, это обычный читаемый текст.
но зачем?
если есть OpenXML и другие библиотеки
Старый 15.03.2023, 14:37   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Через блокнот я пробовал - работает. Через Аксапту пробовал - не работает. У меня недостаточно таланта, поэтому прошу пример. Я знаю, что он есть
Несколько дней читал много теории на этот счет и видел много примеров на разных языках програмирования.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 15.03.2023, 14:44   #4  
axm2017 is offline
axm2017
Участник
 
1,745 / 292 (13) ++++++
Регистрация: 15.05.2017
Так в чем разница между файлами до и после?
Старый 15.03.2023, 14:56   #5  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Pandasama Посмотреть сообщение
Попробуйте распаковать xlsx как архив ДО пересохранения и после, чтобы сравнить папки и понять, что при пересохранении меняется.
Сравнил отличия.

В медленном файле каждая ячейка Экселя описывается так:
<x:c xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" r="Y186546" s="16" t="s"><x:v>7282</x:v></x:c>

В быстром файле каждая ячейка Экселя описывается так:
<c r="N195411" s="1" t="s"><v>574895</v></c>

Т.е. в медленном файле в каждой ячейке хранится информация о схеме. А в быстром файле этой информации нет.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 15.03.2023, 15:06   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Попробовал другой отчет OpenXML вывести, в другой AX 2012. Там без информации о схеме ячейки выгружаются. Может как-то форматирование ячеек надо убрать в шаблоне. Буду сравнивать шаблоны.
Шаблоны простейшие - одна строка в шаблоне BODY
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 19.03.2023, 18:49   #7  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Нашел способ сохранять лист Эксель через OpenXML таким образом, чтобы удалить из каждой ячейки информацию о схеме. Форматирование ячеек при этом пропало, но для этого отчета не повлияло на его внешний вид, только границы ячеек не прорисовались для динамически добавленных строк.

1) В метод XMLExcelDocument_RU::newFromFile() в третий параметр _templateMode вместо значения true передавать значение false.
X++:
    document = XMLExcelDocument_RU::newFromFile(TemplateProvider_RU::getFor(this).get(this.templateName()),
                                                    newFileName,
                                                    false);
2) В методе XmlExcelReport_RU.execute() убрать следующую строку кода:
X++:
    //document.insertRowsByBookmark(_bookmark, (getHeight ? height : 0));
3) В заголовок класса XmlExcelReport_RU добавить объявление переменной numOfRows:
X++:
    int numOfRows;
4) В методе XmlExcelReport_RU.insertValueToSection()
X++:
    //Заменить строку 
    //row    = conPeek(rangeInfo, #posFromRow);
    //На строку
    row    = conPeek(rangeInfo, #posFromRow) + numOfRows;
5) В конце метода XmlExcelReport_RU.execute() добавить строку кода:
X++:
    numOfRows ++;
Я на самом деле всё это сделал не внутри классов XmlExcelReport_RU и XMLExcelDocument_RU, а создал новый класс - копию от класса, производного от XmlExcelReport_RU. И все эти изменяемые методы скопировал и изменил в этом новом классе.

Позже сообщу, насколько удалось ускорить открытие получившегося файла в Экселе.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 19.03.2023 в 18:56.
За это сообщение автора поблагодарили: sukhanchik (10).
Старый 20.03.2023, 09:21   #8  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
А в шаблоне-то изначальном схема в ячейках указана была? или она откуда-то нарисовалась при создании отчета в Ax?
Старый 20.03.2023, 11:52   #9  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Pandasama Посмотреть сообщение
А в шаблоне-то изначальном схема в ячейках указана была? или она откуда-то нарисовалась при создании отчета в Ax?
В шаблоне схемы в ячейках нет. Так как шаблон создан нормальным способом через Excel.
Вообще, если сохранить файл в Экселе, то схема из ячеек пропадает. Т.е. это чисто фишка движка OpenXML. Именно когда через OpenXML файл сохраняешь, то генерится схема в каждой ячейке.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 20.03.2023, 11:59   #10  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
В общем проблема решилась тем, что в метод rowIndex() класса OXMLRow_RU я вставил код, который удаляет ссылку на схему. Одна строка кода решила все проблемы.
Теперь файл открывается за 15-30 секунд.
И сохраняется форматирование ячеек из шаблона.

Нажмите на изображение для увеличения
Название: axforum.png
Просмотров: 73
Размер:	49.2 Кб
ID:	13552

Все предыдущие мои манипуляции приводили к тому, что время вывод в Эксель линейно увеличивалось с ростом количества строк. И к 500-й строке доходило до одной строки в секунду.
Так что не читайте всё, что я до этого пытался сделать
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 20.03.2023 в 12:01.
За это сообщение автора поблагодарили: ice (1), LETTO (2), Pandasama (3), gl00mie (5), Logger (3), BOAL (3).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вспомогательный класс для импорта из Excel через ADO gl00mie DAX: База знаний и проекты 80 10.04.2017 10:55
Проблема с импортом из Excel через COM Romsrs DAX: Программирование 18 10.06.2008 10:34
Импорт даты через Excel OliaM DAX: Функционал 2 13.12.2007 10:32
Помогите сделать действие в Excel через COM kashperuk DAX: Программирование 25 10.09.2007 15:59
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:42.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.