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

Вниз

Работа с Екселем   Найти похожие ветки 

 
Ольга   (2004-05-19 14:06) [0]

Я переношу данные из DBGrid"a в Excel и русский текст в нём не распознаётся... Подскажите, как это исправить. Спасибо


 
MU ©   (2004-05-19 14:10) [1]

Как переносите? Какие данные? Из какой таблицы ДОС или WIN кодировка


 
Ольга   (2004-05-19 14:34) [2]

Вот код программы... брала из примера:

procedure Tform1.ExportDBGrid(toExcel: Boolean);
var
 bm: TBookmark;
 col, row: Integer;
 sline: String;
 mem: TMemo;
 ExcelApp: Variant;
begin
 Screen.Cursor := crHourglass;
 DBGrid1.DataSource.DataSet.DisableControls;
 bm := DBGrid1.DataSource.DataSet.GetBookmark;
 DBGrid1.DataSource.DataSet.First;

   if toExcel then
 begin
   ExcelApp := CreateOleObject("Excel.Application");
   ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
   ExcelApp.WorkBooks[1].WorkSheets[1].Name := "Grid Data";
 end;

   mem := TMemo.Create(Self);
 mem.Visible := false;
 mem.Parent := Form1;
 mem.Clear;
 sline := "";

   for col := 0 to DBGrid1.FieldCount-1 do
   sline := sline + DBGrid1.Fields[col].DisplayLabel + #9;
 mem.Lines.Add(sline);

  for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do
 begin
   sline := "";
   for col := 0 to DBGrid1.FieldCount-1 do
     sline := sline + DBGrid1.Fields[col].AsString + #9;
   mem.Lines.Add(sline);
   DBGrid1.DataSource.DataSet.Next;
 end;

  mem.SelectAll;
 mem.CopyToClipboard;

   if toExcel then
 begin
   ExcelApp.Workbooks[1].WorkSheets["Grid Data"].Paste;
   ExcelApp.Visible := true;
 end;
// FreeAndNil(ExcelApp);
 DBGrid1.DataSource.DataSet.GotoBookmark(bm);
 DBGrid1.DataSource.DataSet.FreeBookmark(bm);
 DBGrid1.DataSource.DataSet.EnableControls;  
 Screen.Cursor := crDefault;  
end;


 
Ozone ©   (2004-05-19 14:38) [3]

А где Вы такой пример взяли? (извините конечно, но идиотизм полный).

Какая БД?


 
YurikGl ©   (2004-05-19 14:40) [4]

Я, обычно, беру данные не из TDBGrid, а из соответствующего ему DataSet"а.
И тебе, Ольга, советую.


 
Ольга   (2004-05-19 14:45) [5]


> А где Вы такой пример взяли? (извините конечно, но идиотизм
> полный).
>
> Какая БД?

