Страница 1 из 2

Easy Excel

Добавлено: 23 Февраль 2013, 21:22
Tuko_G
Добрый день

исползую Template EasyExcel 4.0 . генерирую екселовскую форму принимая ряд команд оформления текста (SetFont, FontSize, MErgeCell, drawtable ..) , количество строк приблизительно 500 строков . Проблема что генерация зантмает много времени (2-4 мин на i5) но когда я записал программу именно на сервер (IBM XEON 2 ЦПО 32 RAM OS-windows serverR2) совсем умер , нужен около 10 мин.

Что делать ? как ускорить процесс

с уважением
Tuko_Geo

Re: Easy Excel

Добавлено: 24 Февраль 2013, 5:29
Admin
А данные из очереди не построчно случаем выводите?
Код этих 500 строк можно в студию?

Re: Easy Excel

Добавлено: 24 Февраль 2013, 11:52
Tuko_G
Да посрочном, потому что мне нужно почти все форматировать посвоему. (к сожолению)

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

      EXLClass.Init(true,false,true)
      EXLClass.OpenWorkbook(Glo:ExcelFileName,false,,,false)
      Loc:ExcelStarted = 1
      Do Main


Main Routine

 EXLClass.Visible(false)
  If Loc:Main_Games = 1 Then Do Print_Main_Games.

Print_Main_Games Routine
  Clear(Under)
  EXLClass.SelectSheet(1);  R=6
  LIS:PNumber = Glo:ProgN; LIS:TNumber = 1;
  HeadC = 0; HeadS = 0
  Set(LIS:KeyPTNumber,LIS:KeyPTNumber)
  Loop 
     Next(Listi)
     If errorcode() or LIS:PNumber <> Glo:ProgN Then Break.
     If LIS:Shedegi <> '...' Or LIS:Gad <> 0 Then Cycle.
     if lis:date < Today() or (lis:date = Today() and lis:TIme < clock()) then cycle.
     If Loc:FromCode1 <> 0 Then
        If LIS:TNumber < Loc:FromCode1 Then Cycle.
        If LIS:TNumber > Loc:ToCode1 Then Cycle.
     End
     case Lis:Status
     of 'B' orof 'N' orof 'L'
        Cycle
     .
     Case Lis:Status
     Of '1' Orof '2' Orof '3' orof 'P'
        If (HeadS <> LIS:SpecHeadCode) Or ((LIS:HeadCode<>0) And (LIS:HeadCode <> HeadC)) Or (LIS:LStat[1] = 1) Then
           Do PrintHead
           HeadC = LIS:HeadCode; HeadS = LIS:SpecHeadCode
        .
     Else
       If HeadC <> LIS:HeadCode Then
          Do PrintHead
          HeadC = LIS:HeadCode
       .
     End
     Do ReformatRow
  End

  If R > Sav:S_Row Then
     EXLClass.SelectRange(Sav:S_Row,1,R,Sav:With); EXLClass.DrawTable(BoxMode:Table,LineStyle:Dash,BorderWeight:Hairline)
  .

  Loop j=1 To 5000
     if Under[j]=1 Then
        EXLClass.SelectRange(j,1,j,3)
        EXLClass.SetBorder(Border:EdgeBottom,LineStyle:Continuous,BorderWeight:Medium)
  .  .
  
 PrintHead Routine
   Case LIS:Status
   Of 'M' orof 'P'
      Do HPrintM
   Of 'H' Orof 'B'
      Do HPrintH
   Of 'T'
      Do HPrintT
   Of 'N'
     Do Hprinttennis
   Of '1' Orof '2' Orof '3'
     Do HPrint1
   End

ReformatRow Routine
   Case LIS:Status
   Of 'M' orof 'P'
    Do ReformatM
   Of 'T' Orof 'H' OrOf 'B'
    Do ReformatT
   Of 'N'
    Do ReformatTennis
   Of '1' Orof '2' orof '3'
    Do Reformat6
   End
 
 
 
HPrintM Routine
  Do GetDivName; Do PrintMainHeader
     NN=Lis:Status
     Do HCodi_Teams
     EXLClass.WriteRow(R,6,'1,X,2,1X,X2,12'); EXLClass.SetFont('Arial',8,,Font:Bold)
     EXLClass.WriteRow(R,12,'meti,tot.,nakl'); EXLClass.SetFont('LitNusx',8,,Font:Bold);
     EXLClass.WriteRow(R,15,'(0)1,(0)2'); EXLClass.SetFont('Arial',8,,Font:Bold)
     EXLClass.WriteRow(R,17,'ki,ara'); EXLClass.SetFont('LitNusx',8,,Font:Bold);
     Sav:B_D = R-1


	 
