powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
25 сообщений из 39, страница 1 из 2
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860508
vector0001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите меня дорогие форумчане!!! Тема очень сильно избитая но я не смог решить свою проблему. Поэтому прошу помощи у Вас.

Моя проблема заключается в том что я нашел компонент NativeExcel в RAD Studio XE8. Меня все устраивало. Отличная библиотека.
Но оказалось что при выгрузке моего запроса в xlsx символы Unicode например стрелочки кубы и т.д. экспортировались некорректно и файл становится битым. На просторах интернета нашел что у данного компонента есть проблема с выгрузкой unicode кодировки.

Прошу Вас помочь в решении данной проблемы. Возможно ссылкой на компонент для выгрузки запроса. Построчное добавление или вставкой массива в шаблон очень не хочется.
Построчное исполнение подвисает программу а при выгрузке 100 тыс строк это критично.
Также при моей реализации кода с OLE нельзя было пользоваться EXCEL параллельно.

Очень прошу не говорить о платных библиотеках. И если можно то с ссылкой на то чтобы загрузить и применить в собственных проектах не коммерческие использование.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860513
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Вы не в состоянии ни проводить выгрузку в фоновом потоке, ни стартовать для неё
отдельный COM-сервер, то и формирование XML (которым, собственно, является xlsx) Вам не по
плечу. Выгружайте в .CSV, Ёксель его понимает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860529
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор100 тыс строк
Большие объемы через OLE лучше не грузить, очень медленно. Если нет стороннего компонента, то можно формировать CSV-файл (TStringList.DelimetedText в помощь) и уже его открывать/подключать в экселе.

авторподвисает программу а при выгрузке 100 тыс строк это критично
Если нельзя/сложно делать выгрузку в потоке, то есть простое решение -- вызов Application.ProcessMessages между записью в цикле (программа обработает всю очередь виндовых сообщений словно ничего и не зависло, заодно можно где-нибудь прогресс-бар обновить, чтобы показать процент выполнения).
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860537
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiавтор100 тыс строкБольшие объемы через OLE лучше не грузить, очень медленно.
Фигня. Вгружается мгновенно, если вгружать весь массив данных как массив 1-м запросом.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860574
vector0001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Csv удобен для выгрузки одного ответа когда ты говоришь 3-10 отчётов то расеологаешь их на разных листах excel и ты красавчик. Нет ли бесплатного компанента? Если нет то из своего опыта подскажите какой путь более прост в изучении и достаточно эффективен для решения моей задачи.
OLE ещё не нравится ибо после ввода кода везде подчеркивание и красные как я понимаю компилятор ругается. Но исполняет. Понимаю что это для профессионала не страшно но для отладки мне бредокодеру удобнее видеть ошибки в отладчике.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860582
vector0001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Application.ProcessMessages я использую в приложении. В принципе потоки начал разбирать для того чтобы приложение не зависело в момент исполнения множественных действий с данными получаемых из БД но освоить excel я надеялся проще поэтому искал компонент. Все мои предыдущие приложения этим мне и не нравились выгрузка это код больше чем рабочий код на обработку информации.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860587
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vector0001Csv удобен для выгрузки одного ответа когда ты говоришь 3-10 отчётов то расеологаешь их на разных листах excel и ты красавчик. Нет ли бесплатного компанента? ...
Для чего? Для выгрузки в CSV?
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860600
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vector0001,

есть прекрасная библиотека XLSReadWriteII. Да, она платная, зато полностью решает твою проблему. Плюс если будешь генерировать xlsx в отдельных потоках, а не в основном потоке приложения, то вообще все будет быстро делаться и ничего тормозить не будет.

Но если ты принципиальный противних платных компонент, то твой выбор - csv.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860612
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatФигня. Вгружается мгновенно, если вгружать весь массив данных как массив 1-м запросом.
Неа, не поможет. Предлагаю записать в эксель через OLE 100к записей по 100 колонок и замерить время. Будет много сюрпризов. Эксель очень тормозной по сравнению с другими методами записи/создания.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860615
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подключитесь через ODBC используя FireDAC
Либо через Microsoft.ACE.OLEDB.12.0 и ADO
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860621
vector0001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

