Easy Excel

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Tuko_G
Бывалый
Сообщения: 95
Зарегистрирован: 09 Декабрь 2005, 10:47
Откуда: Tbilisi, Georgia
Контактная информация:

Easy Excel

Сообщение 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
Аватара пользователя
Admin
Администратор
Сообщения: 3963
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 29 раз
Поблагодарили: 22 раза
Контактная информация:

Re: Easy Excel

Сообщение Admin »

А данные из очереди не построчно случаем выводите?
Код этих 500 строк можно в студию?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Tuko_G
Бывалый
Сообщения: 95
Зарегистрирован: 09 Декабрь 2005, 10:47
Откуда: Tbilisi, Georgia
Контактная информация:

Re: Easy Excel

Сообщение 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)
  .


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

Re: Easy Excel

Сообщение Admin »

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

Re: Easy Excel

Сообщение IKSoft »

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

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

Вот пример отчета (во вложении)
Вложения
Пример отчета Excel в бинарном виде
Пример отчета Excel в бинарном виде
kreator
✯ Ветеран ✯
Сообщения: 5037
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 23 раза

Re: Easy Excel

Сообщение kreator »

Т.е. ты знаешь формат xls файла? Может поделишься с народом. Нам тоже не помешало бы сразу формировать xls файл, без OLE и других приблуд.
We are hard at work… for you. :)
gromov
Старожил
Сообщения: 264
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

Re: Easy Excel

Сообщение gromov »

Присоединяюсь к предыдущему постУ. А то сегодня глянул в эту доку - 40 Мб по-ненашему. Не осилю ...
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Easy Excel

Сообщение BOB »

Поищите Олега Руденко dexcel по моему , в файлах должен быть .
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Re: Easy Excel

Сообщение 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
С Уважением, Developer
gopstop2007
✯ Ветеран ✯
Сообщения: 1708
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Re: Easy Excel

Сообщение gopstop2007 »

“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
IKSoft
Посетитель
Сообщения: 42
Зарегистрирован: 27 Май 2010, 13:38

Re: Easy Excel

Сообщение 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>
kreator
✯ Ветеран ✯
Сообщения: 5037
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 23 раза

Re: Easy Excel

Сообщение kreator »

Ссылка gopstop2007 - хоть что-то, правда, чтобы в этом разобраться - жизни не хватит. А с xml не всё гладко. У меня Excel 2007 сразу не открывает, говорит не тот формат, потом через какую-то конвертацию открывает. Потом, не понятно как быть с картинками, графиками, сложным форматированием ячеек. Пользователю нужно что? Нажал кнопку - через 15 секунд открылся в Excel красивый лист с форматированием, графиками и т.д. Через OLE всё путём, но уж очень долго на больших объёмах информации.
We are hard at work… for you. :)
IKSoft
Посетитель
Сообщения: 42
Зарегистрирован: 27 Май 2010, 13:38

Re: Easy Excel

Сообщение IKSoft »

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

А картинки и графики в моей реализации тоже нет - не нужно мне тогда это было (~2003 год)
kreator
✯ Ветеран ✯
Сообщения: 5037
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 23 раза

Re: Easy Excel

Сообщение kreator »

Получается вот что.
Если открывать через проводник или Total Commander, то Excel открывается с пустым листом.
Если из Excel открывать, то:
1.jpg
Нажимем на OK и:
2.jpg
В общем, не есть хорошо. но я заметил, что есть какая-то разница из-за заголовка xml файла. Некоторые открываются без проблем.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Easy Excel

Сообщение Yufil »

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

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