Скорость вывода с помощью EasyExcel
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Скорость вывода с помощью EasyExcel
Окружение: Windows Xp, Clarion 6.3, EasyExcel ver.4.04
Суть проблемы:
При выводе данных в Excel с помощью в основном метода EasyExcelClass.WriteRow на машинах у которых в качестве принтера использования по умолчанию установлены принтера KYOSERA начинает активно работать служба Spoolsv.exe постепенно отжирая всю ОП.
При этом, если там где установлены принтера не KYOSERA вывод в Excel идет за секунды, то там где установлены принтера KYOSERA тот же документ идет несколько минут и соответственно если без KYOSERA вывод идет минуты, то вывод такого документа с
KYOSERA может вылиться в часы.
Сделал следующее – при выводе в Excel определяю, если по умолчанию стоит KYOSERA, то переопределяю это умолчание на принтер «MicroSoft XPS Document Writer», а по окончании вывода все возращаю назад. Если пользователь за время вывода не работает с печатью вроде все Ок, но если он в это время ее из параллельных заданий тронул, то все опять начинает тормозить.
Кто встречался с такой бякой – помогите забороть.
P.S. Метод EasyExcelClass.WriteQueue выкидивает «Неизвестная ошибка драйвера» и GPF
Суть проблемы:
При выводе данных в Excel с помощью в основном метода EasyExcelClass.WriteRow на машинах у которых в качестве принтера использования по умолчанию установлены принтера KYOSERA начинает активно работать служба Spoolsv.exe постепенно отжирая всю ОП.
При этом, если там где установлены принтера не KYOSERA вывод в Excel идет за секунды, то там где установлены принтера KYOSERA тот же документ идет несколько минут и соответственно если без KYOSERA вывод идет минуты, то вывод такого документа с
KYOSERA может вылиться в часы.
Сделал следующее – при выводе в Excel определяю, если по умолчанию стоит KYOSERA, то переопределяю это умолчание на принтер «MicroSoft XPS Document Writer», а по окончании вывода все возращаю назад. Если пользователь за время вывода не работает с печатью вроде все Ок, но если он в это время ее из параллельных заданий тронул, то все опять начинает тормозить.
Кто встречался с такой бякой – помогите забороть.
P.S. Метод EasyExcelClass.WriteQueue выкидивает «Неизвестная ошибка драйвера» и GPF
Re: Скорость вывода с помощью EasyExcel
Если кому интересно: для ускорения вывода в Excel кроме переключения принтеров стал использовать команду обмена данных через буфер Windows SetClipBoard c последующим восстановлением EasyExcelClass.PasteSpecial. Скорость вывода увеличилась в 5 раз.
- Admin
- Администратор
- Сообщения: 3960
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Скорость вывода с помощью EasyExcel
Вывод в Excel через что? Через свой интерфейс или EasyExcel ?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 3960
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Скорость вывода с помощью EasyExcel
И что WriteQueue c WriteMode = WriteMode:Buffer медленно выводит?Anatoly писал(а):Вывод с помощью EasyExcel ver.4.04
Это сколько интересно записей и столбцов в очереди?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Re: Скорость вывода с помощью EasyExcel
WriteQueue с любыми параметрами и с любой Queue, состоящей хоть из одной записи хоть из несколькоих выдает "Неизвестная ошибка драйвера" и падает в GPF.
Документ, который тормозит, состоит из 68 столбцов и примерно 300 записей.
Сейчас вышел (со всеми вышеперечисленными приемами) на приемлемое время вывода = 1минута 30 сек.
Документ, который тормозит, состоит из 68 столбцов и примерно 300 записей.
Сейчас вышел (со всеми вышеперечисленными приемами) на приемлемое время вывода = 1минута 30 сек.
Re: Скорость вывода с помощью EasyExcel
300 записей и полторы минуты? Могу предложить свою DLL, которая выгрузит это за 1 секунду. правда сдалана на CW 6.1. Как бы не ругалась на версии
Re: Скорость вывода с помощью EasyExcel
Конечно, интересно было бы попробовать. С помощью SetClipBoard тоже можно добиться такого времени, если при этом не нужно ничего форматировать в Excel. Я заметил, что EasyExcel занимается этим достаточно долго, а такие места в документе есть, т.к. в некоторых случаях приходится объединять несколько колонок и сворачивать там текст, что отъедает много времени.
- Admin
- Администратор
- Сообщения: 3960
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Re: Скорость вывода с помощью EasyExcel
Глупый вопрос, дрова правильные стоят?Anatoly писал(а):При этом, если там где установлены принтера не KYOSERA вывод в Excel идет за секунды, то там где установлены принтера KYOSERA тот же документ идет несколько минут и соответственно если без KYOSERA вывод идет минуты, то вывод такого документа с KYOSERA может вылиться в часы.
Отсюда http://www.kyoceramita.ru обновлять пробовали?
Другую версию попробовать дров, или еще какие варианты...
Хрень какая то
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- ✯ Ветеран ✯
- Сообщения: 1014
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Re: Скорость вывода с помощью EasyExcel
Может - если можно (нет "крутого форматирования и проч красоты" в итоговых файликах xls ) и есть время - изменить подход - формировать из очереди чтониб в виде csv или html на печать (смысле однострочный файлик ASCII/BASIC -> проход по очереди -> tempory.cvs -> ну и на печать и через EasyExcel и для пробы например через dExel , который не тянет с собой довески и подключить не проблема)? Или "бяка" вылазит при любом варианте при обращении к принтеру KYOSERA? Тогда возможно не в EasyExcel проблема?
Бред, конечно - на вирусы проверяли?
Код: Выделить всё
if glo:FlagRunExcel = '0' ! открыть Excel
XLS.RunExcel(clip(GLO:OutFileSave))
.
Бред, конечно - на вирусы проверяли?
Re: Скорость вывода с помощью EasyExcel
Я бы вам советовал обратиь "пристальное" внимание на XML -
Генерите текстовой файл как хотите, со всеми форматами и Excel его глотает на ура
Вот файл, что создан нашей АБС
Это обычный Excel файл, только сохраненный не бинарно, а в формате xml
Очень удобно и быстро и Excel его принимает как родной
Генерите текстовой файл как хотите, со всеми форматами и Excel его глотает на ура
Вот файл, что создан нашей АБС
Это обычный Excel файл, только сохраненный не бинарно, а в формате xml
Очень удобно и быстро и Excel его принимает как родной
Код: Выделить всё
<?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">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<LastAuthor>IKSWIFT</LastAuthor>
<Created>2011-03-17T06:35:41Z</Created>
<Version>11.9999</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>10005</WindowHeight>
<WindowWidth>10005</WindowWidth>
<WindowTopX>120</WindowTopX>
<WindowTopY>135</WindowTopY>
<RefModeR1C1/>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Arial Cyr" x:CharSet="204"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s21">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Font ss:Bold="1"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s22">
<Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
<Font/>
<NumberFormat ss:Format="#0"/>
</Style>
<Style ss:ID="s23">
<Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
<Font/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s24">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Font/>
<NumberFormat ss:Format="dd\.mm\.yyyy"/>
</Style>
<Style ss:ID="s25">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Font/>
<NumberFormat ss:Format=";;"/>
</Style>
</Styles>
<Worksheet ss:Name="РЎРїРёС_Р_Рє С_С╪РчС'Р_Р_ С_азР_РчР>Р° Р_">
<Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="2" x:FullColumns="1"
x:FullRows="1" ss:StyleID="s21">
<Column ss:StyleID="s22" ss:Width="48.75"/>
<Column ss:StyleID="s23" ss:Width="140.25" ss:Span="1"/>
<Column ss:Index="4" ss:StyleID="s24" ss:Width="53.25"/>
<Column ss:StyleID="s23" ss:Width="342.75"/>
<Column ss:StyleID="s23" ss:Width="189"/>
<Column ss:StyleID="s25" ss:AutoFitWidth="0"/>
<Column ss:StyleID="s23" ss:Width="132.75"/>
<Column ss:StyleID="s22" ss:Width="48.75"/>
<Row>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р_Р_РчР_С'РёС"РёРєР°С'Р_С_ С_С╪РчС'Р°</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р_Р_Р_РчС_ С_С╪РчС'Р°</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р_аиР_РчР_Р_Р_Р°Р_РёРч РєР>РёРчР_С'Р°</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р"Р°С'Р° Р_С'РєС_С<С'РёС_</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р_аиР_РчР_Р_Р_Р°Р_РёРч С_С╪РчС'Р°</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р_Р_Р>Р_Р_Рч Р_аиР_РчР_Р_Р_Р°Р_РёРч РєР>РёРчР_С'Р°</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р"Р°С'Р° закС_С<С'РёС_</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р_Р_Р_Р_РчР_С'Р°С_РёР№ Рє С_С╪РчС'С_</Data></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">Р_Р_Р_РчС_ Р_С'Р_РчР>РчР_РёС_</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="Number">2592</Data></Cell>
<Cell><Data ss:Type="String">40702810200000000105</Data></Cell>
<Cell><Data ss:Type="String">РўРР_Р_Р_-Р_Р_Р РўР_</Data></Cell>
<Cell><Data ss:Type="DateTime">1997-01-23T00:00:00.000</Data></Cell>
<Cell><Data ss:Type="String">Р_Р_Р_ Р_Р°С_С╪Р_Р_-РїС_Р_РёР·Р_Р_Р_С_С'. РєР_Р_РїР°Р_РёС_ "РўРчС:Р_Р_-Р_Р°С_С'Р° Р>РўР""</Data></Cell>
<Cell><Data ss:Type="String">Р_Р_Р_ Р_Р_Р_ "РўРР_Р_Р_-Р_Р_Р РўР_ Р>РўР""</Data></Cell>
<Cell><Data ss:Type="Number">117610</Data></Cell>
<Cell><Data ss:Type="String"> </Data></Cell>
<Cell><Data ss:Type="Number">2</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<PageMargins x:Bottom="0.984251969" x:Left="0.78740157499999996"
x:Right="0.78740157499999996" x:Top="0.984251969"/>
</PageSetup>
<Selected/>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
-
- ✯ Ветеран ✯
- Сообщения: 1014
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Re: Скорость вывода с помощью EasyExcel
Забыл написать - обязательно проверять "бяку" с вариантом
Да, согласен по XML - просто, думаю принципе на данной стадии без разницы на чем тестить, если проблему локализует, он сам выберет что удобнее ему - может как было оставитЕсли пользователь за время вывода не работает с печатью вроде все Ок, но если он в это время ее из параллельных заданий тронул, то все опять начинает тормозить.
Re: Скорость вывода с помощью EasyExcel
Кому интересно: Проблема была в использовании метода SetPageSetup в начале вывода данных в Excel.
Этот метод делает обращение к принтеру "по умолчанию" и далее уже в работу включается системная программа Spoolsv.exe, которая активно отжирает ресурсы машины. Переставил этот метод в самый конец вывода данных и все заработало как надо.
Этот метод делает обращение к принтеру "по умолчанию" и далее уже в работу включается системная программа Spoolsv.exe, которая активно отжирает ресурсы машины. Переставил этот метод в самый конец вывода данных и все заработало как надо.