熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

用Delphi實現自己的Excel報表

2013-11-11 21:05:19  來源: Delphi編程 
 Excel是大家都比較熟悉的表格處理軟件用它來做自由報表載體其好處有

  1從用戶角度

  載體本身具有腳本支持公式編輯模板支持格式版式設計等諸多功能而這些功能對於大部分用戶是比較熟悉的省去了用戶培訓環節多數辦公用電腦都裝有Office軟件所以其輸出的報表可以被任何裝有Office軟件的計算機浏覽

  2從開發者角度

  可以通過OLE訪問提供了大量的編程接口幾乎所有的操作都可以用程序來控制利用宏VBA等技術可以很輕松地編寫報表設計模塊

  整體思路

  程序通過OLE獲取Excel的Sheet對象遍歷每個單元格將模板中的元素以變量表格等替換就生成了最終報表其中元素種類可分為變量元素數據集元素數據字段元素和其它標志元素它們都是處於單元格內的包含特殊格式的字符串格式可以自由定義但要保證此格式不會與正文相沖突

#ValueAA# (變量名兩邊加入#號當遍歷到其所在的單元格時在程序中對單元格進行相應處理)

  報表功能實現

  首先新建Excel模板如下圖

模板保存為templatexlt

  現在模板有了現在需要實現的功能就是分析此模板將模板中的元素替換為程序中將要輸出的變量或數據表

  下面我們來設計一個簡單的模板分析類(TXlTemplateAnalyzer)

   1公有方法

generateReport //套用模板生成最終報表

registerDataSet //在DataSet列表中新增數據集

registerParam //在Param列表中新增變量

removeDataSet //在DataSet列表中刪除數據集

removeParam //在Param列表中刪除變量

SetSheetObject //設置模板的Sheet對象

  2私有成員變量

FBoundLeft FBoundRight //保存左右列邊界

FDataSetList //用於維護數據集列表的私有成員

FParamList //用於維護變量列表的的私有成員

FExcelSheetObject //被操作模板的Sheet對象

FCurrentRow //當前處理的行號

FCurrentCol //當前處理的列號

  3私有工具方法

ProcessDataSetElement //處理數據集元素

getTemplateBoundary //獲取邊界索引號

parsorFieldNameFromElement //從模板元素中提取字段名

FindParam //從FParamList中查找特定Name的變量

FindDataSet //從DataSetList中查找特定Name的DataSet

IsTamplateElement //判斷是否為元素

IsDataSetFieldElement //是否為數據字段元素

IsDataSetBeginElement //是否為DataSet起始元素

IsControlTag //是否為控制元素

IsParamElement //是否為變量元素

  4事件

OnParamElement

OnDataSetOperationElement

OnControlElement

OnDataSetFieldElement

OnElement

  寫到這裡大家可能已經知道我的用意了其實這麼多類成員中但其核心就在於generateReport和ProcessDataSetElement這兩個方法

(以下代碼只是描述性的腳本代碼在Delphi中不能編譯)

generateReport:

  循環遍歷單元格

FCurrentRow := iRow;

FCurrentCol := iCol;//保存當前正在處理的行列索引號

CellObj := FExcelSheetObjectCells[iRow iCol];//取當前單元格對象

CellValue := CellValueValue; //取單元格內容

if IsTamplateElement(CellValue) //判斷是否為模板元素

begin

if IsDataSetBeginElement(CellValue) then //判斷是否為數據集開始元素

begin

ProcessDataSetElement (CellValue); //處理數據集元素

end;

if IsParamElement then(CellValue) then //判斷是否為變量元素

CellObjValue := FindParam(CellValue); //查找變量值填到當前單元格中

if IsControlTag(CellValue) then

…………………

end;

  遍歷循環結束

  執行到這裡報表生成完畢

ProcessDataSetElement

ADataSet := FindDataSet(CellValue);

for j:= to ADataSetRecordCount do

begin

FExcelSheetObjectRows[FCurrentRow + j]Delete;//將當前行刪除(也就是#TableBegin()#所在的行)

FExcelSheetObjectRows[FCurrentRow + j]Insert;//新增行

FExcelSheetObjectRows[FCurrentRow + j]Copy(FExcelSheetObjectRows[FCurrentRow + ]);

for i:= FBoundLeft to FBoundLeft do

begin

fieldCellStr := FExcelSheetObjectRows[FCurrentRow + j]Cell[i]Value; //獲取數據字段元素

fieldname := parsorFieldNameFromElement(fieldCellStr); //從元素中解析字段名

FExcelSheetObjectRows[FCurrentRow + j]Cell[i] := ADataSetFieldByName(fieldname)Value; //將//相應字段的值賦入單元格

end;

ADataSetNext;

end

FCurrentRow := FCurrentRow + j;

  到這裡這個模板分析類的核心功能基本完成了我想如果這個類的實現代碼全部完成後應該把這個類做成一個Component並注冊到Delphi的IDE中以便以後使用在上面提到的類的事件是用來實時通知客戶當前正在處理哪個Element和Cell客戶可以在此事件中做更進一步的特殊處理(例如將上述模板中產值小於完成計劃數的單元格置為紅色等等)非常靈活但是出於代碼整潔在這裡我沒有加到代碼中另外在程序中還可以在報表中加入Excel的各種ChartShape等對象這些留著我以後再寫吧

  TXlTemplateAnalyzer類的是這樣調用

begin

  1先將數據集變量注冊

templtAnalyzerRegisterDataSet(DataSet Table);

templtAnalyzerRegisterParam(Now Date);

templtAnalyzerRegisterParam(totalQu TotalQuantity);

templtAnalyzerRegisterParam(totalPlan TotalPlan);

templtAnalyzerRegisterParam(totalPer TotalPercent);

  2生成報表

templtAnalyzergenerateReport;

end;

  參考文檔MSDN:Microsoft Developer Net

  好了大家不妨按我的思路試試希望我的這篇文章能給大家帶來幫助

  本人口才不好又是初次寫文檔難免會有不合適的地方歡迎大家指正我定會繼續努力的


From:http://tw.wingwit.com/Article/program/Delphi/201311/8465.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.