powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Экспорт в Excel из PivotGrid
11 сообщений из 11, страница 1 из 1
Экспорт в Excel из PivotGrid
    #37292978
leone-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая задачка: необходимо выгрузить данные из PivotGrid в Excel.
Есть стандартная функция, знаю, cxExportPivotGridToExcel. Но эта процедура выгружет данные так, что их потом не удобно обрабатывать - это и объединенные ячейки, и названия полей не ровно расположено, короче что в гриде, то и в кривом виде в Excel. Может кто знает, как можно в нормальном виде выгрузить данные?
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #37293040
Фотография Sergij Gromov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leone-,

в PivotGrid данные откуда поступают ? Наверно тот DataSet плоский, может его и выводить в Excel ?
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #37293317
leone-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergij Gromov,

Да, возможно выгружать из ДатаСет, но это будет очень долго, это надо проверить каждое поле, где оно находится в PivotGrid (Data, Row) и уже эти поля искать в ДатаСет и из них уже строить Excel :брррррр
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #37293610
leone-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо никто из PivotGrida в Excel не делал выгрузку.
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #37293738
Титов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leone-,

вы че ленитесь полазить по форуму!? компонентами пользуйтесь специальными и не заморачивайтесь

10729296
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #37294031
leone-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Титов,

Пытаюсь завязаться на TExcelApplication и TExcelWorksheet, но пока не пойму как скопировать значения из ячейки неправильной кники(из PivotGrid которая) в новую созданную книгу с помощью этих компонент.
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #37294080
vitaly7711
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leone-,

Вот процедура экспорта , выдрал из рабочего проекта
Код: plaintext
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.
 procedure  TOLAPMainForm.FastExportToExcel(RowTotals, ColumnTotals, ExtraView: boolean);

   function  NN2AA(NN: integer):  string ;
   begin 
     if  NN >  26   then 
      Result := Chr(Ord('A') -  1  + (NN  div   26 )) + Chr(Ord('A') -  1  + (NN  mod   26 ))
     else 
      NN2AA := Chr(Ord('A') -  1  + NN);
   end ;

 var 
  r, c: integer;
  RowCount, ColCount: integer;
  FixedRows, FixedCols: integer;
  TheArray: OLEVariant;
  MSExcel, WB, WS, Range: Variant;
  StopCalc: boolean;
  dt: TDateTime;
  s:  string ;
  w: double;
  Row, Col, Measure, View: integer;
  FormatSet: boolean;
  FormatString:  string ;
 begin 

  StopCalc := False;
  RowCount := PivotGrid1.RowCount;
  ColCount := PivotGrid1.ColCount;

   
   if  RowTotals  then 
     if  PivotGrid1.Settings.Specific.RowTotals = pvgtFixed  then 
      ColCount := ColCount + PivotGrid1.GetDimCellCount;
   if  ColumnTotals  then 
     if  PivotGrid1.Settings.Specific.ColumnTotals = pvgtFixed  then 
      RowCount := RowCount +  1 ;

  FixedRows := PivotGrid1.FixedRows;
  FixedCols := PivotGrid1.FixedCols;

  TheArray := VarArrayCreate([ 0 , RowCount,  0 , ColCount], varVariant);

  ShowWaitForm((RowCount * ColCount)  div   100 , True, _('Ýêñïîðò äàííûõ â Excel ...'));
  dt := Now;
   for  c :=  0   to  ColCount -  1   do 
   begin 
    FormatSet := False;
     for  r :=  0   to  RowCount -  1   do 
       if   not  StatWaitForm.StopCalc  then 
       begin 
         if  (r < FixedRows)  or  (c < FixedCols)  then 
         begin 
          TheArray[r, c] := PivotGrid1.Cells[c, r];

           if  (c < FixedCols)  and 
            (TheArray[r, c] = '')  and 
            (r >  0 )  and 
            ((c =  0 )  or  (TheArray[r, c -  1 ] = TheArray[r -  1 , c -  1 ]))  and 
            (r -  1  > FixedRows)
             then 
            TheArray[r, c] := TheArray[r -  1 , c];
         end 
         else 
         begin 
          PivotGrid1.GetCellInfo(C, R, Col, Row, Measure, View);
           if  GetCellValueVisibility(MainMap, Col, Row, Measure, View)  then 
           begin 
             if  View >=  256   then 
              TheArray[r, c] := _GetCellValue(MainMap, Col, Row, Measure, integer(MainMap.MeasureByIndex[Measure].ViewType[integer(View -  256 )]) +  256 )
             else 
              TheArray[r, c] := _GetCellValue(MainMap, Col, Row, Measure, integer(MainMap.MeasureByIndex[Measure].ViewType[integer(View)]));
           end 
           else 
            TheArray[r, c] := '';
         end ;
       end ;

     if  (r +  1  + (c * RowCount)  mod   100 ) =  0   then 
     begin 
      StatWaitForm.IncPropress( 1 );
      FlashWindow(StatWaitForm.Handle, False);
     end ;
   end ;

  StopCalc := StatWaitForm.StopCalc;

  HideWaitForm;

   if   not  StopCalc  then 
   try 
    MSExcel := CreateOleObject('Excel.Application');

    WB := MSExcel.Workbooks.Add;
    WS := WB.Worksheets[ 1 ];
    Range := WS.Range['A1:' + NN2AA(ColCount) + IntToStr(RowCount)];

    Range.Value := TheArray;

   finally 
    MSExcel.Visible := True;
    VarClear(Range);
    VarClear(WS);
    VarClear(WB);
    VarClear(MSExcel);
   end ;

 end ;