PrintMainHEader Routine                                                                                         !
  EXLClass.SelectRange(R,1,R,18);  EXLClass.SetFont(Glo:Header_Font,Glo:Header_Font_Syze,);
  EXLClass.SelectRange(R,1,R,5);   EXLClass.Mergecells; EXLClass.SetFont(Glo:Div_Font,Glo:Div_Font_Syze, COLOR:Black, Glo:Div_Font_Style);
                                                        Do Format_STR
                                                        EXLClass.Write(R,1,Clip(Loc:HeadM))
                                                        if str_Yes then do set_font_div.

     EXLClass.SelectRange(R,6,R,8);   EXLClass.Mergecells; EXLClass.Write(R,6,'ZiriTadi')
     EXLClass.SelectRange(R,9,R,11);  EXLClass.Mergecells; EXLClass.Write(R,9,'saSualo')     
     EXLClass.SelectRange(R,12,R,14); EXLClass.Mergecells; EXLClass.Write(R,12,'burTebi')
     EXLClass.SelectRange(R,15,R,16); EXLClass.Mergecells; EXLClass.Write(R,15,'freze gayra')
     EXLClass.SelectRange(R,17,R,18); EXLClass.Mergecells; EXLClass.Write(R,17,'2-gaitans')
     EXLClass.SelectRange(R,6,R,18);  EXLClass.SetFont(Glo:Header_Font,Glo:Header_Font_Syze,,Font:Bold)
	 



!********* Reformat MAin **************************************************************!
ReformatM Routine                                                                      !
 Do ClaFormatM; Do RCodi_Teams                                                         !
  EXLClass.Write(R,6, Left(Clip(L:W)),True);    EXLClass.Write(R,7, Left(Clip(L:X)),True);   EXLClass.Write(R,8, Left(Clip(L:L)),True)
  EXLClass.Write(R,9, Left(Clip(L:X_1)),True);  EXLClass.Write(R,10,Left(Clip(L:X_2)),True); EXLClass.Write(R,11,Left(Clip(L:X_12)),True)
  EXLClass.Write(R,12,Left(Clip(L:G25)),True);  EXLClass.Write(R,13,Left(Clip(L:GL25)),True); EXLClass.Write(R,14,Left(Clip(L:L25)),True)
  EXLClass.Write(R,15,Left(Clip(L:F1)),True);   EXLClass.Write(R,16,Left(Clip(L:F2)),True)
  EXLClass.Write(R,17,Left(Clip(L:Gol1)),True); EXLClass.Write(R,18,Left(Clip(L:Gol2)),True)
  If Lis:Date = Today() Then
     EXLClass.SelectRange(R,6,R,18); EXLClass.SetFont(,,,Font:Bold)
  .
  Sav:With = 18                                                                        !



ClaFormatM Routine                                                       !
 L:Code = Format(Lis:TNumber,@N_5)                                       !
 L:Date = Format(Lis:Date,@D05)                                          !
 L:Time = Format(Lis:Time,@t01)                                          !
 L:DT   = L:Date & L:Time                                           !
 L:T1   = Format(Lis:Team1,@S30)                                         !
 If Lis:Status='H' Then Lis:Team2 = Clip(Lis:Team2)&Clip(Lis:Fora).      !
 L:T2   = Format(Lis:Team2,@S30)                                         !
 L:TT   = Clip(L:T1) & ' - ' & Clip(L:T2)                                !
 L:W    = Format(LIS:W,@N6.2)  ;  If LIS:W <= 1    then L:W    = '  - '. !
 L:X    = Format(LIS:X,@N6.2)  ;  If LIS:X <= 1    then L:X    = '  - '. !
 L:L    = Format(LIS:L,@N6.2)  ;  If LIS:L <= 1    then L:L    = '  - '. !
 L:X_1  = Format(LIS:X_1,@N6.2);  If LIS:X_1 <= 1  then L:X_1  = '  - '. !
 L:X_2  = Format(LIS:X_2,@N6.2);  If LIS:X_2 <= 1  then L:X_2  = '  - '. !
 L:X_12 = Format(LIS:X_12,@N6.2); If LIS:X_12 <= 1 then L:X_12 = '  - '. !
 L:G25  = Format(LIS:G25,@N6.2);  If LIS:G25 <= 1  then L:G25  = '  - '. !
 L:L25  = Format(LIS:L25,@N6.2);  If LIS:L25 <= 1  then L:L25  = '  - '. !
 L:GL25 = Format(LIS:GL25,@N6.1); If LIS:GL25 = 1  then L:GL25 = '  - '. !
 L:F1   = Format(LIS:Fre1,@N6.2); If LIS:Fre1 <= 1 then L:F1   = '  - '. !
 L:F2   = Format(LIS:Fre2,@N6.2); If LIS:Fre2 <= 1 then L:F2   = '  - '. !
 L:Gol1 = Format(LIS:Gol1,@N6.2); If LIS:Gol1 <= 1 then L:Gol1 = '  - '. !
 L:Gol2 = Format(LIS:Gol2,@N6.2); If LIS:Gol2 <= 1 then L:Gol2 = '  - '. !
  



	 
!*** GetDivNAme ***********
GetDivName Routine        !
  if lis:Status='P' Then
     Spe:Code = LIS:SpecHeadCode
     Get(Spec,Spe:Key_Code)
     If Errorcode() Then Loc:HeadM = 'Secdoma! ar weria speSalis kodi'; Er#=1
                    Else Loc:HeadM = Spe:Name; ER#=0.
  Else
     CHA:Code = LIS:HeadCode
     Get(Champ,CHA:Key_Code)
     Loc:HeadM = CHA:Name
  .
     R = R+1
     If INDX#=0 Then
        INDX#=1
        Sav:S_Row = R
     Else
        Sav:E_Row = R-1
        If Sav:E_Row > Sav:S_Row Then
           EXLClass.SelectRange(Sav:S_Row,1,Sav:E_Row,Sav:With)
           EXLClass.DrawTable(BoxMode:Table,LineStyle:Dash,BorderWeight:Hairline)
        .
        Sav:S_Row = R
     End
  EXLClass.SelectRange(Sav:B_D,1,Sav:B_D,Sav:With);
  EXLClass.SetBorder(Border:EdgeBottom,LineStyle:Continuous,BorderWeight:Thin)
  EXLClass.SelectRange(Sav:B_D+1,1,Sav:B_D+1,Sav:With);
  EXLClass.SetBorder(Border:EdgeBottom,LineStyle:Double,BorderWeight:Thick)
  If Loc:NBA_NHL = 1 Then
     EXLClass.SelectRange(Sav:B_D); EXLClass.RowHeight(30)
  Else
     EXLClass.SelectRange(Sav:B_D); EXLClass.RowHeight(19)
  .



Re: Easy Excel

Добавлено: 25 Февраль 2013, 0:11
Admin
Tuko_G писал(а):Да посрочном, потому что мне нужно почти все форматировать посвоему. (к сожолению)
В таком случае если и можно оптимизировать то совсем чуть чуть.
Макрос родной не быстрее это сделает.

Re: Easy Excel

Добавлено: 25 Февраль 2013, 10:10
IKSoft
Т.к. много надо было отчетов в Excel выводить, и, посмотрев, как долго это все работает,
написал класс CW6 для вывода отчетов прямо в бинарном виде - *.xls
т.е. на этой машине даже excel не нужен для генерации

Конечно, это на любителя, НО работает моментально.

Вот пример отчета (во вложении)

Re: Easy Excel

Добавлено: 25 Февраль 2013, 15:52
kreator
Т.е. ты знаешь формат xls файла? Может поделишься с народом. Нам тоже не помешало бы сразу формировать xls файл, без OLE и других приблуд.

Re: Easy Excel

Добавлено: 25 Февраль 2013, 20:48
gromov
Присоединяюсь к предыдущему постУ. А то сегодня глянул в эту доку - 40 Мб по-ненашему. Не осилю ...

Re: Easy Excel

Добавлено: 26 Февраль 2013, 6:38
BOB
Поищите Олега Руденко dexcel по моему , в файлах должен быть .

Re: Easy Excel

Добавлено: 26 Февраль 2013, 18:08
Developer
Привет всем! Clarion 8.0.9759 Windows 7 SP1 Русский

Есть решение Direct Excel от Олега Руденко dynalib.narod.ru Исходники dExcel v1.6.30 (~150Kb)

Вот только откомпилированный пример проекта xlstest.cwproj создаёт файл Test.xls, при открытии которого Excel 2010 пишет "Файл повреждён, поэтому его нельзя открыть".

Кто работал с данным решением, подскажите пожалуйста, что необходимо сделать для получения в тестовом проекте xlstest.cwproj (xlstest.clw) файла правильного формата .XLS который корректно откроет Excel 2010.

С Уважением, Developer, cfwdeveloper@gmail.com

Re: Easy Excel

Добавлено: 27 Февраль 2013, 2:02
gopstop2007

Re: Easy Excel

Добавлено: 27 Февраль 2013, 9:41
IKSoft
Прошу прошения за долгий ответ - я здесь не часто
Могу сделать DLL с экспортируемыми функциями

Но я бы посоветовал вам создавать Excel файлы в XML формате
Они прекрасно открываются им

вот пример, как наша АБС выводит список в Excel
Файл "Список счетов раздела А.xml":

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

<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<?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" />
  <Styles>
    <Style ss:ID="Default">
      <Alignment ss:Horizontal="Center" />
      <Font ss:Bold="1" />
      <NumberFormat ss:Format="@" />
    </Style>
    <Style ss:ID="sID0">
      <Alignment ss:Horizontal="Right" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="#0" />
    </Style>
    <Style ss:ID="sID1">
      <Alignment ss:Horizontal="Left" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="@" />
    </Style>
    <Style ss:ID="sID2">
      <Alignment ss:Horizontal="Left" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="@" />
    </Style>
    <Style ss:ID="sID3">
      <Alignment ss:Horizontal="Center" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="DD.MM.YYYY" />
    </Style>
    <Style ss:ID="sID4">
      <Alignment ss:Horizontal="Left" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="@" />
    </Style>
    <Style ss:ID="sID5">
      <Alignment ss:Horizontal="Left" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="@" />
    </Style>
    <Style ss:ID="sID6">
      <Alignment ss:Horizontal="Center" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="DD.MM.YYYY" />
    </Style>
    <Style ss:ID="sID7">
      <Alignment ss:Horizontal="Left" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="@" />
    </Style>
    <Style ss:ID="sID8">
      <Alignment ss:Horizontal="Right" />
      <Font ss:Bold="0" />
      <NumberFormat ss:Format="#0" />
    </Style>
  </Styles>
  <Worksheet ss:Name="Список счетов раздела А">
    <Table ss:ExpandedColumnCount="9" ss:ExpandedRowCount="2" x:FullColumns="1" x:FullRows="1">
      <Column ss:StyleID="sID0" ss:AutoFitWidth="1" />
      <Column ss:StyleID="sID1" ss:AutoFitWidth="1" ss:Width="140" />
      <Column ss:StyleID="sID2" ss:AutoFitWidth="1" ss:Width="140" />
      <Column ss:StyleID="sID3" ss:AutoFitWidth="1" />
      <Column ss:StyleID="sID4" ss:AutoFitWidth="1" ss:Width="126" />
      <Column ss:StyleID="sID5" ss:AutoFitWidth="1" ss:Width="189" />
      <Column ss:StyleID="sID6" ss:AutoFitWidth="1" />
      <Column ss:StyleID="sID7" ss:AutoFitWidth="1" ss:Width="133" />
      <Column ss:StyleID="sID8" ss:AutoFitWidth="1" />
      <Row ss:StyleID="Default">
        <Cell>
          <Data ss:Type="String">Идентификатор счета</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Номер счета</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Наименование клиента</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Дата открытия</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Наименование счета</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Полное наименование клиента</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Дата закрытия</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Комментарий к счету</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">Номер отделения</Data>
        </Cell>
      </Row>
      <Row>
        <Cell>
          <Data ss:Type="Number">8472</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">4070281000000000007</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">ЛТД</Data>
        </Cell>
        <Cell>
          <Data ss:Type="DateTime">1999-05-12T00:00:00.000</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String"> ООО "ЛТД "</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">ООО "ЛТД"</Data>
        </Cell>
        <Cell>
          <Data ss:Type="String"> </Data>
        </Cell>
        <Cell>
          <Data ss:Type="String">нет свед.</Data>
        </Cell>
        <Cell>
          <Data ss:Type="Number">2</Data>
        </Cell>
      </Row>
    </Table>
  </Worksheet>
</Workbook>

Re: Easy Excel

Добавлено: 27 Февраль 2013, 10:18
kreator
Ссылка gopstop2007 - хоть что-то, правда, чтобы в этом разобраться - жизни не хватит. А с xml не всё гладко. У меня Excel 2007 сразу не открывает, говорит не тот формат, потом через какую-то конвертацию открывает. Потом, не понятно как быть с картинками, графиками, сложным форматированием ячеек. Пользователю нужно что? Нажал кнопку - через 15 секунд открылся в Excel красивый лист с форматированием, графиками и т.д. Через OLE всё путём, но уж очень долго на больших объёмах информации.

Re: Easy Excel

Добавлено: 27 Февраль 2013, 10:31
IKSoft
Странно, у меня Excel 2003 и открывает без вопросов
Правда, ставил патч для работы с docx
Но в excel 2007 он уже должен быть.

А картинки и графики в моей реализации тоже нет - не нужно мне тогда это было (~2003 год)

Re: Easy Excel

Добавлено: 27 Февраль 2013, 10:50
kreator
Получается вот что.
Если открывать через проводник или Total Commander, то Excel открывается с пустым листом.
Если из Excel открывать, то:
1.jpg
Нажимем на OK и:
2.jpg
В общем, не есть хорошо. но я заметил, что есть какая-то разница из-за заголовка xml файла. Некоторые открываются без проблем.

Re: Easy Excel

Добавлено: 27 Февраль 2013, 14:27
Yufil
Когда-то был такой ActiveX Formula One , строил вполне удовлетворительные электронные таблицы.
Со скоростью в разы выше Ёкселя.

Вчера погуглил - жив, курилка...