以下是我在Delphi中用过的Excel操作
ExlApp:=CreateOLEObject('Excel.Application'); //创建对象
ExlApp.Visible :=False;// True; //是否显示
ExlApp.DisplayAlerts := False; //是否显示警告
ExlApp.Caption:=aTitle; //设置标题
ExlApp.Workbooks.Open(FileName); // 打开文件
ExlApp.Workbooks[1].Sheets[1].Activate ; //设置哪个工作表为激活状态
ExlApp.Workbooks[1].Title:='报价单';
将行、列数转为坐标名,如 1行3列 转换成 C1
sTemp:=Char(iCol+64);
Result:=Format('%s%d',[sTemp,iRow]);
//---------------------------------------合并相同的列
iStart:=iDataStart; //从第几行开始
iCount:=0; //要合并的数量
for i:=iDataStart to ExlApp.ActiveSheet.UsedRange.Rows.Count do //逐行找相同的列
begin
sValue:=Trim(VarToStr(ExlApp.ActiveSheet.Cells[iStart,iIndex].Value)); //起始行的值
sTemp:=Trim(VarToStr(ExlApp.ActiveSheet.Cells[i,iIndex].Value));//当前行的值
sNO:=ExlApp.ActiveSheet.Cells[i,1].Value;
if (sValue <> sTemp) then //发生变化,要合并前面的列
begin
R1:=GetCellName(iStart,iIndex);
R2:=GetCellName(i-1,iIndex); //i-1就是合并之前的行,这行不算
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Merge; //合并行
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[1].Weight := 2; //设框格线
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[2].Weight := 2;
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[3].Weight := 2;
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[4].Weight := 2;
iStart:=i;
iCount:=1;
end
else if (TryStrToInt(sNO,iTemp)) and (iTemp>0) then
begin
Inc(iCount); //如果起始和当前的值相同,要合并的数量增加
end;
end;
if iCount>0 then //最后还有要合并的,继续合并
begin
R1:=GetCellName(iStart,iIndex);
R2:=GetCellName(iStart+iCount-1,iIndex);
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Merge; //R1和R2之前的CELL进行合并
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[1].Weight := 2; //设框格线
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[2].Weight := 2;
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[3].Weight := 2;
ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R2])].Borders[4].Weight := 2;
end;
ExlApp.ActiveSheet.columns[i].Hidden:=True; //隐藏列
ExlApp.ActiveSheet.Columns[i].Delete; //删除列
ExlApp.ActiveSheet.Cells[4,2].Value:=FieldByName('cCusName').AsString; //赋值
sTemp:=ExlApp.ActiveSheet.Cells[iDataStart,1].Value; //取值
ExlApp.ActiveSheet.Cells[5,10].NumberFormat:='@';//设置单元格的格式,这是文字型
ExlApp.ActiveSheet.Cells[5,10].NumberFormat:='#0.####';//设置单元格的格式,这是数字型
ExlApp.ActiveSheet.Cells[5,10].NumberFormat:='$#0.####';//设置单元格的格式,这是货币型
ExlApp.ActiveSheet.Columns[11].EntireColumn.AutoFit; //自动调整列宽
ExlApp.ActiveSheet.Rows[3].Insert; //插入一行
ExlApp.ActiveSheet.UsedRange.Rows.Count //总行数,列也一样
//---------------------------------------图片操作
var
vStream:TADOBlobStream;
sCol,tmpFile,vPicType,R1:string;
i,iCol:Integer;
picture,workRange : OleVariant;
vName:string;
begin
vStream:=TADOBlobStream.Create(TBlobField(Query001_2.FieldByName('Pics')),bmRead); 将图片数据写入流
if vStream.Size=0 then //没图片数据
begin
exit;
end;
vPicType:=CheckImgType(vStream); //判断图片类型
vStream.Position:=0; //指向流的开头
tmpFile:=GV_TempPath+PubData1.GetGUIDString+'.'+vPicType; //生成临时文件名
TBlobField(Query001_2.FieldByName('Pics')).SaveToFile(tmpFile); //流数据保存到临时文件里
ExlApp.ActiveSheet.Columns[iCol].ColumnWidth :=15; //设置列宽
R1:=GetCellName(iRow,iCol);
workRange:= ExlApp.ActiveSheet.Range[Format('%s:%s',[R1,R1])]; //设定范围,此处只是一格
workRange.Select;
picture := ExlApp.ActiveSheet.Shapes.AddPicture(tmpFile,true,true,workRange.left + 1,workRange.top + 1,workRange.width - 2,workRange.height - 2); //插入图片,前面2个true不知道有什么用,后面分别是left,top,width,height
picture := Unassigned; //释放
workRange:=Unassigned;
DeleteFile(tmpFile); //删除临时文件
vStream.Free;
try
iTemp:=1; //从第1个算起
for i:=1 to 10000 do //因为无法访问shapes的数量,所以这里设大点
begin
if VarIsEmpty(ExlApp.ActiveSheet.Shapes.Item(iTemp)) then //判断第N个存在就删除
begin
Inc(iTemp);
Break;
end else
begin
if ExlApp.ActiveSheet.Shapes.Item(iTemp).Width<500 then //这是自己定义的删除条件
begin
ExlApp.ActiveSheet.Shapes.Item(iTemp).Delete; //删除第N个,后面的就会变成第N个,如此循环
end else
inc(iTemp); //不用删除就判断第N+1个
end;
end;
except
end;
end;
//---------------------------------------退出
try
ExlApp.WorkBooks.Close; //关闭工作薄
ExlApp.Quit; //退出
ExlApp:=unassigned; //关闭线程,不然在任务表里还会存在
Result:=True;
except
Result:=False;
end;