процедура написана не мной
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #37298371
leone-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы, все очень отзывчивы.

Вот написал процедуру, для себя на будущее и для поколения.

Код: plaintext
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.
 uses 
  ...cxExportPivotGridLink, ExcelXP;

 var 
    procedure  PreparePivotToPrint(sFileName: string ; pg:TcxDBPivotGrid);

 implementation 

 uses  ... ComObj;


 procedure  PreparePivotToPrint(sFileName: string ; pg:TcxDBPivotGrid);
 var 

  vExcel          :OleVariant;
  vCell1, vCell2  :variant;
  vCell1IN        :variant;
  vWorkBook       :Variant;
  vWorkSheet      :Variant;
  vWorkSheetNew   :Variant;
  vRange          :Variant;
  vRangeIN        :Variant;
  I,J,N           :Integer;
  RowFCount       :Integer;
  StrVal          : String ;



  oldColumnTotals               :Boolean;
  oldRowTotals                  :Boolean;
  oldColumnGrandTotals          :Boolean;
  oldRowGrandTotals             :Boolean;
  oldTotalsForSingleValues      :Boolean;
  oldGrandTotalsForSingleValues :Boolean;
  oldColumnFields               :Boolean;
  oldDataFields                 :Boolean;
  oldFilterFields               :Boolean;
  oldFilterSeparator            :Boolean;
  oldRowFields                  :Boolean;


   procedure  OnOff(bColumnTotals,bRowTotals,bColumnGrandTotals,bRowGrandTotals,
                 bTotalsForSingleValues,bGrandTotalsForSingleValues,bColumnFields,
                 bDataFields,bFilterFields,bFilterSeparator,bRowFields:Boolean);
   begin 
     with  pg.OptionsView  do 
     begin 
      ColumnTotals               :=  bColumnTotals;
      RowTotals                  :=  bRowTotals;
      ColumnGrandTotals          :=  bColumnGrandTotals;
      RowGrandTotals             :=  bRowGrandTotals;
      TotalsForSingleValues      :=  bTotalsForSingleValues;
      GrandTotalsForSingleValues :=  bGrandTotalsForSingleValues;
      ColumnFields               :=  bColumnFields;
      DataFields                 :=  bDataFields;
      FilterFields               :=  bFilterFields;
      FilterSeparator            :=  bFilterSeparator;
      RowFields                  :=  bRowFields;
     end ;
   end ;
 begin 
      //save settings before export 
      with  pg.OptionsView  do 
      begin 
       oldColumnTotals               :=ColumnTotals              ;  //1 
       oldRowTotals                  :=RowTotals                 ;  //2 
       oldColumnGrandTotals          :=ColumnGrandTotals         ;  //3 
       oldRowGrandTotals             :=RowGrandTotals            ;  //4 
       oldTotalsForSingleValues      :=TotalsForSingleValues     ;  //5 
       oldGrandTotalsForSingleValues :=GrandTotalsForSingleValues;  //6 
       oldColumnFields               :=ColumnFields              ;  //7 
       oldDataFields                 :=DataFields                ;  //8 
       oldFilterFields               :=FilterFields              ;  //9 
       oldFilterSeparator            :=FilterSeparator           ;  //10 
       oldRowFields                  :=RowFields                 ;  //11 
      end ;

      // Hide filter and columns 
      //OnOff(false,false,false,true,true,true,false,false,false,false,true); 
   OnOff(false,false,false,false,false,false,false,false,false,false,true);

    If   Not  DirectoryExists('c:\Temp')  Then 
          CreateDir('c:\Temp');           //создайм директорию c:/temp 
    try 
   cxExportPivotGridToExcel(sFileName, pg);   //выгружем в Excel во временный файл 
    try     //создаём то что выгружено с грида 
     vExcel := GetActiveOleObject('Excel.Application');
    except 
     vExcel := CreateOleObject('Excel.Application');
    end ;

   vExcel.Workbooks.Open(sFileName);
   vWorkBook := vExcel.ActiveWorkbook;
   vWorkSheet := vWorkbook.WorkSheets['...']; //Имя файла 
   vWorkSheet.Select;
   vWorkSheetNew := vWorkbook.WorkSheets.Add(EmptyParam);
   vWorkSheet.Select;

   RowFCount :=  0 ;

    for  I :=  0   to  pg.FieldCount -  1   do 
      if  pg.Fields.Area = faRow  then 
       RowFCount := RowFCount +  1 ;     [i]//Считам кол-во полей в зоне Row 

    if  pg.ViewData.ColumnCount =  1   then 
     vWorkSheet.Range['A1'].Insert( 3 );    //если кол-во полей в зоне Data =1, добавляем строку 

   vWorkSheet.Select;

   J :=  1 ;  //перебор по колонкам 
   N :=  1 ;  //колонки в новом листе 
    while  j<=RowFCount* 2   do 
    begin 
      for  i:= 5   to   4 +pg.ViewData.RowCount  do   //перебор по строчно 
      begin 
       if  vWorkSheet.Cells[i,j].MergeCells  then   //ищем объединенную ячейку 
       begin 
        vCell1 := vWorkSheet.Cells[i,j];
        vRange := vWorkSheet.Range[vCell1, vCell1];
         if  vRange.MergeArea.Rows.Count <>  1   then   //если объединённых строк больше 1 
         begin 
           if  vWorkSheet.Cells[i,j].Value <> ''  then 
            StrVal := vWorkSheet.Cells[i,j].Value;
          vWorkSheetNew.Cells[i,n].Value := StrVal;
         end 
         else 
          vWorkSheetNew.Cells[i,n].Value := vWorkSheet.Cells[i,j].Value;
       end ;
      end ; //for 
      if  j= 1   then  j:=j+ 3 
       else  J:=J+ 2 ;
     StrVal := '';
     Inc(n);  //увеличиваем колонки для нового листа 
    end ; //while 

   vWorkSheet.Select;

   vCell1 := vWorkSheet.Cells.Item[ 2 , 1 ];      //выбираем диапазон значений из зоны Row 
   vCell2 := vWorkSheet.Cells.Item[ 3 ,RowFCount* 2 + 1 ];

   vRange := vWorkSheet.Range[vCell1, vCell2];
   vRange.Select;
   vRange.Copy;
   vWorkSheetNew.Select;
   vCell1IN := vWorkSheetNew.Cells.Item[ 3 , 1 ];
   vRangeIN := vWorkSheetNew.Range[vCell1IN,vCell1IN];
   vRangeIN.Select;
   vRangeIN.PasteSpecial(Paste:=xlPasteFormulas, Operation:=xlNone,
        SkipBlanks:=False, Transpose:=False);   //вставляем в новый лист 

   I :=  2 ;
    while  I <= RowFCount* 2   do 
    begin 
     vCell1 := vWorkSheetNew.Cells.Item[ 3 ,i];
     vRange := vWorkSheetNew.Range[vCell1,vCell1];     //переносим из В в А 
     vRange.Select;
     vRange.Copy;
     vCell1IN := vWorkSheetNew.Cells.Item[ 3 ,i/ 2 ];
     vRangeIn := vWorkSheetNew.Range[vCell1IN,vCell1IN];
     vRange.Copy(vRangeIn);
     vRange.Clear;
     I := I +  2 ;
    end ;

   vWorkSheet.Select;

   vCell1 := vWorkSheet.Cells.Item[ 3 ,RowFCount* 2 + 2 ];     //выбираем диапазон с данными 
   vCell2 := vWorkSheet.Cells.Item[ 4 +pg.ViewData.RowCount,RowFCount* 2 + 1 +pg.ViewData.ColumnCount];
   vRange := vWorkSheet.Range[vCell1, vCell2];
   vRange.Select;
   vRange.Copy;
   vWorkSheetNew.Select;
   vCell1IN := vWorkSheetNew.Cells.Item[ 3 ,RowFCount+ 1 ];
   vRangeIN := vWorkSheetNew.Range[vCell1IN,vCell1IN];
   vRangeIN.Select;
   vRangeIN.PasteSpecial(Paste:=xlPasteFormulas, Operation:=xlNone,
        SkipBlanks:=False, Transpose:=False);      //переносим его в новый лист 

   vWorkSheetNew.Rows[ 2 ].Delete;
   vRange := vWorkSheetNew.UsedRange;  //заполненные ячейки 
   vRange.Select;  //выделяем заполненные ячейки 
   vRange.Borders.LineStyle := $ 00000001 ;  // Обрамление ячеек 
   vRange.Borders.ColorIndex :=  1 ;   // Обрамление четным цветом 
   vRange.EntireRow.AutoFit; // Ровняем высоту колонок 
   vRange.EntireColumn.AutoFit; //Ровняем ширину колонок 

   vExcel.DisplayAlerts := False;  // отключаем предупреждения 
   vExcel.ActiveWorkBook.SaveAs(sFileName);
   vExcel.DisplayAlerts := True;  // включаем предупреждения 
   vExcel.Visible := True;
   vExcel := Unassigned;

     // Show filter and columns 
   OnOff(oldColumnTotals,oldRowTotals,oldColumnGrandTotals,oldRowGrandTotals,
                 oldTotalsForSingleValues,oldGrandTotalsForSingleValues,oldColumnFields,
                 oldDataFields,oldFilterFields,oldFilterSeparator,oldRowFields);
    except 
   vExcel := Unassigned;

     // Show filter and columns 
    OnOff(oldColumnTotals,oldRowTotals,oldColumnGrandTotals,oldRowGrandTotals,
                 oldTotalsForSingleValues,oldGrandTotalsForSingleValues,oldColumnFields,
                 oldDataFields,oldFilterFields,oldFilterSeparator,oldRowFields);
    end ;
 end ;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Экспорт в Excel из PivotGrid
    #40094931
гуманоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, что в этой теме. Дабы не создавать лишнего.
Может подскажете.
Пытаюсь выгрузить в Экцель стандартной функцией PivotGrid - cxExportPivotGridToExcel.
Грузит где то 250 колонок и остальные обрезает. Молча, без сообщений.


Попробовал через предложенную тут процедуру.
Вот в этом месте
WorkSheet := vWorkbook.WorkSheets['111'];//Имя файла
загружает то же количество колонок и
выдает сообщение, что неверный индекс

Чье это ограничение?
Д7, Девки версия 2007 года.
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #40094948
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гуманоид,

Набор данных - в HTML. Эксель нормально открывает HTML документы.
...
Рейтинг: 0 / 0
Экспорт в Excel из PivotGrid
    #40094974
гуманоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,
Премного благодарен.)))
Однако, интересно кто ограничивает...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Экспорт в Excel из PivotGrid
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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