FineReport报表二次开发详细文档格式.docx
《FineReport报表二次开发详细文档格式.docx》由会员分享,可在线阅读,更多相关《FineReport报表二次开发详细文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
D:
\\stuff.cpt"
);
TemplateImportertemplateImporter=newTemplateImporter();
WorkBookworkBook=(WorkBook)templateImporter.generate(cptFile);
Stuff.cpt是用报表设计器生成的模板文件。
只需要用建立一个TemplateImporter对象,然后调用它的generateReport()方法来产生一个Report对象,同时可以将产生的Report对象强制转换成WorkSheet或者GroupReport。
保存成模板文件
//CPT
//清空公式计算结果
E:
\\newtemplate\\stuff.cpt这个是导出后新文档生成的地址
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("
\\newtemplate\\stuff.cpt"
));
TemplateExportertemplateExporter=newTemplateExporter();
templateExporter.export(outputStream,workBook.execute(parameterMap));
通过调用TemplateExporter的exportReport(...)方法,可以把Report对象以CPT格式保存到外部磁盘文件当中。
可执行代码
读取报表模板stuff.cpt,再分别保存为stuff.cpt,stuff.pdf和stuff.xls。
package.fr.demo;
importjava.io.File;
importjava.io.FileOutputStream;
import.fr.base.FRContext;
import.fr.base.dav.LocalEnv;
import.fr.report.WorkBook;
import.fr.report.core.ReportHelper;
import.fr.report.io.ExcelExporter;
import.fr.report.io.PDFExporter;
import.fr.report.io.TemplateExporter;
import.fr.report.io.TemplateImporter;
import.fr.report.io.TextExporter;
import.fr.report.io.WordExporter;
/**
*演示如何导入导出模板
*authoredgarduan
*version6.5
*/
publicclassReportIO{
*paramargs
publicstaticvoidmain(String[]args){
//报表运行环境路径,WEB-INF目录所放的位置
StringenvPath="
C:
/FineReport6.5/WebReport/WEB-INF"
;
//设置当前报表运行环境,报表预览时需要一个运行环境
//没有WEB-INF目录时,路径设置为null.FRContext.setCurrentEnv(newLocalEnv(null));
FRContext.setCurrentEnv(newLocalEnv(envPath));
try{
//读取模板
java.util.MapparameterMap=newjava.util.HashMap();
FileOutputStreamoutputStream;
//生成CPT
//清空公式计算结果
ReportHelper.clearFormulaResult(workBook);
outputStream=newFileOutputStream(newFile("
templateExporter.export(outputStream,workBook.execute(parameterMap));
//生成PDF
\\newtemplate\\stuff.pdf"
PDFExporterpdfExporter=newPDFExporter();
pdfExporter.export(outputStream,workBook.execute(parameterMap));
//生成DOC
\\newtemplate\\stuff.doc"
WordExporterwordExporter=newWordExporter();
wordExporter.export(outputStream,workBook.execute(parameterMap));
//生成XLS
\\newtemplate\\stuff.xls"
ExcelExporterexcelExporter=newExcelExporter();
excelExporter.export(outputStream,workBook.execute(parameterMap));
//生成TXT
\\newtemplate\\stuff.txt"
TextExportertextExporter=newTextExporter();
textExporter.export(outputStream,workBook.execute(parameterMap));
}catch(Exceptione){
e.printStackTrace();
}
}
单元格格式设置
//
新建一个单元格,
位置为(2,
2),
列宽为2
行高为
2,
值为文本
"
FineReport"
CellElement
cellElement
=
new
CellElement(2,
得到CellElement的样式,如果没有新建默认样式
Style
style
cellElement.getStyle();
if(style
==
null)
{
Style.getInstance();
}
设置字体和前景的颜色
FRFont
frFont
FRFont.getInstance("
Dialog"
Font.BOLD,
14);
frFont.applyForeground(new
Color(21,
76,
160));
style.deriveFRFont(frFont);
设置背景
ColorBackground
background
ColorBackground.getInstance(new
Color(255,
255,
177));
style.deriveBackground(background);
设置水平居中
style.deriveHorizontalAlignment(Constants.CENTER);
设置边框
style.deriveBorder(Constants.LINE_DASH_DOT,
Color.red,
Constants.LINE_DASH_DOT,
Color.yellow,
Color.BLUE,
Color.CYAN);
改变单元格的样式
cellElement.setStyle(style);
改变单元格的格式,应先取出该单元格(CellElement)的格式(Style)。
在默认的情况下Style是null,故当取出Style后应先判断其值是否为null,如果这个值为空,则需先新建一个Style,然后再将该值赋给CellElement。
最后根据Style和FRFont中的方法进一步地设置该单元格的各种属性。
可执行代码如下:
importjava.awt.Color;
importjava.awt.Font;
import.fr.base.Constants;
import.fr.base.FRFont;
import.fr.base.Style;
import.fr.base.background.ColorBackground;
import.fr.report.CellElement;
import.fr.report.DefaultCellElement;
import.fr.report.WorkBookTemplate;
import.fr.report.WorkSheet;
import.fr.web.Reportlet;
import.fr.web.ReportletRequest;
*ReportletFromTemplateDemo.
*authormarks
*设置单元格格式
publicclassCellElementStyleDemoimplementsReportlet{
publicCellElementStyleDemo(){
//建立新报表需要传参(ReportletRequestreportletRequest)
publicWorkBookTemplatecreateReport(ReportletRequestreportletRequest){
//newaWorkSheet
WorkBookwb=newWorkBook();
WorkSheetworkSheet=newWorkSheet();
//newacellElementwithString"
CellElementcellElement1=newDefaultCellElement(1,1,"
//addthecellElementtotheworkSheet
workSheet.addCellElement(cellElement1);
//setthecolumnWidthof1to200px,rowHeightof1to30px
workSheet.setColumnWidth(1,200);
workSheet.setRowHeight(1,30);
//setthefontofcellElement1
Stylestyle=Style.getInstance();
FRFontfrFont=FRFont.getInstance("
Tahoma"
Font.BOLD|Font.ITALIC,20);
frFont=frFont.applyForeground(Color.red);
style=style.deriveFRFont(frFont);
//设置背景
ColorBackgroundbackground=ColorBackground.getInstance(newColor(255,255,177));
style=style.deriveBackground(background);
//设置水平居中
style=style.deriveHorizontalAlignment(Constants.CENTER);
//设置边框
style=style.deriveBorder(Constants.LINE_DASH_DOT,Color.red,Constants.LINE_DASH_DOT,Color.yellow,Constants.LINE_DASH_DOT,Color.BLUE,Constants.LINE_DASH_DOT,Color.CYAN);
cellElement1.setStyle(style);
//setthecolumnWidthof4to200px,rowHeightof5to50px
workSheet.setColumnWidth(4,200);
wb.addReport(workSheet);
returnwb;
}
结果如下图所示:
将模板通过指定打印机打印
用户在使用FineReport进行二次开发的过程中有时候需要对不同文件通过不同的打印机打印出来,比如A打印机只能打印A.TXT;
B打印机只能打印b.txt.。
得到当前报表运行环境
//设置当前报表运行环境,报表预览时需要一个运行环境
//没有WEB-INF目录时,路径设置为null.FRContext.setCurrentEnv(newLocalEnv(null));
WorkBookTemplatewbTpl=FRContext.getCurrentEnv().readTemplate("
stuff.cpt"
指定打印机打印
PrintUtils.print(wbTpl.execute(null).generateReportPageSet().getTraversingCase(),false,"
SmartPrint"
package.fr.demo;
import.fr.base.FRContext;
import.fr.base.dav.LocalEnv;
import.fr.base.print.PrintUtils;
import.fr.report.WorkBookTemplate;
/**
*演示如何将模板通过指定打印机打印
*
*authoredgarduan
*version6.5
*/
publicclassPrintDemo{
publicstaticvoidmain(String[]args){
//报表运行环境路径,WEB-INF目录所放的位置
try{
WorkBookTemplatewbTpl=FRContext.getCurrentEnv().readTemplate("
//null为模板需要传的参数,false为是否弹出提示窗口,SmartPrint为打印机名称PrintUtils.print(wbTpl.execute(null).generateReportPageSet().getTraversingCase(),false,"
自定义函数
FineReport已经提供了大量的自带函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,但这些函数必须满足FineReport函数定义规则。
FineReport函数定义规则:
Functionname(Para,Para,...),其中Functionname为函数名,Para为参数。
函数原理
在FineReport中,每一个函数都被定义成一个类,这个类必须要实现Function这个接口,在运算的时候首先通过函数名反射取得这个类,然后调用它的run(Object[]agrs)方法。
下面以SUM这个函数为例。
/*
*Copyright(c)2001-2008,FineReportInc,AllRightsReserved.
*/
package.fr.report.script.function;
import.fr.report.script.NormalFunction;
import.fr.report.script.core.FArray;
import.fr.report.script.core.FunctionHelper;
*Function.
publicclassSUMextendsNormalFunction{
/**
*Runthefunctiononthestack.Popstheargumentsfromthestack,
*thenreturntheresult.
publicObjectrun(Object[]args){
doubleresult=0;
for(inti=0;
i<
args.length;
i++){
//p:
需要先判断是否为null.
if(args[i]==null){
continue;
}
result+=parseObject(args[i]);
returnFunctionHelper.parsePrimitiveDouble(result);
/*
*把Object转成double类型的值
privatedoubleparseObject(Objectobj){
if(objinstanceofNumber){
return((Number)obj).doubleValue();
}elseif(objinstanceofBoolean){
return((Boolean)obj).booleanValue()?
1:
0;
}elseif(objinstanceofFArray){
FArrayarray=(FArray)obj;
doublesum=0;
for(inti=0,len=array.length();
len