Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
Ольга   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.031 c
4-1081746607
Delphi5.01
2004-04-12 09:10
2004.05.30
Как используя только API функции можно включить WordWrap


3-1083492155
SH
2004-05-02 14:02
2004.05.30
Microsoft FoxPro 6-8 -> Delphi 7


1-1084948578
Bizons
2004-05-19 10:36
2004.05.30
Interface+TControl


3-1084362734
SergeyM
2004-05-12 15:52
2004.05.30
ADOConnection.


3-1084151171
Beglec
2004-05-10 05:06
2004.05.30
Поиск следующей записи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский