dbgrid转excel时,如何让dbgrid中隐藏的栏位不导出? |
尚未結案
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
各位大大好,下面是我把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 發送簡訊給我 |
請在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 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
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 發送簡訊給我 |
您要判斷的不是用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 發送簡訊給我 |
下面的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 發送簡訊給我 |
看起來您所著重的地方一直是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 發送簡訊給我 |
我的那个dbgrid中,根据不同的情况,哪几个栏位要导出,哪几个栏位不导出,是在变化的,我的目的,是要把在dbgrid中显示出来的栏位导出
===================引 用 老大仔 文 章=================== 看起來您所著重的地方一直是Visible的部份 既然Visible是False就不轉 那我個人覺得可以想成另一種: 只要遇到某些欄位(檔位)就不轉 這樣想應該也合理吧? 假如您覺得合理的話 就可以不需要一直使用Visible來判斷 而是用x值來判斷 (也當然~您要事先知道是哪幾個欄位不做轉換) |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
在導入資料前(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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |