powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Из cxGrid в Excel, писать ряд за рядом
4 сообщений из 4, страница 1 из 1
Из cxGrid в Excel, писать ряд за рядом
    #40099695
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу записать из нескольких cxGrid'ов в один файл *.xlsx
для ускорения решил формировать ряд и записывать в эксель сразу ряд, в качестве разделителя колонок использовать символ табуляции.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm1.Button15Click(Sender: TObject);
var i, j: integer;
bufStr:string;
begin
  KnigaXls:=CreateOleObject('Excel.Application');
  KnigaXls.Visible:=true;
  KnigaXls.WorkBooks.Add;
  for i:=0 to cxGridTV.ColumnCount-1 do // пишем названия колонок
  KnigaXls.Cells[1,i+1]:=cxGridTV.Columns[i].Caption;


  for j:=0 to cxGridTV.DataController.RecordCount-1 do
  begin
    bufStr:=cxGridTV.DataController.Values[j,0]+Chr(9);
    for i:=1 to cxGridTV.ColumnCount-1 do
    bufStr:=bufStr+cxGridTV_F.DataController.Values[j,i]+Chr(9);// формируем строку
    KnigaXls.Cells[j+1,1].Value:=bufStr;// по идее должно записаться в несколько колонок
                                              // а пишется в одну ячейку слитно
  end;
end;



Почему-то на символ табуляции никакой реакции нет, пишется в одну ячейку слитно. Если же я в блокноте набираю строку, в которой табуляцию использую для разделения, то все нормально, при копировании строки и вставке ее в ячейку эксель строка делится по разным колонкам.

может есть еще какой-то способ брать из cxGrid'а ряд и писать его в эксель? в определенное место надо писать, начиная с какой-то колонки
...
Рейтинг: 0 / 0
Из cxGrid в Excel, писать ряд за рядом
    #40099696
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не удивительно. Процесс вставки из буфера должным образом обрабатывается, прежде чем попасть на лист.
Поэтому нужно просто каждое поле писать в свою ячейку.

Правда есть способ писать поля в вариант-массив и вставлять в эксель одной командой. Это значительно быстрее.
...
Рейтинг: 0 / 0
Из cxGrid в Excel, писать ряд за рядом
    #40099697
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
L_argo,
одномерный массив... что-то я подумал и отбросил эту мысль, заклинило что-то в голове
а ведь должно получиться

Спасибо!
...
Рейтинг: 0 / 0
Из cxGrid в Excel, писать ряд за рядом
    #40099736
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плюс не надо писать в каждую ячейку экселя отдельно, пиши рейнджем, будет в разы быстрее, вот как пример


Код: 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.
unit xxx;

interface

uses DB;

function  Ad_DataSetToExcel(DataSet: TDataSet; var Excel: Variant; var Sh: Variant;
    R1: Integer = 1; C1: Integer = 1; DestroyExcel: Boolean = True; AutoFit: Boolean = True; Title: Boolean = True): Integer;

implementation

uses Variants, SysUtils, ComObj, ComCtrls, Dialogs, Classes;

function  GetXLSObject(var W: Variant; SheetsN: Integer; Shablon: String; New_: Boolean = False): Boolean;
var S: String;
begin
 try
   if (ExtractFilePath(Shablon) = '') and (Shablon <> '') then
      S:=ExtractFilePath(ParamStr(0))+Shablon else S:=Shablon;
   if (S <> '') and not FileExists(S) then begin
      ShowMessage(' Файл "'+S+'" не найден.');
      Result := False;
      exit;
   end;
   if New_ then W := CreateOleObject('Excel.Application')
   else try W := GetActiveOleObject('Excel.Application'); except W := CreateOleObject('Excel.Application'); end;
   W.SheetsInNewWorkbook := 1;
   if Shablon = '' then W.Workbooks.Add
   //else W.Workbooks.Open(S, 0, True);
   else W.Workbooks.Open(S);
   W.Application.EnableEvents := false; // Отключаем реакцию Excel на события, чтобы ускорить вывод информации
   W.Sheets[SheetsN].Activate;
   Result:=True;
 except
   if W <> null then W:=UnAssigned; raise;
 end;
end;

function  ExclRange(Sheet: Variant; R1, C1, RN, CN: Integer): Variant;
var Cell1, Cell2: Variant;
begin
  Cell1 := Sheet.Cells[R1, C1]; Cell2 := Sheet.Cells[RN, CN];
  Result:= Sheet.Range[Cell1, Cell2];
end;

procedure DestroyXLSObject(var W: Variant; ViewXLS: Boolean = False);
begin
  if ViewXLS then W.Visible:=True
  else begin W.DisplayAlerts:=0; W.Workbooks.Close; end;
  W:=UnAssigned;
end;

function  Ad_DataSetToExcel(DataSet: TDataSet; var Excel: Variant; var Sh: Variant;
    R1: Integer = 1; C1: Integer = 1; DestroyExcel: Boolean = True; AutoFit: Boolean = True; Title: Boolean = True): Integer;
//----------------------------------------------------------
var
  Mas, MasF, Range: Variant;
  RecN, Cols, I, J: Integer;
begin
  Result:=0;
  try Excel.SheetsInNewWorkbook := 1;
  except
    if not GetXLSObject(Excel, 1, '') then exit;
    Sh:=Excel.Sheets[1];
  end;
  with DataSet do
   try
     DisableControls; First; RecN:=0; J:=1; Cols:=0;
     while not Eof do begin Inc(RecN); Next; end; First;
     for i := 0 to FieldCount-1 do if Fields[i].Visible then Inc(Cols);
     MasF:= VarArrayCreate([0, Cols-1], varVariant);
     Mas := VarArrayCreate([0, RecN+1, 0, Cols-1], varVariant);
     for i := 0 to FieldCount-1 do if Fields[i].Visible then MasF[i]:=Fields[i].FieldName;
     if Title then for i:=0 to Cols-1 do Mas[0,i]:=FieldByName(MasF[i]).DisplayName
     else j:=0;
     while not Eof do begin
       for i:=0 to Cols-1 do
           if Fields[i].Visible then Mas[j,i]:=FieldByName(MasF[i]).Value;
       Next; if not Eof then Inc(J);
     end;
     Range:=ExclRange(Sh, R1, C1, R1+RecN, Cols); Result:=RecN;
     //Range.WrapText:=true;    //перенос по словам
     for i:=0 to Cols-1 do
         if FieldByName(MasF[i]).DataType = ftString then
            ExclRange(Sh, R1, i+1, R1+RecN, i+1).NumberFormat:='@';

     Range.Value:=Mas;        //передача вариантного массива в Excel
     Range.Borders.Weight:=2; //сетка в Excel
     if Title then begin
        Range:=ExclRange(Sh, R1, C1, R1, Cols);
        Range.Font.Bold := True;
     end;
   finally
     MasF:=unassigned;
     Mas:=unassigned;
     if AutoFit then Sh.Cells.Columns.AutoFit;
     if DestroyExcel then DestroyXLSObject(Excel, True);
     First; EnableControls;
   end;
end;


end.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Из cxGrid в Excel, писать ряд за рядом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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