Скорость вывода с помощью EasyExcel

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Anatoly
Бывалый
Сообщения: 91
Зарегистрирован: 11 Август 2005, 9:33
Откуда: Томск

Скорость вывода с помощью EasyExcel

Сообщение Anatoly »

Окружение: 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
Anatoly
Бывалый
Сообщения: 91
Зарегистрирован: 11 Август 2005, 9:33
Откуда: Томск

Re: Скорость вывода с помощью EasyExcel

Сообщение Anatoly »

Если кому интересно: для ускорения вывода в Excel кроме переключения принтеров стал использовать команду обмена данных через буфер Windows SetClipBoard c последующим восстановлением EasyExcelClass.PasteSpecial. Скорость вывода увеличилась в 5 раз.
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Скорость вывода с помощью EasyExcel

Сообщение Admin »

Вывод в Excel через что? Через свой интерфейс или EasyExcel ?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Anatoly
Бывалый
Сообщения: 91
Зарегистрирован: 11 Август 2005, 9:33
Откуда: Томск

Re: Скорость вывода с помощью EasyExcel

Сообщение Anatoly »

Вывод с помощью EasyExcel ver.4.04
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Скорость вывода с помощью EasyExcel

Сообщение Admin »

Anatoly писал(а):Вывод с помощью EasyExcel ver.4.04
И что WriteQueue c WriteMode = WriteMode:Buffer медленно выводит?
Это сколько интересно записей и столбцов в очереди?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Anatoly
Бывалый
Сообщения: 91
Зарегистрирован: 11 Август 2005, 9:33
Откуда: Томск

Re: Скорость вывода с помощью EasyExcel

Сообщение Anatoly »

WriteQueue с любыми параметрами и с любой Queue, состоящей хоть из одной записи хоть из несколькоих выдает "Неизвестная ошибка драйвера" и падает в GPF.
Документ, который тормозит, состоит из 68 столбцов и примерно 300 записей.
Сейчас вышел (со всеми вышеперечисленными приемами) на приемлемое время вывода = 1минута 30 сек.
IKSoft
Посетитель
Сообщения: 42
Зарегистрирован: 27 Май 2010, 13:38

Re: Скорость вывода с помощью EasyExcel

Сообщение IKSoft »

300 записей и полторы минуты? Могу предложить свою DLL, которая выгрузит это за 1 секунду. правда сдалана на CW 6.1. Как бы не ругалась на версии
Anatoly
Бывалый
Сообщения: 91
Зарегистрирован: 11 Август 2005, 9:33
Откуда: Томск

Re: Скорость вывода с помощью EasyExcel

Сообщение Anatoly »

Конечно, интересно было бы попробовать. С помощью SetClipBoard тоже можно добиться такого времени, если при этом не нужно ничего форматировать в Excel. Я заметил, что EasyExcel занимается этим достаточно долго, а такие места в документе есть, т.к. в некоторых случаях приходится объединять несколько колонок и сворачивать там текст, что отъедает много времени.
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Скорость вывода с помощью EasyExcel

Сообщение Admin »

Anatoly писал(а):При этом, если там где установлены принтера не KYOSERA вывод в Excel идет за секунды, то там где установлены принтера KYOSERA тот же документ идет несколько минут и соответственно если без KYOSERA вывод идет минуты, то вывод такого документа с KYOSERA может вылиться в часы.
Глупый вопрос, дрова правильные стоят?
Отсюда http://www.kyoceramita.ru обновлять пробовали?
Другую версию попробовать дров, или еще какие варианты...

Хрень какая то :(
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
IKSoft
Посетитель
Сообщения: 42
Зарегистрирован: 27 Май 2010, 13:38

Re: Скорость вывода с помощью EasyExcel

Сообщение IKSoft »

Ал
✯ Ветеран ✯
Сообщения: 1014
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Re: Скорость вывода с помощью EasyExcel

Сообщение Ал »

Может - если можно (нет "крутого форматирования и проч красоты" в итоговых файликах xls ) и есть время - изменить подход - формировать из очереди чтониб в виде csv или html на печать (смысле однострочный файлик ASCII/BASIC -> проход по очереди -> tempory.cvs -> ну и на печать и через EasyExcel и для пробы например через dExel

Код: Выделить всё

 if glo:FlagRunExcel = '0'  ! открыть Excel
      XLS.RunExcel(clip(GLO:OutFileSave))
  .
, который не тянет с собой довески и подключить не проблема)? Или "бяка" вылазит при любом варианте при обращении к принтеру KYOSERA? Тогда возможно не в EasyExcel проблема?
Бред, конечно - на вирусы проверяли?
IKSoft
Посетитель
Сообщения: 42
Зарегистрирован: 27 Май 2010, 13:38

Re: Скорость вывода с помощью EasyExcel

Сообщение IKSoft »

Я бы вам советовал обратиь "пристальное" внимание на XML -

Генерите текстовой файл как хотите, со всеми форматами и 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 - просто, думаю принципе на данной стадии без разницы на чем тестить, если проблему локализует, он сам выберет что удобнее ему - может как было оставит
Anatoly
Бывалый
Сообщения: 91
Зарегистрирован: 11 Август 2005, 9:33
Откуда: Томск

Re: Скорость вывода с помощью EasyExcel

Сообщение Anatoly »

Кому интересно: Проблема была в использовании метода SetPageSetup в начале вывода данных в Excel.
Этот метод делает обращение к принтеру "по умолчанию" и далее уже в работу включается системная программа Spoolsv.exe, которая активно отжирает ресурсы машины. Переставил этот метод в самый конец вывода данных и все заработало как надо.
Ответить