Нет я хотел сказать что при выгрузке в csv нельзя сделать много листовой документ и разместить на каждом листе свой ответ
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860625
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vector0001ёёёёё,

Нет я хотел сказать что при выгрузке в csv нельзя сделать много листовой документ и разместить на каждом листе свой ответ
Можно даже форматирование задавать, как душе угодно и рисовать,
Главное, csv грамотно соорудить.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860632
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatorvector0001ёёёёё,

Нет я хотел сказать что при выгрузке в csv нельзя сделать много листовой документ и разместить на каждом листе свой ответ
Можно даже форматирование задавать, как душе угодно и рисовать,
Главное, csv грамотно соорудить.
Пример?
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860638
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё,

abcdcolorlstartlend120E7-6trueaacceec12a187220.1210falsebbddffc187a12
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860643
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatorёёёёё,

abcdcolorlstartlend120E7-6trueaacceec12a187220.1210falsebbddffc187a12

Где тут "многолистовой документ и отдельный отчет на каждом листе"?
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860752
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть исходники, можно попробовать исправить.
Кстати, NativeExcel тоже платный...
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860848
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёGatorёёёёё,

abcdcolorlstartlend120E7-6trueaacceec12a187220.1210falsebbddffc187a12

Где тут "многолистовой документ и отдельный отчет на каждом листе"?
Кто мешает, например, хранить в базе минимальное эксельное файло с предварительной разметкой, макро и другими приблудами?
Кто мешает заранее наваять для него UNION c разрывом страницы? Типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select null as DataForPrint,a as a, b as b, c as c ...
union all
select 'same page', a, b, c ... where sheet = 0
union all
select 'same page', a, b, c ... where sheet = 1
union all
select 'same page', a, b, c ... group buy sheet
union all
select 'page break' ,null ,null ,null
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860852
vector0001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Василий 2,

NativeExcel получен в наследство откуда его взяли не знаю но уверен что не покупали.
Что можно исправить? Проблему выгрузки? Боюсь что не смогу это сделать в виду отсутствия опыта.

Не могу поверить что на просторах интернета нет Подобных компонентов меньшего функционала но того же назначения скорее это все от того что язык постепенно угасает.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860859
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vector0001скорее это все от того что язык постепенно угасает.

Да. Пока на него летят чайники, ничего хорошего ждать не приходится. Выкинь из этой схемы
Дельфи, делай выгрузку непосредственно из экселя, через MS Query.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860882
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vector0001Василий 2,

NativeExcel получен в наследство откуда его взяли не знаю но уверен что не покупали.
Что можно исправить? Проблему выгрузки? Боюсь что не смогу это сделать в виду отсутствия опыта.

Не могу поверить что на просторах интернета нет Подобных компонентов меньшего функционала но того же назначения скорее это все от того что язык постепенно угасает.
Что мешает эти проблемные данные заэкранировать/заменить прежде, чем выгружать? Например, юникодные символы заменить на их ascii аналоги при наличии (а если нет, то выгружать вопросы или заменять на другие обозначения).

А то и просто найти более свежую версию компонентов, где эти проблемы наверняка исправлены.

P.S. Надеюсь, что используется выгрузка в xlsx-формат , а не в нативный xls, у которого куча глюков и подобных косяков как раз (помнится, когда-то у DevExpress выгрузка в xls аналогично ломалась и портила файл при определенных данных).
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860892
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще был пару лет назад случай с XLSX-файлами -- туда из сторонней программы попадали левые названия полей (совпадающие с системными) и эксель не хотел открываться. Приходилось xlsx-архив распаковывать, править проблемные xml-данные и пересобирать. Возможно, тут тоже такой лайфхак поможет, если других вариантов не будет.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860902
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovvector0001скорее это все от того что язык постепенно угасает.

Да. Пока на него летят чайники, ничего хорошего ждать не приходится. Выкинь из этой схемы
Дельфи, делай выгрузку непосредственно из экселя, через MS Query.
+Много
Нахрен дельфи с квери и екселями? Пусть идёт ящики сколачивать для картотек позапрошлого века!
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860907
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем доступ через ODBC не подходит?
Если просто выгрузить данные без разукрашивания ячеек? К тому же и сам Excel не нужен...
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860918
vector0001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полез к компонент NativeExcel нашел процедуру отвечающую за выгрузку. На скине видно как он видит текст
могу выслать всю процедуру если это поможет делу. Я так понимаю необходимо исправить момент выгрузки преобразования и перекомпилировать данный компонент.
...
Рейтинг: 0 / 0
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
    #39860921
vector0001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vector0001,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
procedure TDataset2Excel.ExportDetail;
Var
   i, rowindex: integer;
   row : integer;
   FieldType: TFieldType;
   Field: TField;
   Cell: IXLSRange;
   DValue: TDateTime;
   {$ifndef D2009}
   sValue: AnsiString;
   {$endif}
   h,m,s,ms: word;
   CurPos : TBookmark;
   //SheetRowIndex: integer;
   aLineStyle:  LongWord; 
   aLineWeight: LongWord; 

   lFirstRow: integer;
   TopBorderExist: boolean;

  function DelphiDateFormatToExcelDateFormat(Format: string): string;
  var
    i: integer;
  begin
    Result := Format;
    for i := 1 to Length(Format) do
      case Format[i] of
        'n' { Minutes }: Result[i] := 'm';
        'z' { Milisec }: Result[i] := '0';
      end;

    Result := StringReplace(Result, 'ampm', 'AM/PM', [rfReplaceAll,rfIgnoreCase]);
    Result := StringReplace(Result, 'a/p',  'AM/PM', [rfReplaceAll,rfIgnoreCase]);
  end;
  
  function DelphiNumericFormatToExcelNumericFormat(Format: string): string;
  begin
    Result := Format;
    Result := StringReplace(Result, 'S', '\S', [rfReplaceAll]);
    Result := StringReplace(Result, 's', '\s', [rfReplaceAll]);
  end;

begin
  FDataset.DisableControls;
  CurPos := FDataset.GetBookmark;
  FDataset.First;
