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

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

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

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

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

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

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

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

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

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

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

abcdcolorlstartlend120E7-6trueaacceec12a187220.1210falsebbddffc187a12

Где тут "многолистовой документ и отдельный отчет на каждом листе"?
...
Рейтинг: 0 / 0
12.09.2019, 10:35
    #39860752
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
Если есть исходники, можно попробовать исправить.
Кстати, NativeExcel тоже платный...
...
Рейтинг: 0 / 0
12.09.2019, 12:46
    #39860848
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
ёёёёё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
12.09.2019, 12:49
    #39860852
vector0001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
Василий 2,

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

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

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

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

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

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

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

Да. Пока на него летят чайники, ничего хорошего ждать не приходится. Выкинь из этой схемы
Дельфи, делай выгрузку непосредственно из экселя, через MS Query.
+Много
Нахрен дельфи с квери и екселями? Пусть идёт ящики сколачивать для картотек позапрошлого века!
...
Рейтинг: 0 / 0
12.09.2019, 13:34
    #39860907
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
Чем доступ через ODBC не подходит?
Если просто выгрузить данные без разукрашивания ячеек? К тому же и сам Excel не нужен...
...
Рейтинг: 0 / 0
12.09.2019, 13:45
    #39860918
vector0001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
Полез к компонент NativeExcel нашел процедуру отвечающую за выгрузку. На скине видно как он видит текст
могу выслать всю процедуру если это поможет делу. Я так понимаю необходимо исправить момент выгрузки преобразования и перекомпилировать данный компонент.
...
Рейтинг: 0 / 0
12.09.2019, 13:47
    #39860921
vector0001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выгрузка SQL запроса в xlsx без использования OLE на Delphi XE8 / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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