请问如何将stringgrid中的内容导出到excel中去(100分)(100分)

  • 主题发起人 主题发起人 delphimens
  • 开始时间 开始时间
D

delphimens

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何将stringgrid中的内容导出到excel中去
注:stringgrid中cells中的内容有分行,
所以我用v_grid.cells[i,j]去看内容时为空?
??????
100分求助
 
给你篇文章,上面有操作excel的方法,最好先把stringgrid的内容存储到一个表里,就更简单了
【如何在Delphi中操作Excel】
在数据库应用软件的开发过程中,经常需要把数据转换成Excel文件,让用户作进一步的数据处理。而Delphi是开发数据库应用系统的常用工具,那么,如何在Delphi中操作Excel呢?
  我们知道,在Microsoft Office软件中有一种内嵌的编程语言VBA,它是一种宏语言,利用它,你可以编写出功能强大的代码,如打开文件、修改数据、保存数据和设置字体等。另一方面,Microsoft Office软件中的宏能以VBA代码的形式记录下你的操作过程。因此借助宏操作,可以很轻松地实现某一功能,并把这些代码稍作修改嵌入到你的软件中。但是VBA也存在一个缺点,它必须有Microsoft Office作平台,在哪里编写,必须在哪里执行。例如在Excel下编写的一段VBA代码,则它只有在Excel下才能运行。因此,笔者的方法就是把VBA代码嵌入到Delphi中,从而实现用Delphi操作Excel。
  下面,我们以Delphi程序为例,说明这种调用方法:
  Unit excel;
  interface
  uses
  Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs, StdCtrls,ComObj;
  //ComObj是操作OLE对象的函数集
  type TForm1 =class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
  var
  Form1: TForm1;
  implementation
  {$R *.DFM}
  procedure TForm1.Button1Click(Sender: TObject);
  var
  eclApp,WorkBook:Variant;
  //声明为OLE Automation 对象
  xlsFileName:string;begin
  xlsFileName:=‘ex.xls‘;
  try
  //创建OLE对象Excel Application与 WorkBook
  eclApp:=CreateOleObject(‘Excel.Application‘);
  WorkBook:=CreateOleobject(‘Excel.Sheet‘);
  except
  ShowMessage(‘您的机器里未安装Microsoft Excel。‘);
  Exit;
  end;
  try
  ShowMessage(‘下面演示:新建一个XLS文件,并写入数据,最后关闭它。‘);
  workBook:=eclApp.workBooks.Add;
  eclApp.Cells(1 , 1):=‘字符型‘;
  eclApp.Cells(2 , 1):=‘Excel文件‘;
  eclApp.Cells(1 , 2):=‘Money型‘;
  eclApp.Cells(2 , 2):=10.01;
  eclApp.Cells(1 , 3):=‘日期型‘;eclApp.Cells(2 , 3):=Date;
  WorkBook.saveas(xlsFileName);
  WorkBook.close;
  ShowMessage(‘下面演示:打开刚创建的XLS文件,并修改其中的内容,然后,由用户决定是否保存。‘);
  WorkBook:=eclApp.workBooks.Open(xlsFileName);
  eclApp.Cells(2 , 1):=‘Excel文件类型‘;
  if MessageDlg(xlsFileName+‘文件已被修改,是否保存?‘,mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  WorkBook.save
  else
  workBook.Saved := True; //放弃修改
  WorkBook.Close;
  eclApp.Quit;
  //退出Excel Application
  //释放VARIANT变量
  eclApp:=Unassigned;
  except
  ShowMessage(‘不能正确操作Excel文件。可能是该文件已被其他程序打开, 或系统错误。‘);
  WorkBook.close;
  eclApp.Quit;
  //释放VARIANT变量
  eclApp:=Unassigned;
  end;
  end;
  end.
  经过上述操作过程后,我们就可以很放心地将数据库中的数据转换成Excel文件了。
 
下面的函数很爽,别忘了在USE中加入 COMOBJ
Function charadd(startchar:String;num:Integer):string;
var
tmps,tmpg:Integer;
tmpstr:String;

begin
tmpstr:=startchar;
tmps:=(num div 26);
tmpg:=(num mod 26);
if tmps<>0 then
if length(startchar)=1 then
tmpstr:=chr(64+tmps)+startchar[1]
else
tmpstr:=chr(ord(startchar[1])+tmps)+startchar[2];

if tmpg<>0 then begin
if length(tmpstr)=1 then
begin
if ord(tmpstr[1])+tmpg>90 then
tmpstr:=chr(65)+chr(ord(tmpstr[1])+tmpg-26)
else
tmpstr:=chr(ord(tmpstr[1])+tmpg);
end
else
begin
if ord(tmpstr[2])+tmpg>90 then
tmpstr:=chr(ord(tmpstr[1])+1)+chr(ord(tmpstr[2])+tmpg-26)
else
tmpstr:=tmpstr[1]+chr(ord(tmpstr[2])+tmpg);
end;
end;
result:=tmpstr;
end;

function instr(surstr,destr:string):Byte;
begin
Result:=Pos(destr,surstr);
end;

function mid(mystr:string;strstart,str_len:Integer):string;
begin
Result:=copy(mystr,strstart,str_len);
end;

procedure ExtoExcel(var Range:Variant;sheet:Variant;cellsize,celltext:String;linesize,colsize,horiAlig,VertAlig:Integer;autowrap:Boolean);
begin
Range := sheet.Range[cellsize];//单元格从A3到A5
if mid(cellsize,1,instr(cellsize,':')-1)<>mid(cellsize,instr(cellsize,':')+1,8) then
Range.Merge; //合并单元格
Range.Borders.LineStyle :=linesize; //加边框
if colsize>0 then
Range.Columns[1].ColumnWidth :=colsize; // 设置列宽
Range.NumberFormat:='@';
Range.FormulaR1C1 := celltext;
Range.WrapText:=Autowrap;
Range.HorizontalAlignment :=horiAlig;//xlCenter(水平对齐方式)
Range.VerticalAlignment := VertAlig;//xlCenter(垂直对齐方式)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Range ,v ,Sheet:Variant;
i,j:integer;
begin
try
v:= CreateOleObject('Excel.Application');
v.Visible :=True;//是否显示
v.Workbooks.Add;//新建EXCEL文件
v.Workbooks[1].WorkSheets[1].Name := '打印测试';

Sheet:= v.Workbooks[1].WorkSheets[1];
for i:=0 to StringGrid.Rowcount-1 do
begin
for j:=0 to StringGrid.Colcount-1 do
begin
ExtoExcel(Range,sheet,charadd('A',j)+IntToStr(i+1)+':'+charadd('A',j)+IntToStr(i+1),StringGrid.Cells[j,i],1,4,3,2,False);
end;
end;

except
showmessage('初始化Excel失败,可能没装Excel,或者其它错误;请重新再试。');
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
var i,j:integer;
begin
for i:=0 to StringGrid.ColCount-1 do
for j:=0 to StringGrid.RowCount-1 do
StringGrid.Cells[i,j]:=IntToStr(i)+','+IntToStr(j);
end;

 
不好意思,我的stringgrid中的cells的内容是用draw上去的,所以用
stringgrid.cess[i,j]去取时变为空,取不到数据?
 
后退
顶部