Текущий архив: 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.48 MB
Время: 0.051 c