delphi 怎么实现机构图的显示与打印
1、请问:delphi 怎么实现组织机构图的显示与打印 导出word也行
2、怎么实现导出excel 每行都带标题,类似工资条。如下:
一格一格填充太慢,有没有好的方法
姓名 基本工资 提成 合计
张三 100 2000 2100
姓名 基本工资 提成 合计
李四 200 2000 2200
姓名 基本工资 提成 合计
王五 300 1800 2100
[解决办法]
导出excel
用下面这个超快,1万行数据,几秒搞定。
var arXlsBegin : array[0..5] of Word = ($809, 8, 0, $10, 0, 0); arXlsEnd: array[0..1] of Word = ($0A, 00); arXlsString: array[0..5] of Word = ($204, 0, 0, 0, 0, 0); arXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0); arXlsInteger: array[0..4] of Word = ($27E, 10, 0, 0, 0); arXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataQry: TADOQuery);var i: integer; Col, row: word; ABookMark: TBookMark; aFileStream: TFileStream; procedure incColRow; //增加行列号 begin if Col = aDataQry.FieldCount - 1 then begin Inc(Row); Col :=0; end else Inc(Col); end; procedure WriteStringCell(AValue: string);//写字符串数据 var L: Word; begin L := Length(AValue); arXlsString[1] := 8 + L; arXlsString[2] := Row; arXlsString[3] := Col; arXlsString[5] := L; aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString)); aFileStream.WriteBuffer(Pointer(AValue)^, L); IncColRow; end; procedure WriteIntegerCell(AValue: integer);//写整数 var V: Integer; begin arXlsInteger[2] := Row; arXlsInteger[3] := Col; aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger)); V := (AValue shl 2) or 2; aFileStream.WriteBuffer(V, 4); IncColRow; end; procedure WriteFloatCell(AValue: double);//写浮点数 begin arXlsNumber[2] := Row; arXlsNumber[3] := Col; aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber)); aFileStream.WriteBuffer(AValue, 8); IncColRow; end;begin if aDataQry.Recordset.RecordCount = 0 then Exit; if FileExists(FileName) then DeleteFile(FileName); //文件存在,先删除 aFileStream := TFileStream.Create(FileName, fmCreate); Try //写文件头 aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin)); //写列头 Col := 0; Row := 0; if bWriteTitle then begin for i := 0 to aDataQry.FieldCount - 1 do WriteStringCell(aDataQry.Fields[i].FieldName); end; //写数据集中的数据 aDataQry.DisableControls; ABookMark := aDataQry.GetBookmark; aDataQry.First; while not aDataQry.Eof do begin for i := 0 to aDataQry.FieldCount - 1 do case aDataQry.Fields[i].DataType of ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes: WriteIntegerCell(aDataQry.Fields[i].AsInteger); ftFloat, ftCurrency, ftBCD: WriteFloatCell(aDataQry.Fields[i].AsFloat) else WriteStringCell(aDataQry.Fields[i].AsString); end; aDataQry.Next; end; //写文件尾 AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd)); if aDataQry.BookmarkValid(ABookMark) then aDataQry.GotoBookmark(ABookMark); Finally AFileStream.Free; aDataQry.EnableControls; end;end;
[解决办法]
导出excel 还是挺好的
百度吧