БД Парадокс
а пример взяла delphist`s FAQ 2.0  а там ссылаются на
" Взято с Исходников.ru http://www.sources.ru "
Вот. :)


 
Ольга   (2004-05-19 14:48) [6]


> Я, обычно, беру данные не из TDBGrid, а из соответствующего
> ему DataSet"а.
> И тебе, Ольга, советую.


Я в этом деле новичок... нашла пример к своему заданию и вот... теперь спрашиваю :)


 
MU ©   (2004-05-19 14:49) [7]

Добавьте ф-цию

function OEMToChr(const S : String) : String;
begin
 SetLength(Result, Length(S));
 if Length(Result) > 0 then
  OemToCharBuff(PChar(S), PChar(Result), Length(Result));
end;

и исправьте
...
 for col := 0 to DBGrid1.FieldCount-1 do
    sline := sline + OEMToChr(DBGrid1.Fields[col].AsString) + #9;


 
Ozone ©   (2004-05-19 14:51) [8]

Ольга   (19.05.04 14:45) [5]

Вам правильно YurikGl посоветовал - "бегите" по DataSet"у и добавляйте нужные данные (можно сразу в Range, а лучше сначала в Variant"ный массив, а уже потом в Range)


 
YurikGl ©   (2004-05-19 14:52) [9]

Grid отображает какие-то данные, он их берет из DataSource, который обычно ссылается на DataSet.
Читать даные лучше из dataset.fields[номер поля].value или dataset.fieldbyname[имя поля].value

P.S. Этот вопрос для другой конференции


 
YurikGl ©   (2004-05-19 14:55) [10]

Кусок рабочего кода:

   E1.Connect;
   E1.Visible[0]:=true;
   E1.Workbooks.Add(Null,1);

     ADODataSetVPERI.First;
     if ADODataSetVPERI.RecordCount>0 then begin
     Repeat
       if ADODataSetVPERI.Fields[6].value=sb then begin

       if ADODataSetVPERI.Fields[3].value<>null then
            E1.Range["A"+IntToStr(l),"A"+IntToStr(l)].formula:=ADODataSetVPERI.Fields[3].value;
       if ADODataSetVPERI.Fields[2].value<>null then
            E1.Range["B"+IntToStr(l),"B"+IntToStr(l)].formula:=ADODataSetVPERI.Fields[2].value;
       if ADODataSetVPERI.Fields[4].value<>null then
            E1.Range["C"+IntToStr(l),"C"+IntToStr(l)].formula:=ADODataSetVPERI.Fields[4].value;
       if ADODataSetVPERI.Fields[1].value<>null then
            E1.Range["D"+IntToStr(l),"D"+IntToStr(l)].formula:=ADODataSetVPERI.Fields[1].value;
       if ADODataSetVPERI.Fields[5].value<>null then
            E1.Range["E"+IntToStr(l),"E"+IntToStr(l)].formula:=ADODataSetVPERI.Fields[5].value;
       inc(l)

                                              end;
       ADODataSetVPERI.Next;
     until ADODataSetVPERI.Eof;
                               end;

   E1.Disconnect;


 
YurikGl ©   (2004-05-19 14:56) [11]

ADODataSetVPERI.First;
i:=1
    if ADODataSetVPERI.RecordCount>0 then begin
...


 
MU ©   (2004-05-19 14:59) [12]

>> YurikGl
 Что вы дурите человеку мозги!? Почитайте вопрос. :)


 
Ozone ©   (2004-05-19 15:05) [13]

TO MU ©[12]

Дык ведь научиться человер "коряво" делать, а потом еще и других учить начнет. Нехорошо.


 
Pul   (2004-05-19 17:02) [14]

Между прочим, очень удобно выводить в Excel то, что видишь в таблице, а не все поля из DataSet.
А вот пример, который наверное имел в виду
Ozone ©   (19.05.04 14:51) [8]

function DBGridToExcel(AGrid: TDBGrid; ATemplateFileName: String): Variant;
var
 WorkBk: Variant;
 WorkSheet: Variant;
 I,J,R,C: Integer;
 TabGrid: Variant;
 DS: TDataSet;
 XL: Variant;
begin
 DS := AGrid.DataSource.DataSet;
 R := 0;
 DS.First;
 while not DS.Eof do
 begin
   Inc(R);
   DS.Next;
   Application.ProcessMessages;
 end;
 C := AGrid.Columns.Count;
 TabGrid := VarArrayCreate([0, R, 0, (C - 1)], VarOleStr);
 I:=1;
 DS.First;
 for J:=0 to AGrid.Columns.Count - 1 do
   TabGrid[0,J] := AGrid.Columns[J].Title.Caption;
 while not DS.Eof do
 begin
   for J:=0 to AGrid.Columns.Count - 1 do
     if not VarIsNull(AGrid.Columns[J].Field.Value) then
       TabGrid[I,J] := AGrid.Columns[J].Field.Text;
   Inc(I);
   DS.Next;
   Application.ProcessMessages;
 end;
 try
   XL := GetActiveOleObject("Excel.Application");
 except
   XL := CreateOleObject("Excel.Application");
 end;
 XL.Visible := True;
 if FileExists(ATemplateFileName) then
   XL.WorkBooks.Add(ATemplateFileName)
 else
   XL.WorkBooks.Add(EmptyParam);
 WorkBk := XL.WorkBooks.Item[1];
 WorkSheet := WorkBk.WorkSheets[1];

 Worksheet.Range["A1",Worksheet.Cells.Item[R+1,C]].Value2 := TabGrid;
 Worksheet.Range["A1",Worksheet.Cells.Item[R+1,C]].Borders.ColorIndex := 1;
 Worksheet.Range["A1",Worksheet.Cells.Item[R+1,C]].Columns.AutoFit;
 TabGrid := Unassigned;
 Result := XL;
end;



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

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

Наверх




Память: 0.5 MB
Время: 0.035 c
4-1081970521
AndersoNRules
2004-04-14 23:22
2004.05.30
TerminateProcess(hProcess:Cardianl,uExitCode:Cardinal) ...


11-1073827158
Юрий Ж.
2004-01-11 16:19
2004.05.30
Глючек вот обнаружил...


3-1084247839
Litr
2004-05-11 07:57
2004.05.30
Время выполнения запроса


6-1081438765
-=Demon=-
2004-04-08 19:39
2004.05.30
Структура IP,TCP и ICMP


3-1084048202
Я Ламер
2004-05-09 00:30
2004.05.30
Компоненты прямого доступа к MSSQL