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

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

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

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

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

Пытаюсь завязаться на TExcelApplication и TExcelWorksheet, но пока не пойму как скопировать значения из ячейки неправильной кники(из PivotGrid которая) в новую созданную книгу с помощью этих компонент.
...
Рейтинг: 0 / 0
03.06.2011, 18:12
    #37294080
vitaly7711
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel из PivotGrid
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
07.06.2011, 11:54
    #37298371
leone-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel из PivotGrid
Спасибо за советы, все очень отзывчивы.

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

Код: 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
Период между сообщениями больше года.
02.09.2021, 20:45
    #40094931
гуманоид
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в Excel из PivotGrid
Прошу прощения, что в этой теме. Дабы не создавать лишнего.
Может подскажете.
Пытаюсь выгрузить в Экцель стандартной функцией PivotGrid - cxExportPivotGridToExcel.
Грузит где то 250 колонок и остальные обрезает. Молча, без сообщений.


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

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

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


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