全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2085
推到 Plurk!
推到 Facebook!

dbgrid转excel时,如何让dbgrid中隐藏的栏位不导出?

尚未結案
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-09-15 20:03:59 IP:219.82.xxx.xxx 訂閱
各位大大好,下面是我把dbgrid转成excel的code,但它有一个问题,就是dbgrid中隐藏的栏位也会被导出,我希望在导出时,隐藏的栏位不要导出,请问该怎样修改?不胜感激!

procedure DBGrid2Excel(DBGrid:TDBGrid;ExcelFileName:string);
var
MyExcel: Variant;
x,y:integer; //x横向,y纵向
begin

MyExcel := CreateOleOBject('Excel.Application'); //启动excel
MyExcel.WorkBooks.Add; //建一个新工作簿
MyExcel.Visible :=false;
Myexcel.displayalerts:=false;
dbgrid.DataSource.DataSet.First;
y:=1;

for x:=1 to dbgrid.Columns.Count do
begin

MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Columns[x-1].Title.caption;
// 选择相应的单元格
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x].Select;
// 将标题栏位变粗体字
MyExcel.Selection.Font.Bold := true;
// 根据dbgrid宽度设定列宽
MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := dbgrid.Fields[x-1].DisplayWidth;
end;
inc(y);
while not dbgrid.DataSource.DataSet.eof do //如果还没到最后一条记录
begin
for x:=1 to dbgrid.FieldCount do
begin
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Fields[x-1].AsString;

end;
inc(y);
dbgrid.DataSource.DataSet.next;
end;
MyExcel.WorkBooks[1].Saveas(ExcelFileName);
MyExcel.WorkBooks.Close;
MyExcel.Quit;
dbgrid.DataSource.DataSet.First;
Application.Messagebox('Excel表格导出完成!','信息',mb_Ok mb_Iconinformation);
end;
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-09-16 08:38:36 IP:59.120.xxx.xxx 未訂閱
請在for x:=1 to dbgrid.FieldCount do迴圈中
判斷是否為要轉出的欄位(或不轉的欄位)
假如是的話
才做轉換的動作


===================引 用 luowy651 文 章===================
各位大大好,下面是我把dbgrid转成excel的code,但它有一个问题,就是dbgrid中隐藏的栏位也会被导出,我希望在导出时,隐藏的栏位不要导出,请问该怎样修改?不胜感激!

procedure DBGrid2Excel(DBGrid:TDBGrid;ExcelFileName:string);
var
MyExcel: Variant;
x,y:integer; //x横向,y纵向
begin

MyExcel := CreateOleOBject('Excel.Application'); //启动excel
MyExcel.WorkBooks.Add; //建一个新工作簿
MyExcel.Visible :=false;
Myexcel.displayalerts:=false;
dbgrid.DataSource.DataSet.First;
y:=1;

for x:=1 to dbgrid.Columns.Count do
begin

MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Columns[x-1].Title.caption;
// 选择相应的单元格
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x].Select;
// 将标题栏位变粗体字
MyExcel.Selection.Font.Bold := true;
// 根据dbgrid宽度设定列宽
MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := dbgrid.Fields[x-1].DisplayWidth;
end;
inc(y);
while not dbgrid.DataSource.DataSet.eof do //如果还没到最后一条记录
begin
for x:=1 to dbgrid.FieldCount do
begin
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Fields[x-1].AsString;

end;
inc(y);
dbgrid.DataSource.DataSet.next;
end;
MyExcel.WorkBooks[1].Saveas(ExcelFileName);
MyExcel.WorkBooks.Close;
MyExcel.Quit;
dbgrid.DataSource.DataSet.First;
Application.Messagebox('Excel表格导出完成!','信息',mb_Ok mb_Iconinformation);
end;
編輯記錄
老大仔 重新編輯於 2010-09-16 08:39:39, 註解 無‧
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-09-16 09:02:56 IP:60.186.xxx.xxx 訂閱
谢谢老大仔大大的关注,但小弟初学,试了几次,试不出来
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-09-16 09:06:51 IP:59.120.xxx.xxx 未訂閱
請問該段程式您是怎麼寫的??
貼上來給大家看看問題在哪裡

===================引 用 luowy651 文 章===================
谢谢老大仔大大的关注,但小弟初学,试了几次,试不出来
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-09-16 09:30:36 IP:125.119.xxx.xxx 訂閱
procedure DBGrid2Excel(DBGrid:TDBGrid;ExcelFileName:string);
var
MyExcel: Variant;
col,x,y:integer; //x横向,y纵向
begin

MyExcel := CreateOleOBject('Excel.Application'); //启动excel
MyExcel.WorkBooks.Add; //建一个新工作簿
MyExcel.Visible :=false;
Myexcel.displayalerts:=false;
dbgrid.DataSource.DataSet.First;
col:=0;
y:=1;
for x:=1 to dbgrid.Columns.Count do
begin
if dbgrid.Columns[x-1].Visible=true then
begin
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x-col] := dbgrid.Columns[x-1].Title.caption;
// 选择相应的单元格
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x-col].Select;
// 将标题栏位变粗体字
MyExcel.Selection.Font.Bold := true;
// 根据dbgrid宽度设定列宽
MyExcel.WorkBooks[1].WorkSheets[1].Columns[x-col].ColumnWidth := dbgrid.Fields[x-1].DisplayWidth;
// MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := dbgrid.columns[x-1].Width/7;
end
else begin
col:=col 1;
end;
end;
inc(y);
while not dbgrid.DataSource.DataSet.eof do
begin
for x:=1 to dbgrid.Columns.Count do
begin
if dbgrid.Columns[x-1].Visible=true then
begin
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Columns[x-1].Field.asstring;
end;
end;
inc(y);
dbgrid.DataSource.DataSet.next;
end;
MyExcel.WorkBooks[1].Saveas(ExcelFileName);
MyExcel.WorkBooks.Close;
MyExcel.Quit;
dbgrid.DataSource.DataSet.First;
Application.Messagebox('Excel表格导出完成!','信息',mb_Ok mb_Iconinformation);
end;




===================引 用 老大仔 文 章===================
請問該段程式您是怎麼寫的??
貼上來給大家看看問題在哪裡

===================引 用 luowy651 文 章===================
谢谢老大仔大大的关注,但小弟初学,试了几次,试不出来
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-09-16 09:34:24 IP:59.120.xxx.xxx 未訂閱
您要判斷的不是用Visible
而是要用x的值
"當x不為...時,就做轉換的動作"


===================引 用 luowy651 文 章===================
procedure DBGrid2Excel(DBGrid:TDBGrid;ExcelFileName:string);
var
MyExcel: Variant;
col,x,y:integer; //x横向,y纵向
begin

MyExcel := CreateOleOBject('Excel.Application'); //启动excel
MyExcel.WorkBooks.Add; //建一个新工作簿
MyExcel.Visible :=false;
Myexcel.displayalerts:=false;
dbgrid.DataSource.DataSet.First;
col:=0;
y:=1;
for x:=1 to dbgrid.Columns.Count do
begin
if dbgrid.Columns[x-1].Visible=true then
begin
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x-col] := dbgrid.Columns[x-1].Title.caption;
// 选择相应的单元格
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x-col].Select;
// 将标题栏位变粗体字
MyExcel.Selection.Font.Bold := true;
// 根据dbgrid宽度设定列宽
MyExcel.WorkBooks[1].WorkSheets[1].Columns[x-col].ColumnWidth := dbgrid.Fields[x-1].DisplayWidth;
// MyExcel.WorkBooks[1].WorkSheets[1].Columns[x].ColumnWidth := dbgrid.columns[x-1].Width/7;
end
else begin
col:=col 1;
end;
end;
inc(y);
while not dbgrid.DataSource.DataSet.eof do
begin
for x:=1 to dbgrid.Columns.Count do
begin
if dbgrid.Columns[x-1].Visible=true then
begin
MyExcel.WorkBooks[1].WorkSheets[1].Cells[y,x] := dbgrid.Columns[x-1].Field.asstring;
end;
end;
inc(y);
dbgrid.DataSource.DataSet.next;
end;
MyExcel.WorkBooks[1].Saveas(ExcelFileName);
MyExcel.WorkBooks.Close;
MyExcel.Quit;
dbgrid.DataSource.DataSet.First;
Application.Messagebox('Excel表格导出完成!','信息',mb_Ok mb_Iconinformation);
end;




===================引 用 老大仔 文 章===================
請問該段程式您是怎麼寫的??
貼上來給大家看看問題在哪裡

===================引 用 luowy651 文 章===================
谢谢老大仔大大的关注,但小弟初学,试了几次,试不出来
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-09-16 09:50:09 IP:125.119.xxx.xxx 訂閱
下面的code是另一种方法,能把dbgrid.Columns[i].Visible=False的隐藏栏位不导出来,但不足的是,该栏位虽然不导出来了,却会在Excel中占用一个空栏位,比较难看.
procedure DBGrid2Excel(DBGrid:TDBGrid;ExcelFileName:string);
var
Page: Variant;
i, j: Integer;
BM: TBookMark;
MyExcel: Variant;
begin

MyExcel := CreateOleOBject('Excel.Application'); //启动excel
MyExcel.WorkBooks.Add; //建一个新工作簿
MyExcel.Visible :=false;
Myexcel.displayalerts:=false;
Myexcel.WorkBooks[1].WorkSheets[1].Name := 'sheet1';
Page := MyExcel.WorkBooks[1].WorkSheets['sheet1'];
j := 1;
with dbgrid.DataSource.DataSet do
begin
BM := GetBookmark; //设置GOTO循环
DisableControls;
//将TDBGrid表中的标题插入到Excel表中的首行
for I:=0 to dbgrid.Columns.Count-1 do
begin
if dbgrid.Columns[i].Visible=False then
Continue;
Page.Cells[j,i 1] := dbgrid.Columns[i].Title.Caption;
Page.Cells[j,i 1].Font.Bold := True; //设置字体为粗体
end;
Inc(j); //Excel表中的下一行
First; //将指针返回到TDBGrid表中数据的首行
while not Eof do
begin
for i:=0 to dbgrid.Columns.Count-1 do
begin
if dbgrid.Columns[i].Visible=False then
Continue;
//将指定行中每列的数据,添加到Excel表中
Page.Cells[j,i 1] := trim(dbgrid.DataSource.DataSet.Fieldbyname(dbgrid.Columns[i].FieldName).asstring);
end;
Inc(j); //Excel表中的下一行
Next; //TDBGrid表中的下一条记录
end;
GotoBookmark(BM);
FreeBookmark(BM);
EnableControls;
end;
MyExcel.WorkBooks[1].Saveas(ExcelFileName);
MyExcel.WorkBooks.Close;
MyExcel.Quit;
dbgrid.DataSource.DataSet.First;
Application.Messagebox('Excel表格导出完成!','信息',mb_Ok mb_Iconinformation);
end;

老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-09-16 09:58:04 IP:59.120.xxx.xxx 未訂閱
看起來您所著重的地方一直是Visible的部份
既然Visible是False就不轉
那我個人覺得可以想成另一種: 只要遇到某些欄位(檔位)就不轉
這樣想應該也合理吧?

假如您覺得合理的話
就可以不需要一直使用Visible來判斷
而是用x值來判斷

(也當然~您要事先知道是哪幾個欄位不做轉換)

===================引 用 luowy651 文 章===================
下面的code是另一种方法,能把dbgrid.Columns[i].Visible=False的隐藏栏位不导出来,但不足的是,该栏位虽然不导出来了,却会在Excel中占用一个空栏位,比较难看.
procedure DBGrid2Excel(DBGrid:TDBGrid;ExcelFileName:string);
var
Page: Variant;
i, j: Integer;
BM: TBookMark;
MyExcel: Variant;
begin

MyExcel := CreateOleOBject('Excel.Application'); //启动excel
MyExcel.WorkBooks.Add; //建一个新工作簿
MyExcel.Visible :=false;
Myexcel.displayalerts:=false;
Myexcel.WorkBooks[1].WorkSheets[1].Name := 'sheet1';
Page := MyExcel.WorkBooks[1].WorkSheets['sheet1'];
j := 1;
with dbgrid.DataSource.DataSet do
begin
BM := GetBookmark; //设置GOTO循环
DisableControls;
//将TDBGrid表中的标题插入到Excel表中的首行
for I:=0 to dbgrid.Columns.Count-1 do
begin
if dbgrid.Columns[i].Visible=False then
Continue;
Page.Cells[j,i 1] := dbgrid.Columns[i].Title.Caption;
Page.Cells[j,i 1].Font.Bold := True; //设置字体为粗体
end;
Inc(j); //Excel表中的下一行
First; //将指针返回到TDBGrid表中数据的首行
while not Eof do
begin
for i:=0 to dbgrid.Columns.Count-1 do
begin
if dbgrid.Columns[i].Visible=False then
Continue;
//将指定行中每列的数据,添加到Excel表中
Page.Cells[j,i 1] := trim(dbgrid.DataSource.DataSet.Fieldbyname(dbgrid.Columns[i].FieldName).asstring);
end;
Inc(j); //Excel表中的下一行
Next; //TDBGrid表中的下一条记录
end;
GotoBookmark(BM);
FreeBookmark(BM);
EnableControls;
end;
MyExcel.WorkBooks[1].Saveas(ExcelFileName);
MyExcel.WorkBooks.Close;
MyExcel.Quit;
dbgrid.DataSource.DataSet.First;
Application.Messagebox('Excel表格导出完成!','信息',mb_Ok mb_Iconinformation);
end;

luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-09-16 10:03:37 IP:125.119.xxx.xxx 訂閱
我的那个dbgrid中,根据不同的情况,哪几个栏位要导出,哪几个栏位不导出,是在变化的,我的目的,是要把在dbgrid中显示出来的栏位导出

===================引 用 老大仔 文 章===================
看起來您所著重的地方一直是Visible的部份
既然Visible是False就不轉
那我個人覺得可以想成另一種: 只要遇到某些欄位(檔位)就不轉
這樣想應該也合理吧?

假如您覺得合理的話
就可以不需要一直使用Visible來判斷
而是用x值來判斷

(也當然~您要事先知道是哪幾個欄位不做轉換)

老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-09-17 11:40:05 IP:59.120.xxx.xxx 未訂閱
在導入資料前(while not Eof do...)
請先將 (此處)
while not Eof do
begin
for i:=0 to dbgrid.Columns.Count-1 do
begin
if dbgrid.Columns[i].Visible=False then
Continue;
//将指定行中每列的数据,添加到Excel表中
Page.Cells[j,i 1] := trim(dbgrid.DataSource.DataSet.Fieldbyname(dbgrid.Columns[i].FieldName).asstring);
end;
Inc(j); //Excel表中的下一行
Next; //TDBGrid表中的下一条记录
end;


===================引 用 luowy651 文 章===================
我的那个dbgrid中,根据不同的情况,哪几个栏位要导出,哪几个栏位不导出,是在变化的,我的目的,是要把在dbgrid中显示出来的栏位导出


編輯記錄
老大仔 重新編輯於 2010-09-17 11:40:51, 註解 無‧
系統時間:2024-07-02 0:53:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!