请问谁能提供 BCB(C++builder)直接操作Office Excel 1.基本操作 汇/出入 2.由程序控制Excel 栏位3.存成fil
2个回答
2011-02-12
展开全部
参考资料:http://blog.csdn.net/zjt621/archive/2007/01/30/1498104.aspx
要在应用程序中控制Excel的运行,首先必须在编制自动化客户程序时包含Comobj.hpp
#include "Comobj.hpp"
C++ Builder把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。
设置对象属性:Variant OlePropertySet(属性名,参数……);
获得对象属性:void OlePropertyGet(属性名,参数……);
调用对象方法:1) Variant OleFunction(函数名,参数……);
2) void OleProcedure(过程名,参数……);
在程序中可以用宏定义来节省时间:
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure
举例:
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add")可写为
ExcelApp.PG("workbooks").FN("Add")
C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。
首先定义以下几个变量:
Variant ExcelApp,Workbook1,Sheet1,Range1;
1、Excel中常用的对象是:Application,Workbooks,Worksheets等。
(1)创建应用对象:如:
Variant ExcelApp;
ExcelApp=Variant::CreateObject ("Excel.Application");
或者
ExcelApp=CreateOleObject ("Excel.Application");
(2)创建工作簿对象:
Variant WorkBook1;
WorkBook1=ExcelApp.OlePropertyGet("ActiveWorkBook");
(3)创建工作表对象:
Variant Sheet1;
Sheet1=WorkBook1.OlePropertyGet("ActiveSheet");
(4)创建区域对象:
Variant Range;
Range=Sheet1.OlePropertyGet("Range","A1:A10");
2、常用的属性操作:
(1)使Excel程序不可见
ExcelApp.OlePropertySet("Visible",(Variant)false);
(2)新建EXCEL文件:
(a):新建系统模板的工作簿
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add") //默认工作簿
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",1) //单工作表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",2) //图表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",3) //宏表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",4) //国际通用宏表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",5) //与默认的相同
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",6) //工作簿且只有一个表
(b):新建自己创建的模板的工作簿
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add","C:\\Templates\\result.xlt");
(3)打开工作簿:
ExcelApp.OlePropertyGet("workbooks").OleFunction("open","路径名.xls")
(4)保存工作簿:
WorkBook1.OleFunction("Save"); //保存工作簿
WorkBook1.OleFunction("SaveAs","文件名"); //工作簿保存为,文件路径注意用“\\”
(5)退出EXCEL:
ExcelApp.OleFunction ("Quit");
ExcelApp=Unassigned;
(6)操作工作表
(a)选择选择工作表中第一个工作表
Workbook1.OlePropertyGet("Sheets",1).OleProcedure("Select");
Sheet1=Workbook1.OlePropertyGet("ActiveSheet");
(b)重命名工作表
Sheet1.OlePropertySet("Name","Sheet的新名字");
(c)当前工作簿中的工作表总数
int nSheetCount=Workbook1.OlePropertyGet("Sheets").OlePropertyGet("Count");
(7)操作行和列:
(a)获取当前工作表中有多少行和多少列:
Sheet1.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count"); //列数
Sheet1.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count"); //行数
(b)设置列宽
ExcelApp.OlePropertyGet("Columns",1).OlePropertySet("ColumnWidth",22);
(c)设置行高
ExcelApp.OlePropertyGet("Rows",2).OlePropertySet("RowHeight",25);
(d)在工作表最前面插入一行
Sheet1.OlePropertyGet("Rows",1).OleProcedure("Insert");
(e)删除一行
ExcelApp.OlePropertyGet("Rows",2).OleProcedure("Delete"); //将第2行删除
(7)操作单元格
(a):设置单元格字体
Sheet1.OlePropertyGet("Cells",1,1).OlePropertyGet("Font").OlePropertySet("Name","隶书"); //字体
Sheet1.OlePropertyGet("Cells",2,3).OlePropertyGet("Font").OlePropertySet("size",28); //大小
(b):设置所选区域字体
Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Size",28);
Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Color",RGB(0,0,255));
其中参数的设置:
Font Name : "隶书" //字体名称
Size : 12 //字体大小
Color : RGB(*,*,*) //颜色
Underline : true/false //下划线
Italic: true/false //斜体
(c)设置单元格格式为小数百分比
Sheet1.OlePropertyGet("Cells",1,1).OlePropertySet("NumberFormatLocal","0.00%");
(8)单元格的合并:
(a)Range=Sheet1.OlePropertyGet("Range", "A1:A2"); //A1和A2单元格合并
(b)String strRange="A"+IntToStr(j)+":"+"C"+IntToStr(j); //比如:A1:C5
Range1=Sheet1.OlePropertyGet("Range",strRange.c_str()); //可以用变量控制单元格合并
Range1.OleFunction("Merge",false);
(9)读写单元格:
(a):指定单元格赋值
String strValue="abcdefg";
Sheet1.OlePropertyGet("Cells",3,6).OlePropertySet("Value",strValue.c_str());
Sheet1.OlePropertyGet("Cells",j,1).OlePropertySet("Value","总记录:"+String(j-6));
(b):所选区域单元格赋值
Range.OlePropertyGet("Cells").OlePropertySet("Value",10);
(c):所选区域行赋值
Range.OlePropertyGet("Rows",1).OlePropertySet("Value",1234);
(d):工作表列赋值
Sheet1.OlePropertyGet("Columns",1).OlePropertySet("Value",1234);
(c):读取取值语句:
String strValue=Sheet1.OlePropertyGet("Cells",3,5).OlePropertyGet("Value");
(10)区域选择:
Range1.OlePropertyGet("Cells").OleFunction("Select");
(11)窗口属性:
(a)显示属性
ExcelApp.OlePropertySet("Windowstate",3); //最大化显示
1---------xlNormal //正常显示
2---------xlMinimized //最小化显示
3---------xlMaximized //最大化显示
(b)状态栏属性
ExcelApp.OlePropertySet("StatusBar","您好,请您稍等。正在查询!");
ExcelApp.OlePropertySet("StatusBar", false); //还原成默认值
(c)标题属性:
ExcelApp.OlePropertySet("Caption","查询系统");
另外,为保证程序能正常运行,需要在程序中判断目标机器是否安装了Office;
try
{
ExcelApp=Variant::CreateObject ("Excel.Application");
}
catch(...)
{
ShowMessage("运行Excel出错,请确认安装了Office");
return;
}
要在应用程序中控制Excel的运行,首先必须在编制自动化客户程序时包含Comobj.hpp
#include "Comobj.hpp"
C++ Builder把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。
设置对象属性:Variant OlePropertySet(属性名,参数……);
获得对象属性:void OlePropertyGet(属性名,参数……);
调用对象方法:1) Variant OleFunction(函数名,参数……);
2) void OleProcedure(过程名,参数……);
在程序中可以用宏定义来节省时间:
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure
举例:
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add")可写为
ExcelApp.PG("workbooks").FN("Add")
C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。
首先定义以下几个变量:
Variant ExcelApp,Workbook1,Sheet1,Range1;
1、Excel中常用的对象是:Application,Workbooks,Worksheets等。
(1)创建应用对象:如:
Variant ExcelApp;
ExcelApp=Variant::CreateObject ("Excel.Application");
或者
ExcelApp=CreateOleObject ("Excel.Application");
(2)创建工作簿对象:
Variant WorkBook1;
WorkBook1=ExcelApp.OlePropertyGet("ActiveWorkBook");
(3)创建工作表对象:
Variant Sheet1;
Sheet1=WorkBook1.OlePropertyGet("ActiveSheet");
(4)创建区域对象:
Variant Range;
Range=Sheet1.OlePropertyGet("Range","A1:A10");
2、常用的属性操作:
(1)使Excel程序不可见
ExcelApp.OlePropertySet("Visible",(Variant)false);
(2)新建EXCEL文件:
(a):新建系统模板的工作簿
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add") //默认工作簿
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",1) //单工作表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",2) //图表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",3) //宏表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",4) //国际通用宏表
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",5) //与默认的相同
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add",6) //工作簿且只有一个表
(b):新建自己创建的模板的工作簿
ExcelApp.OlePropertyGet("workbooks").OleFunction("Add","C:\\Templates\\result.xlt");
(3)打开工作簿:
ExcelApp.OlePropertyGet("workbooks").OleFunction("open","路径名.xls")
(4)保存工作簿:
WorkBook1.OleFunction("Save"); //保存工作簿
WorkBook1.OleFunction("SaveAs","文件名"); //工作簿保存为,文件路径注意用“\\”
(5)退出EXCEL:
ExcelApp.OleFunction ("Quit");
ExcelApp=Unassigned;
(6)操作工作表
(a)选择选择工作表中第一个工作表
Workbook1.OlePropertyGet("Sheets",1).OleProcedure("Select");
Sheet1=Workbook1.OlePropertyGet("ActiveSheet");
(b)重命名工作表
Sheet1.OlePropertySet("Name","Sheet的新名字");
(c)当前工作簿中的工作表总数
int nSheetCount=Workbook1.OlePropertyGet("Sheets").OlePropertyGet("Count");
(7)操作行和列:
(a)获取当前工作表中有多少行和多少列:
Sheet1.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count"); //列数
Sheet1.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count"); //行数
(b)设置列宽
ExcelApp.OlePropertyGet("Columns",1).OlePropertySet("ColumnWidth",22);
(c)设置行高
ExcelApp.OlePropertyGet("Rows",2).OlePropertySet("RowHeight",25);
(d)在工作表最前面插入一行
Sheet1.OlePropertyGet("Rows",1).OleProcedure("Insert");
(e)删除一行
ExcelApp.OlePropertyGet("Rows",2).OleProcedure("Delete"); //将第2行删除
(7)操作单元格
(a):设置单元格字体
Sheet1.OlePropertyGet("Cells",1,1).OlePropertyGet("Font").OlePropertySet("Name","隶书"); //字体
Sheet1.OlePropertyGet("Cells",2,3).OlePropertyGet("Font").OlePropertySet("size",28); //大小
(b):设置所选区域字体
Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Size",28);
Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Color",RGB(0,0,255));
其中参数的设置:
Font Name : "隶书" //字体名称
Size : 12 //字体大小
Color : RGB(*,*,*) //颜色
Underline : true/false //下划线
Italic: true/false //斜体
(c)设置单元格格式为小数百分比
Sheet1.OlePropertyGet("Cells",1,1).OlePropertySet("NumberFormatLocal","0.00%");
(8)单元格的合并:
(a)Range=Sheet1.OlePropertyGet("Range", "A1:A2"); //A1和A2单元格合并
(b)String strRange="A"+IntToStr(j)+":"+"C"+IntToStr(j); //比如:A1:C5
Range1=Sheet1.OlePropertyGet("Range",strRange.c_str()); //可以用变量控制单元格合并
Range1.OleFunction("Merge",false);
(9)读写单元格:
(a):指定单元格赋值
String strValue="abcdefg";
Sheet1.OlePropertyGet("Cells",3,6).OlePropertySet("Value",strValue.c_str());
Sheet1.OlePropertyGet("Cells",j,1).OlePropertySet("Value","总记录:"+String(j-6));
(b):所选区域单元格赋值
Range.OlePropertyGet("Cells").OlePropertySet("Value",10);
(c):所选区域行赋值
Range.OlePropertyGet("Rows",1).OlePropertySet("Value",1234);
(d):工作表列赋值
Sheet1.OlePropertyGet("Columns",1).OlePropertySet("Value",1234);
(c):读取取值语句:
String strValue=Sheet1.OlePropertyGet("Cells",3,5).OlePropertyGet("Value");
(10)区域选择:
Range1.OlePropertyGet("Cells").OleFunction("Select");
(11)窗口属性:
(a)显示属性
ExcelApp.OlePropertySet("Windowstate",3); //最大化显示
1---------xlNormal //正常显示
2---------xlMinimized //最小化显示
3---------xlMaximized //最大化显示
(b)状态栏属性
ExcelApp.OlePropertySet("StatusBar","您好,请您稍等。正在查询!");
ExcelApp.OlePropertySet("StatusBar", false); //还原成默认值
(c)标题属性:
ExcelApp.OlePropertySet("Caption","查询系统");
另外,为保证程序能正常运行,需要在程序中判断目标机器是否安装了Office;
try
{
ExcelApp=Variant::CreateObject ("Excel.Application");
}
catch(...)
{
ShowMessage("运行Excel出错,请确认安装了Office");
return;
}
展开全部
在窗体中插入 excelApplication组件即可。
procedure TFrmListQuery.SpeedButton2Click(Sender: TObject);
var
wkBook:_WorkBook;
i,j:integer;
wkSheet:_WorkSheet;
pagezfTotal,pageyfTotal,pagecqfTotal,zfTotal,yfTotal,cqfTotal,
pagerks,pagecks,rksTotal,cksTotal :Double;
Item0 :Variant;
Value :array of Variant;
strSQL,strTj :string;
begin
try
Excel.Connect;
except
on E:exception do
begin
e.Message :='无法连接Excel';
Raise;
end;
end;
DBGridEh1.Visible := True;
StringGrid1.Visible := False;
{ 以下片段删除表TempList的内容 }
strSQL := 'Delete From "TempList" ';
dm.DataSetExecute(strSQL);//执行删除表内容工作
dm.DataSetOpen('Select * from "TempList"');
dm.ClientDataSet_Public.EmptyDataSet;
j:=stringGrid1.RowCount;
ProgressBar1.Max := j;
strTj := '';//条件
if CheckBox1.Checked then //考虑货主
strTj := strTj +MidBStr(ComboBox1.Text,5,8)+chr(10); //考虑货主;
if CheckBox2.Checked then strTj :=strTj + '['+
DateToStr(DateTimePicker1.Date)+'至'+DateToStr(DateTimePicker2.Date)+'止]'; //考虑日期范围
for i:=1 to j-1 do
with dm.ClientDataSet_Public do
if StringGrid1.Cells[0,i]<>'********' then
begin
Append;
Fields[0].AsString :=StringGrid1.Cells[0,i];
Fields[1].AsString :=StringGrid1.Cells[1,i];
Fields[2].AsString :=StringGrid1.Cells[2,i];
if StringGrid1.Cells[3,i]<>'' then
Fields[3].AsDateTime := StrToDaTe(StringGrid1.Cells[3,i]);
Fields[4].AsString :=StringGrid1.Cells[4,i];
Fields[5].AsString :=StringGrid1.Cells[5,i];
Fields[6].AsString :=StringGrid1.Cells[6,i];
Fields[7].AsString :=StringGrid1.Cells[7,i];
Fields[8].AsString :=StringGrid1.Cells[8,i];
Fields[9].AsString :=StringGrid1.Cells[9,i];
Fields[10].AsString :=StringGrid1.Cells[10,i];
if StringGrid1.Cells[11,i]<>'' then
Fields[11].AsFloat := strToFloat(StringGrid1.Cells[11,i]);
if StringGrid1.Cells[12,i]<>'' then
Fields[12].AsDateTime :=StrToDaTe(StringGrid1.Cells[12,i]);
Fields[13].AsString :=StringGrid1.Cells[13,i];
if StringGrid1.Cells[14,i]<>'' then
Fields[14].AsFloat := strToFloat(StringGrid1.Cells[14,i]);
if StringGrid1.Cells[15,i]<>'' then
Fields[15].AsFloat := strToFloat(StringGrid1.Cells[15,i]);
if StringGrid1.Cells[16,i]<>'' then
Fields[16].AsFloat := strToFloat(StringGrid1.Cells[16,i]);
Fields[17].AsString :=StringGrid1.Cells[17,i];
if StringGrid1.Cells[18,i]<>'' then
Fields[18].AsFloat := strToFloat(StringGrid1.Cells[18,i]);
Fields[19].AsString :=StringGrid1.Cells[19,i];
Fields[20].AsString :=StringGrid1.Cells[20,i];
Post;
ProgressBar1.Position := i;
end;
dm.ApplyUpdates(dm.ClientDataSet_Public);
{再从TempList中选取,按货主、出库日期、入库单号排序}
strSQL := 'Select "ConsignorInforID",'+
'"ConsignorName",'+
'"InComeHouseMark",'+
'"InComeHouseDate",'+
'"strBeginStandName",'+
'"strTrainTypeName",'+
'"VehicleNumber",'+
'"strObjectNameID",'+
'"strObjectName",'+
'"strDepositeObjectAreaID",'+
'"strDepositeObjectArea",'+
'"InComeHouseNumber",'+
'"ComeOutHouseDate",'+
'"strComeOutHouseName",'+
'"IncidentalExpenses",'+
'"Carborne",'+
'"FieldExceedDateFee",'+
'"strEmployeeName",'+
'"ComeOutHouseNumber",'+
'"Note",'+
'"CheckOutYesNo" '+
'From "TempList" Where "ConsignorName"<>'''+'合计'''+
' Order By 1,13,3';//按货主、出库日期、入库单号排序
dm.DataSetOpen(strSQL);
with DBGrideh1 do
begin
Columns[0].Title.Caption := '货主|ID';
Columns[1].Title.Caption := '货主|姓名';
Columns[2].Title.Caption := '入库|单号';
Columns[3].Title.Caption := '入库|日期';
Columns[4].Title.Caption := '发站|局名称';
Columns[5].Title.Caption := '发站|车型';
Columns[6].Title.Caption := '发站|车号';
Columns[7].Title.Caption := '品名|ID';
Columns[8].Title.Caption := '品名|名称';
Columns[9].Title.Caption := '存放区域|ID';
Columns[10].Title.Caption := '存放区域|名称';
Columns[11].Title.Caption := '入库数量';
Columns[12].Title.Caption := '搬出日期';
Columns[13].Title.Caption := '出库地点';
Columns[14].Title.Caption := '杂费';
Columns[15].Title.Caption := '汽车运费';
Columns[16].Title.Caption := '场地超期费';
Columns[17].Title.Caption := '提货人';
Columns[18].Title.Caption := '出库数量';
Columns[19].Title.Caption := '备注';
Columns[20].Title.Caption := '是否结算';
end;
for i:=4 to 20 do
DBGrideh1.Columns[i].Width :=60;
DBGrideh1.Columns[0].Width :=50;
DBGrideh1.Columns[1].Width :=100;
DBGrideh1.Columns[2].Width :=100;
DBGrideh1.Columns[3].Width :=80;
WindowState := wsMinimized; //窗口最小化状态
CopyFile(pchar(ExtractFilePath(application.ExeName)+'data\List1.xls'),
pchar(ExtractFilePath(application.ExeName)+'Temp\List1.xls'),False);//复制文件
Excel.DisplayFullScreen[0]:=True; //excel满屏显示
Excel.DisplayInfoWindow:=true; //显示信息窗口
Excel.Visible[0]:=True; //excel可视
//LCID :=GetUserDefaultLCID();
wkBook:=Excel.WorkBooks.Open(ExtractFilePath(application.ExeName)+'Temp\List1.xls',EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,0);
Wksheet := wkBook.Sheets[1] as _WorkSheet;
pagezfTotal := 0;
pageyfTotal := 0;
pagecqfTotal := 0;
zfTotal := 0;
yfTotal := 0;
cqfTotal := 0;
pagerks :=0;
pagecks :=0;
rksTotal :=0;
cksTotal :=0;
Excel.Caption :='正在生成,请等待...';
SetLength(Value,13); //value定义为长度为13的数组
with dm.ClientDataSet_Public do
begin
i := 3;//Excel中的起始行号 i := 3
Wksheet.Cells.item[1,1] := strTj; //写报表条件
First;
while not eof do
begin
Value[0] := Fields[3].AsVariant; //入库日期;
Value[1] := Fields[4].AsVariant ; //发站;
Value[2] := Fields[8].AsVariant; //品名
Value[3] := Fields[6].AsVariant; //车号
Value[4] := Fields[10].AsVariant; //存放地点
Value[5] := Fields[12].AsVariant; //搬出时间
Value[6] := Fields[13].AsVariant; //出库
Value[7] := Fields[14].AsVariant; //杂费
Value[8] := Fields[15].AsVariant; //汽车运费
Value[9] := Fields[16].AsVariant; //超期费
Value[10] := Fields[17].AsVariant; //提货人
Value[11] := Fields[11].AsVariant;//入库
Value[12] := Fields[18].AsVariant;//出库
Item0:=Wksheet.Range['A'+intToStr(i),'M'+intToStr(i)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
//if Fields[14].AsString <>'' then
pagezfTotal := pagezfTotal + Fields[14].AsFloat; //杂费
// if Fields[15].AsString <>'' then
pageyfTotal := pageyfTotal + Fields[15].AsFloat; //汽车运费
// if Fields[16].AsString <>'' then
pagecqfTotal := pagecqfTotal + Fields[16].AsFloat; //超期费
pagerks :=pagerks + Fields[11].AsFloat ;//入库数;
pagecks :=pagecks + Fields[18].AsFloat;//出库数;
if (i mod 22 ) = 21 then //准备处理报表本页合计行
begin
zfTotal := zfTotal + pagezfTotal; //杂费
yfTotal := yfTotal + pageyfTotal; //汽车运费
cqfTotal := cqfTotal + pagecqfTotal; //超期费
rksTotal := rksTotal + pagerks; //入库数
cksTotal := cksTotal + pagecks; // 出库数
Value[0] :='页小计';
Value[1] :='';
Value[2] :='';
Value[3] :='';
Value[4] :='';
Value[5] :='';
Value[6] :='';
Value[7] := pagezfTotal; // 本页杂费
Value[8] := pageyfTotal; // 本页汽车运费
Value[9] := pagecqfTotal;// 本页超期费
Value[10] :='';
Value[11] := pagerks; //本页入库数
Value[12] := pagecks; //本页出库数
Item0:=Wksheet.Range['A'+intToStr(i+1),'M'+intToStr(i+1)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
pagezfTotal := 0; //换页 杂费 =0
pageyfTotal := 0; //换页 汽车运费 =0
pagecqfTotal := 0;//换页 超期费 =0
pagerks :=0; //换页 入库
pagecks :=0; //换页 出库
Wksheet.Cells.item[i+2,1] := strTj; //写报表条件
i:=i+4;//下页的数据行
end else i:=i+1;
next;
end;// end of while not eof do
end;
Wksheet.Range[Wksheet.Cells.item[1,1],Wksheet.Cells.item[i,13]].font.Color:=RGB(0,0,0);
Wksheet.Range[Wksheet.Cells.item[i+1,1],Wksheet.Cells.item[i+2,13]].font.Color:=RGB(0,0,255);//累计行
//先输出本页的,因为可能剩下的不够一页的数据,但是我们也要页汇总
Value[0] :='';
Value[1] :='';
Value[2] :='本页小计';
Value[3] :='------';
Value[4] :='------';
Value[5] :='------';
Value[6] :='------';
Value[7] := pagezfTotal; //本页的杂费
Value[8] := pageyfTotal; //本页的运费
Value[9] := pagecqfTotal;//本页的超期费
Value[10] := ''; //为空
Value[11] := pagerks; //本页的入库数
Value[12] := pagecks; //本页的出库数
Item0:=Wksheet.Range['A'+intToStr(i),'M'+intToStr(i)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
//再输出累计汇总
Value[0] :='';
Value[1] :=HuoZhuName;
Value[2] :='合 计';
Value[3] :='------';
Value[4] :='------';
Value[5] :='------';
Value[6] :='------';
Value[7] := zfTotal+pagezfTotal; //累计的杂费
Value[8] := yfTotal+pageyfTotal; //累计的运费
Value[9] := cqfTotal+pagecqfTotal;//累计的超期费
Value[10] := ''; //为空
Value[11] := rksTotal+pagerks; //累计的入库数
Value[12] := cksTotal+pagecks; //累计的出库数
Item0:=Wksheet.Range['A'+intToStr(i+1),'M'+intToStr(i+1)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
Value[0] :='';
Value[1] :=HuoZhuName;
Value[2] :='杂、运、超期费合计';
Value[3] :='';
Value[4] :='';
Value[5] :='';
Value[6] :='';
Value[7] := zfTotal+pagezfTotal+yfTotal+pageyfTotal+cqfTotal+pagecqfTotal;
Value[8] :='';
Value[9] :='';
Value[10] :='';
Value[11] :='';
Value[12] :='';
Item0:=Wksheet.Range['A'+intToStr(i+2),'M'+intToStr(i+2)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
Excel.Caption :='生成完毕!!!';
Setlength(Value,0); // 释放value内存
WindowState := wsNormal; //窗口恢复标准状态
end;
-------
以上是我在delphi中用的,是我的商业软件的一段呀,运行4年了。C++Builder 同他类似(以前用过C++ builder6)
procedure TFrmListQuery.SpeedButton2Click(Sender: TObject);
var
wkBook:_WorkBook;
i,j:integer;
wkSheet:_WorkSheet;
pagezfTotal,pageyfTotal,pagecqfTotal,zfTotal,yfTotal,cqfTotal,
pagerks,pagecks,rksTotal,cksTotal :Double;
Item0 :Variant;
Value :array of Variant;
strSQL,strTj :string;
begin
try
Excel.Connect;
except
on E:exception do
begin
e.Message :='无法连接Excel';
Raise;
end;
end;
DBGridEh1.Visible := True;
StringGrid1.Visible := False;
{ 以下片段删除表TempList的内容 }
strSQL := 'Delete From "TempList" ';
dm.DataSetExecute(strSQL);//执行删除表内容工作
dm.DataSetOpen('Select * from "TempList"');
dm.ClientDataSet_Public.EmptyDataSet;
j:=stringGrid1.RowCount;
ProgressBar1.Max := j;
strTj := '';//条件
if CheckBox1.Checked then //考虑货主
strTj := strTj +MidBStr(ComboBox1.Text,5,8)+chr(10); //考虑货主;
if CheckBox2.Checked then strTj :=strTj + '['+
DateToStr(DateTimePicker1.Date)+'至'+DateToStr(DateTimePicker2.Date)+'止]'; //考虑日期范围
for i:=1 to j-1 do
with dm.ClientDataSet_Public do
if StringGrid1.Cells[0,i]<>'********' then
begin
Append;
Fields[0].AsString :=StringGrid1.Cells[0,i];
Fields[1].AsString :=StringGrid1.Cells[1,i];
Fields[2].AsString :=StringGrid1.Cells[2,i];
if StringGrid1.Cells[3,i]<>'' then
Fields[3].AsDateTime := StrToDaTe(StringGrid1.Cells[3,i]);
Fields[4].AsString :=StringGrid1.Cells[4,i];
Fields[5].AsString :=StringGrid1.Cells[5,i];
Fields[6].AsString :=StringGrid1.Cells[6,i];
Fields[7].AsString :=StringGrid1.Cells[7,i];
Fields[8].AsString :=StringGrid1.Cells[8,i];
Fields[9].AsString :=StringGrid1.Cells[9,i];
Fields[10].AsString :=StringGrid1.Cells[10,i];
if StringGrid1.Cells[11,i]<>'' then
Fields[11].AsFloat := strToFloat(StringGrid1.Cells[11,i]);
if StringGrid1.Cells[12,i]<>'' then
Fields[12].AsDateTime :=StrToDaTe(StringGrid1.Cells[12,i]);
Fields[13].AsString :=StringGrid1.Cells[13,i];
if StringGrid1.Cells[14,i]<>'' then
Fields[14].AsFloat := strToFloat(StringGrid1.Cells[14,i]);
if StringGrid1.Cells[15,i]<>'' then
Fields[15].AsFloat := strToFloat(StringGrid1.Cells[15,i]);
if StringGrid1.Cells[16,i]<>'' then
Fields[16].AsFloat := strToFloat(StringGrid1.Cells[16,i]);
Fields[17].AsString :=StringGrid1.Cells[17,i];
if StringGrid1.Cells[18,i]<>'' then
Fields[18].AsFloat := strToFloat(StringGrid1.Cells[18,i]);
Fields[19].AsString :=StringGrid1.Cells[19,i];
Fields[20].AsString :=StringGrid1.Cells[20,i];
Post;
ProgressBar1.Position := i;
end;
dm.ApplyUpdates(dm.ClientDataSet_Public);
{再从TempList中选取,按货主、出库日期、入库单号排序}
strSQL := 'Select "ConsignorInforID",'+
'"ConsignorName",'+
'"InComeHouseMark",'+
'"InComeHouseDate",'+
'"strBeginStandName",'+
'"strTrainTypeName",'+
'"VehicleNumber",'+
'"strObjectNameID",'+
'"strObjectName",'+
'"strDepositeObjectAreaID",'+
'"strDepositeObjectArea",'+
'"InComeHouseNumber",'+
'"ComeOutHouseDate",'+
'"strComeOutHouseName",'+
'"IncidentalExpenses",'+
'"Carborne",'+
'"FieldExceedDateFee",'+
'"strEmployeeName",'+
'"ComeOutHouseNumber",'+
'"Note",'+
'"CheckOutYesNo" '+
'From "TempList" Where "ConsignorName"<>'''+'合计'''+
' Order By 1,13,3';//按货主、出库日期、入库单号排序
dm.DataSetOpen(strSQL);
with DBGrideh1 do
begin
Columns[0].Title.Caption := '货主|ID';
Columns[1].Title.Caption := '货主|姓名';
Columns[2].Title.Caption := '入库|单号';
Columns[3].Title.Caption := '入库|日期';
Columns[4].Title.Caption := '发站|局名称';
Columns[5].Title.Caption := '发站|车型';
Columns[6].Title.Caption := '发站|车号';
Columns[7].Title.Caption := '品名|ID';
Columns[8].Title.Caption := '品名|名称';
Columns[9].Title.Caption := '存放区域|ID';
Columns[10].Title.Caption := '存放区域|名称';
Columns[11].Title.Caption := '入库数量';
Columns[12].Title.Caption := '搬出日期';
Columns[13].Title.Caption := '出库地点';
Columns[14].Title.Caption := '杂费';
Columns[15].Title.Caption := '汽车运费';
Columns[16].Title.Caption := '场地超期费';
Columns[17].Title.Caption := '提货人';
Columns[18].Title.Caption := '出库数量';
Columns[19].Title.Caption := '备注';
Columns[20].Title.Caption := '是否结算';
end;
for i:=4 to 20 do
DBGrideh1.Columns[i].Width :=60;
DBGrideh1.Columns[0].Width :=50;
DBGrideh1.Columns[1].Width :=100;
DBGrideh1.Columns[2].Width :=100;
DBGrideh1.Columns[3].Width :=80;
WindowState := wsMinimized; //窗口最小化状态
CopyFile(pchar(ExtractFilePath(application.ExeName)+'data\List1.xls'),
pchar(ExtractFilePath(application.ExeName)+'Temp\List1.xls'),False);//复制文件
Excel.DisplayFullScreen[0]:=True; //excel满屏显示
Excel.DisplayInfoWindow:=true; //显示信息窗口
Excel.Visible[0]:=True; //excel可视
//LCID :=GetUserDefaultLCID();
wkBook:=Excel.WorkBooks.Open(ExtractFilePath(application.ExeName)+'Temp\List1.xls',EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,0);
Wksheet := wkBook.Sheets[1] as _WorkSheet;
pagezfTotal := 0;
pageyfTotal := 0;
pagecqfTotal := 0;
zfTotal := 0;
yfTotal := 0;
cqfTotal := 0;
pagerks :=0;
pagecks :=0;
rksTotal :=0;
cksTotal :=0;
Excel.Caption :='正在生成,请等待...';
SetLength(Value,13); //value定义为长度为13的数组
with dm.ClientDataSet_Public do
begin
i := 3;//Excel中的起始行号 i := 3
Wksheet.Cells.item[1,1] := strTj; //写报表条件
First;
while not eof do
begin
Value[0] := Fields[3].AsVariant; //入库日期;
Value[1] := Fields[4].AsVariant ; //发站;
Value[2] := Fields[8].AsVariant; //品名
Value[3] := Fields[6].AsVariant; //车号
Value[4] := Fields[10].AsVariant; //存放地点
Value[5] := Fields[12].AsVariant; //搬出时间
Value[6] := Fields[13].AsVariant; //出库
Value[7] := Fields[14].AsVariant; //杂费
Value[8] := Fields[15].AsVariant; //汽车运费
Value[9] := Fields[16].AsVariant; //超期费
Value[10] := Fields[17].AsVariant; //提货人
Value[11] := Fields[11].AsVariant;//入库
Value[12] := Fields[18].AsVariant;//出库
Item0:=Wksheet.Range['A'+intToStr(i),'M'+intToStr(i)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
//if Fields[14].AsString <>'' then
pagezfTotal := pagezfTotal + Fields[14].AsFloat; //杂费
// if Fields[15].AsString <>'' then
pageyfTotal := pageyfTotal + Fields[15].AsFloat; //汽车运费
// if Fields[16].AsString <>'' then
pagecqfTotal := pagecqfTotal + Fields[16].AsFloat; //超期费
pagerks :=pagerks + Fields[11].AsFloat ;//入库数;
pagecks :=pagecks + Fields[18].AsFloat;//出库数;
if (i mod 22 ) = 21 then //准备处理报表本页合计行
begin
zfTotal := zfTotal + pagezfTotal; //杂费
yfTotal := yfTotal + pageyfTotal; //汽车运费
cqfTotal := cqfTotal + pagecqfTotal; //超期费
rksTotal := rksTotal + pagerks; //入库数
cksTotal := cksTotal + pagecks; // 出库数
Value[0] :='页小计';
Value[1] :='';
Value[2] :='';
Value[3] :='';
Value[4] :='';
Value[5] :='';
Value[6] :='';
Value[7] := pagezfTotal; // 本页杂费
Value[8] := pageyfTotal; // 本页汽车运费
Value[9] := pagecqfTotal;// 本页超期费
Value[10] :='';
Value[11] := pagerks; //本页入库数
Value[12] := pagecks; //本页出库数
Item0:=Wksheet.Range['A'+intToStr(i+1),'M'+intToStr(i+1)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
pagezfTotal := 0; //换页 杂费 =0
pageyfTotal := 0; //换页 汽车运费 =0
pagecqfTotal := 0;//换页 超期费 =0
pagerks :=0; //换页 入库
pagecks :=0; //换页 出库
Wksheet.Cells.item[i+2,1] := strTj; //写报表条件
i:=i+4;//下页的数据行
end else i:=i+1;
next;
end;// end of while not eof do
end;
Wksheet.Range[Wksheet.Cells.item[1,1],Wksheet.Cells.item[i,13]].font.Color:=RGB(0,0,0);
Wksheet.Range[Wksheet.Cells.item[i+1,1],Wksheet.Cells.item[i+2,13]].font.Color:=RGB(0,0,255);//累计行
//先输出本页的,因为可能剩下的不够一页的数据,但是我们也要页汇总
Value[0] :='';
Value[1] :='';
Value[2] :='本页小计';
Value[3] :='------';
Value[4] :='------';
Value[5] :='------';
Value[6] :='------';
Value[7] := pagezfTotal; //本页的杂费
Value[8] := pageyfTotal; //本页的运费
Value[9] := pagecqfTotal;//本页的超期费
Value[10] := ''; //为空
Value[11] := pagerks; //本页的入库数
Value[12] := pagecks; //本页的出库数
Item0:=Wksheet.Range['A'+intToStr(i),'M'+intToStr(i)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
//再输出累计汇总
Value[0] :='';
Value[1] :=HuoZhuName;
Value[2] :='合 计';
Value[3] :='------';
Value[4] :='------';
Value[5] :='------';
Value[6] :='------';
Value[7] := zfTotal+pagezfTotal; //累计的杂费
Value[8] := yfTotal+pageyfTotal; //累计的运费
Value[9] := cqfTotal+pagecqfTotal;//累计的超期费
Value[10] := ''; //为空
Value[11] := rksTotal+pagerks; //累计的入库数
Value[12] := cksTotal+pagecks; //累计的出库数
Item0:=Wksheet.Range['A'+intToStr(i+1),'M'+intToStr(i+1)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
Value[0] :='';
Value[1] :=HuoZhuName;
Value[2] :='杂、运、超期费合计';
Value[3] :='';
Value[4] :='';
Value[5] :='';
Value[6] :='';
Value[7] := zfTotal+pagezfTotal+yfTotal+pageyfTotal+cqfTotal+pagecqfTotal;
Value[8] :='';
Value[9] :='';
Value[10] :='';
Value[11] :='';
Value[12] :='';
Item0:=Wksheet.Range['A'+intToStr(i+2),'M'+intToStr(i+2)];
Item0.VALUE :=VarArrayOf(Value); //将Value的值写到excel定义的区域
Excel.Caption :='生成完毕!!!';
Setlength(Value,0); // 释放value内存
WindowState := wsNormal; //窗口恢复标准状态
end;
-------
以上是我在delphi中用的,是我的商业软件的一段呀,运行4年了。C++Builder 同他类似(以前用过C++ builder6)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询