Easy Excel
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- 
				Tuko_G
- Бывалый
- Сообщения: 95
- Зарегистрирован: 09 Декабрь 2005, 10:47
- Откуда: Tbilisi, Georgia
- Контактная информация:
							 Easy Excel
						Easy Excel
		
													
							
						
			
			
			
			
			Добрый день
исползую Template EasyExcel 4.0 . генерирую екселовскую форму принимая ряд команд оформления текста (SetFont, FontSize, MErgeCell, drawtable ..) , количество строк приблизительно 500 строков . Проблема что генерация зантмает много времени (2-4 мин на i5) но когда я записал программу именно на сервер (IBM XEON 2 ЦПО 32 RAM OS-windows serverR2) совсем умер , нужен около 10 мин.
Что делать ? как ускорить процесс
с уважением
Tuko_Geo
			
			
									
						исползую Template EasyExcel 4.0 . генерирую екселовскую форму принимая ряд команд оформления текста (SetFont, FontSize, MErgeCell, drawtable ..) , количество строк приблизительно 500 строков . Проблема что генерация зантмает много времени (2-4 мин на i5) но когда я записал программу именно на сервер (IBM XEON 2 ЦПО 32 RAM OS-windows serverR2) совсем умер , нужен около 10 мин.
Что делать ? как ускорить процесс
с уважением
Tuko_Geo
- Admin
- Администратор
- Сообщения: 4022
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 59 раз
- Поблагодарили: 42 раза
- Контактная информация:
Re: Easy Excel
А данные из очереди не построчно случаем выводите?
Код этих 500 строк можно в студию?
			
			
									
						Код этих 500 строк можно в студию?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
			
						- 
				Tuko_G
- Бывалый
- Сообщения: 95
- Зарегистрирован: 09 Декабрь 2005, 10:47
- Откуда: Tbilisi, Georgia
- Контактная информация:
Re: Easy Excel
Да посрочном, потому что мне нужно почти все форматировать посвоему. (к сожолению)
			
			
									
						Код: Выделить всё
      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
- Администратор
- Сообщения: 4022
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 59 раз
- Поблагодарили: 42 раза
- Контактная информация:
Re: Easy Excel
В таком случае если и можно оптимизировать то совсем чуть чуть.Tuko_G писал(а):Да посрочном, потому что мне нужно почти все форматировать посвоему. (к сожолению)
Макрос родной не быстрее это сделает.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
			
						Re: Easy Excel
Т.к. много надо было отчетов в Excel выводить, и, посмотрев, как долго это все работает,
написал класс CW6 для вывода отчетов прямо в бинарном виде - *.xls
т.е. на этой машине даже excel не нужен для генерации
Конечно, это на любителя, НО работает моментально.
Вот пример отчета (во вложении)
			
							
			
									
						написал класс CW6 для вывода отчетов прямо в бинарном виде - *.xls
т.е. на этой машине даже excel не нужен для генерации
Конечно, это на любителя, НО работает моментально.
Вот пример отчета (во вложении)
- 
				kreator
- ✯ Ветеран ✯
- Сообщения: 5235
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Easy Excel
Т.е. ты знаешь формат xls файла? Может поделишься с народом. Нам тоже не помешало бы сразу формировать xls файл, без OLE и других приблуд.
			
			
									
						We are hard at work… for you.   
			
						
- 
				gromov
- Старожил
- Сообщения: 281
- Зарегистрирован: 11 Февраль 2009, 8:41
- Откуда: г. Анапа
- Поблагодарили: 3 раза
Re: Easy Excel
Присоединяюсь к предыдущему постУ. А то сегодня глянул в эту доку - 40 Мб по-ненашему. Не осилю ...
			
			
									
						Re: Easy Excel
Привет всем! 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
			
			
									
						Есть решение 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
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 30 раз
- Поблагодарили: 10 раз
Re: Easy Excel
может поможет
http://sources.codenet.ru/download/343/xls_rus.html
			
			
									
						http://sources.codenet.ru/download/343/xls_rus.html
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
			
						Re: Easy Excel
Прошу прошения за долгий ответ -  я здесь не часто
Могу сделать DLL с экспортируемыми функциями
Но я бы посоветовал вам создавать Excel файлы в XML формате
Они прекрасно открываются им
вот пример, как наша АБС выводит список в Excel
Файл "Список счетов раздела А.xml":
			
			
									
						Могу сделать 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
- ✯ Ветеран ✯
- Сообщения: 5235
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Easy Excel
Ссылка gopstop2007 - хоть что-то, правда, чтобы в этом разобраться - жизни не хватит. А с xml не всё гладко. У меня Excel 2007 сразу не открывает, говорит не тот формат, потом через какую-то конвертацию открывает. Потом, не понятно как быть с картинками, графиками, сложным форматированием ячеек. Пользователю нужно что? Нажал кнопку - через 15 секунд открылся в Excel красивый лист с форматированием, графиками и т.д. Через OLE всё путём, но уж очень долго на больших объёмах информации.
			
			
									
						We are hard at work… for you.   
			
						
Re: Easy Excel
Странно, у меня Excel 2003 и открывает без вопросов
Правда, ставил патч для работы с docx
Но в excel 2007 он уже должен быть.
А картинки и графики в моей реализации тоже нет - не нужно мне тогда это было (~2003 год)
			
			
									
						Правда, ставил патч для работы с docx
Но в excel 2007 он уже должен быть.
А картинки и графики в моей реализации тоже нет - не нужно мне тогда это было (~2003 год)
- 
				kreator
- ✯ Ветеран ✯
- Сообщения: 5235
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Easy Excel
Получается вот что.
Если открывать через проводник или Total Commander, то Excel открывается с пустым листом.
Если из Excel открывать, то: Нажимем на OK и: В общем, не есть хорошо. но я заметил, что есть какая-то разница из-за заголовка xml файла. Некоторые открываются без проблем.
			
			
									
						Если открывать через проводник или Total Commander, то Excel открывается с пустым листом.
Если из Excel открывать, то: Нажимем на OK и: В общем, не есть хорошо. но я заметил, что есть какая-то разница из-за заголовка xml файла. Некоторые открываются без проблем.
We are hard at work… for you.   
			
						
Re: Easy Excel
Когда-то был такой ActiveX Formula One , строил вполне удовлетворительные электронные таблицы. 
Со скоростью в разы выше Ёкселя.
Вчера погуглил - жив, курилка...
			
			
									
						Со скоростью в разы выше Ёкселя.
Вчера погуглил - жив, курилка...