try
  SetupGroupStorage;
  FWorksheet.Outline.SummaryRow := xlAbove;

  row := 1 + FRowOffset + FRowsPerHeader;
  lFirstRow := row;
  rowindex := 0;
  //SheetRowIndex := 0;

  while not(DataSet.Eof) do begin
     Inc(rowindex);
     Inc(FSheetRowIndex);
     FFieldsExported := 0;

     ProcessGroups(row);

     for i := 1 to FFieldsCount do begin

       if VisibleFieldsOnly and Not(FDataset.Fields[i - 1].Visible) then Continue;

       Inc(FFieldsExported);

       if FClearGroupFields and FGroupStorage.Enabled then begin
          if FGroupStorage.IsGroupField(FDataSet.Fields[i - 1].FieldName) then begin
             Continue;
          end;
       end;
       
       Field := FDataSet.Fields[i - 1]; 
       FieldType := Field.DataType;
       Cell := FWorksheet.Cells.Item[row, FFieldsExported + FColOffset];

       if FieldType = ftString then begin
          {$ifdef D2009}
          Cell.Value := Field.DisplayText;
          {$else} 
          sValue := Field.DisplayText ;
          Cell.Value := StringToWideString(sValue, DetailFont.Charset);
          {$endif} 
       {$IFNDEF D45}
       end else if (FieldType = ftFMTBcd) and (not Field.IsNull) then begin // Jordi
          Cell.Value := Field.AsFloat;
       end else if (FieldType = ftTimeStamp) then begin
          Cell.Value := Field.AsDateTime;
       {$ENDIF}
       end else begin
          Cell.Value := Field.AsVariant;
       end;

       //font
       if not(foFont in DisableFormat) then begin
           SetCellFont(DetailFont, Cell);
       end;

       //borders
       if not(foBorders in DisableFormat) then begin

           TopBorderExist := (Cell.Borders[xlEdgeTop].LineStyle <> xlLineStyleNone);

           if DetailBorderStyle <> BorderStyleNone then begin
              aLineStyle  := xlLineStyleNone;
              aLineWeight := xlThin; 
              case DetailBorderStyle of
                 BorderStyleSingleHair: begin
                                          aLineStyle  := xlContinuous;
                                          aLineWeight := xlHairline; 
                                        end;
                 BorderStyleSingleThick:begin
                                          aLineStyle  := xlContinuous;
                                          aLineWeight := xlThick; 
                                        end;
                 BorderStyleSingleThin:begin
                                          aLineStyle  := xlContinuous;
                                          aLineWeight := xlThin; 
                                        end;
                 BorderStyleDouble:begin
                                          aLineStyle  := xlDouble;
                                          aLineWeight := xlThick; 
                                        end;
              end;

              Cell.Borders[xlEdgeBottom].LineStyle := aLineStyle;
              Cell.Borders[xlEdgeLeft].LineStyle   := aLineStyle;
              Cell.Borders[xlEdgeRight].LineStyle  := aLineStyle;

              if aLineStyle <> xlLineStyleNone then begin
                 Cell.Borders[xlEdgeBottom].Weight := aLineWeight;
                 Cell.Borders[xlEdgeLeft].Weight   := aLineWeight;
                 Cell.Borders[xlEdgeRight].Weight  := aLineWeight;
              end;

              if Not(TopBorderExist) then begin
                  Cell.Borders[xlEdgeTop].LineStyle := aLineStyle;
                  if aLineStyle <> xlLineStyleNone then begin
                      Cell.Borders[xlEdgeTop].Weight := aLineWeight;
                  end;
              end;

           end;

           if DetailBorderColor <> clNone then begin
               Cell.Borders[xlEdgeBottom].Color := ColorToRGB(DetailBorderColor);
               Cell.Borders[xlEdgeLeft].Color   := ColorToRGB(DetailBorderColor);
               Cell.Borders[xlEdgeRight].Color  := ColorToRGB(DetailBorderColor);
               if Not(TopBorderExist) then 
                  Cell.Borders[xlEdgeTop].Color  := ColorToRGB(DetailBorderColor);
           end;

       end;

       //numberformat
       if not(foNumberFormat in DisableFormat) then begin
           
           case FieldType of

              ftDate: if TDateField(Field).DisplayFormat <> '' then begin
                         Cell.NumberFormat := DelphiDateFormatToExcelDateFormat(TDateField(Field).DisplayFormat);
                      end else begin
                         Cell.NumberFormat := DelphiDateFormatToExcelDateFormat({$IFDEF D2011}FormatSettings.{$ENDIF}ShortDateFormat); // 'dd.mm.yyyy';
                      end;

              ftTime: if TTimeField(Field).DisplayFormat <> '' then begin
                         Cell.NumberFormat := DelphiDateFormatToExcelDateFormat(TTimeField(Field).DisplayFormat);
                      end else begin
                         Cell.NumberFormat := DelphiDateFormatToExcelDateFormat({$IFDEF D2011}FormatSettings.{$ENDIF}ShortTimeFormat); // 'hh:mm:ss';
                      end;


              ftDateTime:
                      if TDateTimeField(Field).DisplayFormat <> '' then begin
                         Cell.NumberFormat := DelphiDateFormatToExcelDateFormat(TDateTimeField(Field).DisplayFormat);
                      end else begin
                         //bug modified by Michael Tien Jan 09, 2006
                         DValue := Field.asDateTime;
                         DecodeTime(DValue, h, m, s, ms);
                         if (h + m + s + ms) > 0 then
                            Cell.NumberFormat := DelphiDateFormatToExcelDateFormat({$IFDEF D2011}FormatSettings.{$ENDIF}ShortDateFormat + ' ' + {$IFDEF D2011}FormatSettings.{$ENDIF}ShortTimeFormat) // 'dd.mm.yyyy hh:mm:ss'
                         else
                            Cell.NumberFormat := DelphiDateFormatToExcelDateFormat({$IFDEF D2011}FormatSettings.{$ENDIF}ShortDateFormat); //'dd.mm.yyyy'
                      end;

              ftCurrency:
                      if TCurrencyField(Field).DisplayFormat <> '' then begin
                         Cell.NumberFormat := TCurrencyField(Field).DisplayFormat;
                      end else begin
                         Cell.NumberFormat := '#,##0.00';
                      end;

              ftInteger,
              ftSmallint,
              ftWord,
              ftFloat,
              ftBCD,
              {$IFNDEF D45}
              ftFMTBcd,
              {$ENDIF}
              ftLargeint:
                      if TNumericField(Field).DisplayFormat <> '' then begin
                         Cell.NumberFormat := DelphiNumericFormatToExcelNumericFormat(TNumericField(Field).DisplayFormat);
                      end;

              ftBoolean: {$ifdef D2009}
                         Cell.Value := Field.Text;
                         {$else}
                         Cell.Value := StringToWideString(Field.Text, DetailFont.Charset);
                         {$endif} 
           end;
       end;

       //alignment
       if not (foAlignment in DisableFormat) then begin
          case Field.Alignment of
             taCenter:       Cell.HorizontalAlignment := xlHAlignCenter;
             taLeftJustify:  Cell.HorizontalAlignment := xlHAlignLeft;
             taRightJustify: Cell.HorizontalAlignment := xlHAlignRight;
          end;
       end;

