从任务中心导出的excel没问题呢,主要是导出带图片的数据就不行了
var
o: object;
app, Workbooks, Worksheets, sheet: DispatchHelper;
FPicture, FPictures, Range, tRow, tCol: DispatchHelper;
UsedRange, Cells, Rows: DispatchHelper;
sColValue, sFolder,TempFile, sFileName: string;
JpegMap: TJPEGImage;
DBImage1: TDBImage;
i, PicIndex, RowCount, sfzhCol, zpCol: Integer;
bEof: Boolean;
zpbh, zpColName: string;
begin
if DataSetBroker1.DataSet.RecordCount = 0 then Exit;
SaveDialog1.FileName := '从业人员信息明细表';
SaveDialog1.DefaultExt := 'xls';
if SaveDialog1.Execute = false then Exit;
sFolder := '';
sFileName := SaveDialog1.FileName;
while StringUtils.Pos('\', sFileName) > 0 do
begin
sFolder := sFolder + StringUtils.Copy(sFileName, 1, StringUtils.Pos('\', sFileName));
sFileName := StringUtils.Copy(sFileName, StringUtils.Pos('\', sFileName) + 1, sFileName.Length - StringUtils.Pos('\', sFileName))
end;
sFileName := SaveDialog1.FileName;
if (sender as TBitBtn).Tag=1 then
begin
RowCount := DataGrid1.SelectedCount;
DataGrid1.SaveToXLS(sFileName, False);
end
else
begin
RowCount := DataSetBroker1.DataSet.RecordCount;
DataGrid1.SaveToXLS(sFileName, True);
end;
o := ComObj.CreateOleObject('Excel.Application');
app := DispatchHelper.Create(o);
app.PropertyPut('Visible', [false]);
app.PropertyPut('DisplayAlerts', [false]);
Workbooks := DispatchHelper.Create(app.PropertyGet('Workbooks', []));
Worksheets := DispatchHelper.Create(Workbooks.InvokeMethod('Open', [sFileName]));
sheet := DispatchHelper.Create(Worksheets.PropertyGet('Worksheets', [1]));
sheet.InvokeMethod('Select', []);
{
//取使用范围的行数
UsedRange:=DispatchHelper.Create(sheet.PropertyGet('UsedRange', []));
cells:=DispatchHelper.Create(UsedRange.PropertyGet('Cells', []));
Rows:=DispatchHelper.Create(cells.PropertyGet('Rows', []));
RowCount:=objecthelper.ToInt(Rows.PropertyGet('count',[]));
{}
bEof := false;
i := 1;
while bEof = false do
begin
Cells := DispatchHelper.Create(app.PropertyGet('Cells', [1, i]));
if Cells.PropertyGet('value', []) <> nil then
sColValue := objecthelper.ToString(Cells.PropertyGet('value', []))
else
sColValue := '';
if sColValue = '身份证号' then
begin
sfzhCol := i;
end
else if sColValue = '' then
begin
zpColName := '';
if i > 26 then
begin
for zpCol := 1 to Trunc(i / 26) do
begin
zpColName := Char(64 + zpCol);
end;
zpColName := zpColName + Char(64 + (i mod 26));
end
else
begin
zpColName := Char(64 + i);
end;
zpCol := i;
Cells.PropertyPut('value', ['照片']);
tCol := DispatchHelper.Create(sheet.PropertyGet('Columns', ));
tCol.PropertyPut('ColumnWidth', [25]);
bEof := true;
end;
i := i + 1;
end;
PicIndex := 1;
for i := 1 to RowCount do
begin
tRow := DispatchHelper.Create(sheet.PropertyGet('Rows', [i + 1]));
tRow.PropertyPut('RowHeight', [160]);
Cells := DispatchHelper.Create(app.PropertyGet('Cells', [i + 1, sfzhCol]));
sColValue := objecthelper.ToString(Cells.PropertyGet('value', []));
if DataSetBroker1.DataSet.Locate('sfzh', [sColValue], [TLocateOption.loPartialKey]) then
begin
zpbh := DataSetBroker1.DataSet.FieldByName('zpbh').AsString;
TSqlDataSet(dsbZP.DataSet).UserFilter := 'zpbh=''' + zpbh + '''';
if dsbZP.DataSet.RecordCount > 0 then
begin
TempFile:=sFolder + 'temp.jpg';
TBlobField(dsbZP.DataSet.FieldByName['zp']).SaveToFile(TempFile);
try
if BMP2JPG(TempFile,TempFile) then
begin
JpegMap := TJPEGImage.Create;
JpegMap.LoadFromFile(TempFile);
DBImage1 := TDBImage.Create(self);
DBImage1.Picture.Bitmap.Assign(JpegMap);
DBImage1.CopyToClipboard;
Range := DispatchHelper.Create(sheet.PropertyGet('Range', [zpColName + SysUtils.IntToStr(i + 1), zpColName + SysUtils.IntToStr(i + 1)]));
Range.InvokeMethod('Select', []);
sheet.InvokeMethod('Paste', []);
FPicture := DispatchHelper.Create(sheet.PropertyGet('Pictures', [PicIndex]));
//FPicture:=DispatchHelper.Create(FPictures.InvokeMethod('Insert', ['D:\1.jpg']));
//FPicture.PropertyPut('Left', [10]);
//FPicture.PropertyPut('Top', [10]);
FPicture.PropertyPut('width', [120]);
FPicture.PropertyPut('height', [160]);
PicIndex := PicIndex + 1;
end;
finally
JpegMap.Free;
DBImage1.Free;
if SysUtils.FileExists(TempFile) then SysUtils.DeleteFile(TempFile);
end;
end;
end;
end;
app.InvokeMethod('Save', []);
app.PropertyPut('Visible', [true]);
(o as System.IDisposable).Dispose;
end; |