Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Экспорт из TBDGridEh в Excel   Найти похожие ветки 

 
Kostafey ©   (2006-11-23 22:39) [0]

Уважаемые мастера ! Прошу помощи в следующем вопросе. Я экспортировал данные из TDBGridHe  в Excel. В сетке были в том числе столбцы с цифрами, содержащими 2 знака после запятой. После экспорта они преобразовались в денежный формат. Т.е. после каждого значения появились символы "р."
А смысл этих цифр - проценты !

Что до самой процедуры экспорта, то сложно описать ее происхожление, словом Internet.

Ее текст:

unit Unit_DBGridToExcelApp;

interface

uses DBGridEh, Classes, DB, SysUtils, Variants, ComObj;

procedure ExportToExcel_App(DBGrid:TDBGridEh;Header:String="";footer:String="");

implementation

procedure ExportToExcel_App(DBGrid:TDBGridEh;Header:String="";footer:String="");
var
XL, XArr,Xformat: Variant;
i : Integer;
j,l,rk : Integer;
Query:TDataSet;
FieldCount:integer;

Function GetExelColumn(indX,indY:integer):String;
Begin
    if indX>25 then
    Result:=CHR(65+(indX DIV 26)-1)+CHR(65+indX MOD 26)+inttostr(indY+1)
    Else Result:=CHR(65+indX)+inttostr(indY+1);
End;

begin
    FieldCount:=0;
    Query:=TDataSet(DBGrid.DataSource.DataSet);
    for i:=0 to Query.FieldCount-1 do if Query.Fields[i].Visible then inc(FieldCount);
    Begin
         XArr:=VarArrayCreate([1,FieldCount],varVariant);
         Xformat:=VarArrayCreate([1,FieldCount],varVariant);
         try
           XL:=CreateOLEObject("Excel.Application");
         except
              raise exception.Create("I?iecioea ioeaea i?e auciaa i?ia?aiiu EXCEL!");
         End;
         XL.WorkBooks.add;
         XL.Range[GetExelColumn(0,0),GetExelColumn(0,0)].Value :=Header;
         j:=0;
         For i:=0 to Query.FieldCount-1 do
          if Query.Fields[i].Visible then
          Begin
               inc(j);
              XArr[j] := Query.Fields[i].DisplayName;
          End;
         XL.Range[GetExelColumn(0,1),GetExelColumn(FieldCount-1,1)].Value := XArr;
         rk:=Query.RecordCount;
         l:=0;
         For i:=0 to Query.FieldCount-1 do
         Begin
         if Query.Fields[i].Visible then
          Begin
             Case Query.Fields[i].DataType of
                  ftString:XL.Range[GetExelColumn(l,2),GetExelColumn(l,rk+1)].NumberFormat:="@";
                  ftDateTime:XL.Range[GetExelColumn(l,2),GetExelColumn(l,rk+1)].NumberFormat:="@";
             End;
             inc(l);
          End;
         End;
         Query.First;
         j := 2;
         while not Query.Eof do
         begin
              i:=0;
              l:=0;
              while i<Query.FieldCount do
              begin
                  if Query.Fields[i].Visible then
                  Begin
                      inc(l);
                      if (Query.Fields[i].DataType=ftDateTime)
                      or (Query.Fields[i].DataType=ftString) then
                        XArr[l] := Query.Fields[i].asString
                      Else XArr[l] := Query.Fields[i].Value;
                  end;
                  inc(i);
              end;
              XL.Range[GetExelColumn(0,j),GetExelColumn(FieldCount-1,j)].Value := XArr;
              Query.Next;
              inc(j);
         end;
         XL.Range[GetExelColumn(0,j),GetExelColumn(0,j)].Value :=Footer;
         XL.Range[GetExelColumn(0,1),GetExelColumn(FieldCount-1,rk+1)].Borders.LineStyle := 1;
         XL.ActiveSheet.Range[GetExelColumn(0,1),GetExelColumn(FieldCount-1,rk+1)].Select;
         XL.Selection.Columns.AutoFit;
         XL.visible:=true;
   End;
end;

end.



 
Kostafey ©   (2006-11-24 17:51) [1]

Возвращаю вопрос к обсуждению.
Совершенно не могу в этом разобраться.
Может быть как-то возможно жестко задать типы полей ?


 
zdm ©   (2006-11-24 17:54) [2]

по моему, DBGridEh (да не важно) на прямую привязана к DataSorce (попробую в Query добавить все поля и нужному задать тип поля Currency=true)


 
Kostafey ©   (2006-11-24 17:58) [3]

> [2] zdm ©   (24.11.06 17:54)


Добавить все поля - проблеммно, т.к. Query (вернее DataSet) будут приниать разные запросы. Кроме того, мне наоборот нужно, чтобы значения были не денежными, а числовыми с 2 знаками после запятой (смысл этих цифр - проценты).
Говоря о жесткой привязке типов я иел в виду привязку в самой процедуре указанной выше.


 
umbra ©   (2006-11-24 18:22) [4]

XL.Range[GetExelColumn(0,j),GetExelColumn(0,j)].NumberFormatLocal := "0,00";


 
Kostafey ©   (2006-11-24 20:19) [5]

>
>
> [4] umbra ©   (24.11.06 18:22)


Не помогло. Формат по прежнему женежный


 
Kostafey ©   (2006-11-24 21:53) [6]

Вообще непонятно. Изменяю округление (до 0, 1, 3 знаков после запятой) - не помогает.


 
EvS ©   (2006-11-24 23:14) [7]

Формат вроде бы нужно устанавливать до того как вводишь данные.


 
Kostafey ©   (2006-11-24 23:27) [8]

> Формат вроде бы нужно устанавливать до того как вводишь
> данные.

Наверное да. Просто я сам ничего в этой процедуре не понимаю (взял с инета).
Что б вней такое исправить ? Пока я пойму как она работает пройдет целая вечность.



Страницы: 1 вся ветка

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
9-1139484128
pavel_guzhanov
2006-02-09 14:22
2006.12.10
3Dmax и Delphi


15-1164028744
Prohodil Mimo
2006-11-20 16:19
2006.12.10
как настроить доступ к каталогам в MS Server 2003 ?


2-1163774326
312kbps
2006-11-17 17:38
2006.12.10
Опрос конкретного порта во всей локальной сети !


2-1164178769
alucard
2006-11-22 09:59
2006.12.10
Подскажите нормальное описание всех компонентов Delphi7


15-1164298836
Mr. D
2006-11-23 19:20
2006.12.10
Посоветуйте простенький DHCP-сервер