//       if not(foAlignment in DisableFormat) then begin
//           if FieldType in [ftDate, ftTime, ftDateTime] then
//                 Cell.HorizontalAlignment := xlHAlignLeft;
//       end;

       if Assigned(FAfterDetailCell) then FAfterDetailCell(Self, Cell, rowindex, i - 1, Field);
     end;

     if Assigned(FAfterDetailRow) and (FFieldsExported > 0) then
        FAfterDetailRow(Self, FWorksheet.RCRange[ row, FColOffset + 1,
                                                  row, FFieldsExported + FColOffset], rowindex);

     FDataset.Next;
     Inc(row);

     //pagebreak
     if (row > FRowsPerSheet) and not(FDataSet.Eof) then begin
        //FAfterDetail
       if Assigned(FAfterDetail) and 
          (FFieldsExported > 0)     and 
          ((row - 1) > (FRowsPerHeader + FRowOffset)) then
          FAfterDetail(Self, FWorksheet.RCRange[FRowsPerHeader + FRowOffset + 1,
                                                FColOffset + 1,
                                                row - 1, 
                                                FFieldsExported + FColOffset]);
       if Assigned(FAfterExport) and
          (FFieldsExported > 0)     and 
          ((row - 1 - FRowOffset) > 0) then
          FAfterExport(Self, FWorksheet.RCRange[ FRowOffset + 1,
                                                 FColOffset + 1,
                                                 row - 1, 
                                                 FFieldsExported + FColOffset]);


        CreateWorksheet;
        ExportHeaders;
        row := FRowsPerHeader + 1 + FRowOffset;
        lFirstRow := row;
        CloseGroups();
        //SheetRowIndex := 0;
     end;

   end;
//   FRowsCount := SheetRowIndex;
   FRowsCount := row - lFirstRow;

   if Assigned(FAfterDetail) and
      (FFieldsExported > 0)     and 
      ((row - 1) > (FRowsPerHeader + FRowOffset)) then
      FAfterDetail(Self, FWorksheet.RCRange[FRowsPerHeader + FRowOffset + 1,
                                            FColOffset + 1,
                                            row - 1, 
                                            FFieldsExported + FColOffset]);
finally                                         
   FDataset.GotoBookmark(CurPos);
   FDataset.EnableControls;
   FDataset.FreeBookmark(CurPos);
end;

end;



Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]