|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
轮性能微软曾做过一个例子,就是同一个项目用java和.net来作,结果开发周期,.net是java的一半,性能java是.net的十分之一,代码量java是.net的三倍。呵呵,这说明了什么,.net的全方位比java好。但是有的人说.net不能跨平台,这个问题我和我同学曾讨论过,都认为微软的.net很可能早都可以跨平台了,但是微软为了保护他们的操作系统,所以才没有推出跨平台的.net,只是推出了跨语言的.net,JasperReport和iReport是不错的Java报表工具.在实践项目中,自己用它们开辟了20个Report,触及SubReport,Image,Graph,堆集了一些履历.特别是关于Export到Excel方面,文档上也很少说起,地道是探索出来的,有的成绩仍是经由过程读源代码才办理的.此贴并不是进门教程,差未几算是条记吧,以问答情势纪录.
iReport
安装
下载,解压iReport0.4.0(保举src版本)
确认JDK是1.4以上
把JDK/lib下的tools.jar拷贝到{ireport_home}/lib目次中
运转
关于下载的Binary版本,只能运转/bin/startup.bat
关于下载的Src版本,能够经由过程antiReport运转(先安装ant)
假如运转startup.bat,呈现java.lang.NoSuchMethodError毛病,通常为JDK版本太低。假如确认已安装了1.4或以上,反省path体系变量,看看有1.3的JRE是否是排在后面(好比安装了Oracle的客户端,常常有1.3的JRE),假如呈现ClassNotFound,反省classpath。关于经由过程ant的体例运转,一样平常都没甚么成绩,以是保举下载src版本
JasperReport罕见成绩
.jrxmlvs.jasper
假如在运转时载进.jrxml,那末每次挪用还得编译,不如事后编译成.jasper.不外事后编译的jasper,必需用一样版本的JasperReport载进,并且天真性差些.不外关于年夜部分报表,仍是事后编译成jasper便利
假如批量编译jrxml
用Ant很简单办理
.....
怎样利用图片?
很简单,用Image控件就能够了.在ImageExpress内里能够用String来暗示图片的路径,大概用InputStream,File对象.不外不论用File仍是String对象,都不能不用相对路径,这明显很不天真.办理举措是,穿进一个$P的参数,暗示图片地点的目次,然后用$P和文件名拼接出完全的相对路径.更好的办法是用InputStream,比方this.getClass().getResourceAsStream("logo.jpg"),这时候只需把图片放在以后.jasper地点的目次就能够了,不用思索甚么参数,甚么路径了
显现非数据库字段变量
显现如运转日期等,能够间接在TextField内里输出newjava.util.Date(),然后把Pattern设成如mm/dd/yyyy.
静态把持某些Field是不是显现
每一个StaticText,TextField乃至全部Band的属性内里都有PrintWhenExpression,好比设成newBoolean(!$P{isDisplay}.equalsIgnoreCase("yes")),那末只要当参数display的值为yes的时分才显现
利用SubReport,怎样利用绝对路径
见1.3,和利用图片相似,用InputStream大概传进参数
Query内里怎样利用参数
$P!{xxx}大概$P{xxx}后者只能用于相似PreparedStatement参数绑定,而前者可交换Sql的恣意部分.在必要静态排序的时分,前者出格有效.好比selecta,b,cfromtorderby$P!{orderClause}不论用$P仍是$P!,SQL终极是以PreparedStatement体例实行的,不用太忧虑功能成绩注重:参数是不克不及嵌套的,好比$P{a}=$P{b},$P{b}=value,不要期望$P{a}能被交换成value
怎样利用图表(Graph)
JasperReport自己没有图表功效,只要显现Image的功效(见4.3).iReport里有个Graph导游,实在质是经由过程jFreeChart天生Image.更别的,更间接的做法是放一个Image控件,ImageExpressClass设置成java.awt.Image,在ImageExpression里经由过程自界说的类前往java.awt.Image对象.比方GraphProvider.getImage($P{REPORT_DATASOURCE},title,subtitle.....).GraphProvider是本人的类,publicstaticImagegetImage(JRDataSource,....)
假如显现多个图表
在一张报表上显现一个图表和显现多个图表是分歧的.假定Query是selectname,price,qtyfromxxx,第一张图显现name-price,第二张图显现name-qty,假如仍是按3.8的办法,第二张图基本显现不出来!为何由于传进的是JRDataSource,而JRDataSource仅仅是对ResultSet的复杂封装,在第一张图处置完后,游标已到了eof地位了,在入手下手处置第二张图的时分,就一定抛出游标耗尽的非常!怎样办本人写个JRDataSourceAdapter,把JRDataSource对象内里的值事后保留到一个Collection(相称于一个Offline的数据集),然后把这个Collection传个getImage办法.详细是,建一个Variablemydate,范例是java.util.Map,CalculationType-System,InitialValueExpression是JRDataSourceAdapter.JRDataSource2Map($P{REPORT_DATA_SOURCE},newString[]{"NAME","PRICE","QTY"},newClass[]{java.lang.String.class,java.lang.Double.class,java.lang.Double.class}),JRDataSource2Map是本人写的一个Adapter.然后在Image的Expression内里换成如GraphProvider.getImage(mydata,title,otherparams...),固然得修正getImage办法
Export到Excel的成绩
怎样往失落报表优等
间接把不必要的Band删除(把其高度设为0).假如仅仅是export到Excel的时分不必要报表头,而输入到PDF等仍旧必要保存,那末利用printwhenexpression,见4.4
假如让Excel看起来划一
不要有空缺中央!起首把一切的Field设成一样高,对齐!把地点Band的高度也设成和Field一样高,让Field恰好放进Band.然后调剂Field的宽度,让每一个Field都相邻,没有清闲.最初,记得设置参数:exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
Boolean.TRUE);
怎样保存GridLine
起首,设置参数exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);然后,把每一个Field大概StaticText框的Transparent属性都勾上
怎样使字段名只显现一次
假如把字段名放在ColumnHead地区,那末输入到Excel,会每一个Page都显现一遍.在计划Report时分,一样平常会设定Page巨细.但是关于Excel,这个Page设定仍旧存在,并且常常很厌恶,由于在Excel里,一般但愿失掉一连的数据,但是Jasper仍旧会自作多情举行分页.好比说,计划JasperReport的时分,设定pagesize为Letter,Portrait,那末输入到Excel的时分每隔约莫30行(详细取决于Field的高度),pageheader,columnheader,columnfoot,pagefoot会被反复一次,并且还附带一个高度为0的ExcelRow,暗示PageBreak的中央.把字段名放在titleband里,能够办理字段名反复的成绩,固然pageheader也不要显现了.假如必要,能够把titleband的printwhenexpression设成只要输入Excel的时分才显现
为何Excel内里的数据是从第二行,第B列入手下手显现的
由于第一行和第A列分离是用来暗示pagetopmargin和pageleftmargin的.关于Excel来讲,地道过剩.办理办法是把pagemargin设成0.不外假如这个report还必要以PDF等显现,那末设成0就欠好看了.最好能静态的改动pagemargin.固然,这个改动只能在内部(挪用Report的中央)举行,在计划Report的时分是力所不及的.不幸的是,JasperReport类竟然没有setMargin的办法,只要getter.折衷的办法只能是reflect了.代码表示以下://usereflecttosettheprivatefieldofJRBaseReport
java.lang.reflect.Fieldmargin=JRBaseReport.class.getDeclaredField(
"leftMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);margin=JRBaseReport.class.getDeclaredField("topMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);margin=JRBaseReport.class.getDeclaredField("bottomMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);
怎样往失落Excel中埋没的行
如前说述,因为pagebreak的干系,Excel中每隔几十行,就有一个高度为0的row,即便把pagebotommargin设为0,把pagefooter往失落都没有举措.独一的办理举措是把pageheight设为很年夜.同5.5一样,不能不利用reflect:
java.lang.reflect.FieldpageHeight=JRBaseReport.class.getDeclaredField(
"pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(myRpt,Integer.MAX_VALUE);
文档
那里有文档
JasperReport有份UltimateGuide,不外不是收费的,和jFreeChart一个品德.不外网上有传播,写的还能够,60多页,不外也没具体到那里往.假如下载源代码版,那末看看自带的Demo也不错.SF的论坛也是问成绩的最好中央
源代码仅供参考(reportProvider--一个Servlet,GraphProider,JRDataAdapter都是一般类)
/**
*
Title:ReportProviderServlet
*
Description:ServlettogenerateJasperreports
*
Copyright:Copyright(c)2004
*
Company:*****
*@authorzephyr
*@version1.0
*/
packagexyz;
importnet.sf.jasperreports.engine.*;
importnet.sf.jasperreports.engine.base.*;
importnet.sf.jasperreports.engine.export.*;
importnet.sf.jasperreports.engine.util.*;
importorg.apache.log4j.*;
importjava.io.*;
importjava.sql.*;
importjava.util.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassReportProviderServletextendsHttpServlet
{
privatestaticLoggerlog=LogManager.getLogger(ReportProviderServlet.class);
//Initialize:SetupDataSourceManager
publicvoidinit()throwsjavax.servlet.ServletException
{
Stringprefix=getServletContext().getRealPath("/");
Stringfile=getInitParameter("data-source-file");
DataSourceManager.configure(prefix+file);
log.info("initializedsuccessfully!");
}
//ProcesstheHTTPrequest
publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException
{
StringreportClass=request.getParameter("reportClass");
log.debug("RunningReport:"+reportClass);
booleanisExcelFormat=false;
if(reportClass==null)
{
thrownewIllegalArgumentException("JasperClassUnspecified");
}
StringreportFormat=request.getParameter("reportFormat");
if(reportFormat==null)
{
reportFormat="jasperPrint";
}
try
{
JasperReportmyRpt=JasperManager.loadReport(this.getClass()
.getResourceAsStream("/jasperReports/"+
reportClass+".jasper"));
//setReprintHeaderOnEachPage=falseforExcelFormat
isExcelFormat=reportFormat.equalsIgnoreCase("excel");
if(isExcelFormat)
{
//usereflecttosettheprivatefieldofJRBaseReport
//Nomarginforexcelformat,maxpageHeight
java.lang.reflect.Fieldmargin=JRBaseReport.class.getDeclaredField(
"leftMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);
margin=JRBaseReport.class.getDeclaredField("topMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);
margin=JRBaseReport.class.getDeclaredField("bottomMargin");
margin.setAccessible(true);
margin.setInt(myRpt,0);
java.lang.reflect.FieldpageHeight=JRBaseReport.class.getDeclaredField(
"pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(myRpt,Integer.MAX_VALUE);
//Dontprintgroupheaderoneachpage
if(null!=myRpt.getGroups())
{
for(inti=0;i<myRpt.getGroups().length;i++)
{
myRpt.getGroups()[i].setReprintHeaderOnEachPage(false);
}
}
}
Mapparams=newHashMap(10);
Enumerationenu=request.getParameterNames();
while(enu.hasMoreElements())
{
Stringkey=(String)enu.nextElement();
params.put(key,
request.getParameter(key).toUpperCase().replaceAll("",""));
log.debug(key+"="+request.getParameter(key));
}
log.debug("BeforeFilling");
OutputStreamhttpOut=response.getOutputStream();
Connectionconn=DataSourceManager.getConnection(request.getSession());
JasperPrintrptPnt=JasperManager.fillReport(myRpt,params,conn);
conn.close();
if(reportFormat.equalsIgnoreCase("jasperPrint"))
{
response.setContentType("application/octet-stream");
JRSaver.saveObject(rptPnt,httpOut);
}
elseif(reportFormat.equalsIgnoreCase("pdf"))
{
response.setContentType("application/pdf");
response.setHeader("Content-Disposition",
"attachment;filename=""+reportClass+".PDF"");
JasperManager.printReportToPdfStream(rptPnt,httpOut);
}
elseif(reportFormat.equalsIgnoreCase("excel"))
{
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment;filename=""+reportClass+".XLS"");
JRXlsExporterexporter=newJRXlsExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT,rptPnt);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,httpOut);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,
Boolean.TRUE);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
Boolean.FALSE);
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,
Boolean.FALSE);
exporter.exportReport();
}
elseif(reportFormat.equalsIgnoreCase("html"))
{
JRHtmlExporterexporter=newJRHtmlExporter();
response.setContentType("text/html");
MapimagesMap=newHashMap();
request.getSession().setAttribute("IMAGES_MAP",imagesMap);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP,
imagesMap);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
"image.jspimage=");
exporter.setParameter(JRExporterParameter.JASPER_PRINT,rptPnt);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,httpOut);
exporter.exportReport();
}
log.debug("ReportExported");
}
catch(Exceptionex)
{
log.error("ErrorOccured",ex);
}
}
}
/**
*
Title:JRDataSourceAdapter
*
Description:ConvertingJRDataSourcetoMappedArrayList
*
Copyright:Copyright(c)2004
*
Company:*****
*@authorzephyr
*@version1.0
*/
packagexyz;
importnet.sf.jasperreports.engine.*;
importnet.sf.jasperreports.engine.design.*;
importjava.util.*;
publicclassJRDataSourceAdapter
{
publicstaticMapJRDataSource2Map(JRDataSourcedataSource,String[]fieldNames,
Class[]fieldClasses)throwsJRException
{
HashMapresult;
if(fieldNames.length!=fieldClasses.length)
{
thrownewJRException("NumberofFieldName&Classunmatch");
}
JRDesignField[]fields=newJRDesignField[fieldNames.length];
result=newHashMap(4);
for(inti=0;i<fieldNames.length;i++)
{
fields[i]=newJRDesignField();
fields[i].setName(fieldNames[i]);
fields[i].setValueClass(fieldClasses[i]);
result.put(fieldNames[i],newArrayList());
}
do
{
for(inti=0;i<fields.length;i++)
{
Objectvalue=dataSource.getFieldValue(fields[i]);
((ArrayList)result.get(fields[i].getName())).add(value);
}
}
while(dataSource.next());
returnresult;
}
}
/**
*
Title:GraphProvider
*
Description:GenerateJFreeChartImage
*
Copyright:Copyright(c)2004
*
Company:****
*@authorzephyr
*@version1.0
*/
packagexyz;
importnet.sf.jasperreports.engine.*;
importnet.sf.jasperreports.engine.design.*;
importnet.sf.jasperreports.engine.export.*;
importorg.jfree.chart.*;
importorg.jfree.chart.axis.*;
importorg.jfree.chart.plot.*;
importorg.jfree.data.*;
importjava.awt.*;
importjava.awt.image.*;
importjava.io.*;
importjava.util.*;
publicclassGraphProvider
{
publicstaticImagegetImage(MapdataSource,StringfieldNameX,StringfieldNameY,
StringchartName,StringtitleX,StringtitleY,booleanisBarChart,intimageWidth,
intimageHeight)throwsJRException
{
JRDesignFieldfieldX=newJRDesignField();
fieldX.setName(fieldNameX);
fieldX.setValueClass(java.lang.String.class);
JRDesignFieldfieldY=newJRDesignField();
fieldY.setName(fieldNameY);
fieldY.setValueClass(java.lang.Double.class);
ArrayListperiods=(ArrayList)dataSource.get(fieldNameX);
ArrayListvalues=(ArrayList)dataSource.get(fieldNameY);
DefaultCategoryDatasetcategoryDs=newDefaultCategoryDataset();
for(inti=0;i<values.size();i++)
{
Objectobj=values.get(i);
doubledataValue=0;
if(obj!=null)
{
dataValue=((Double)obj).doubleValue();
}
categoryDs.addValue(dataValue,null,(String)periods.get(i));
}
JFreeChartc=null;
if(isBarChart)
{
c=ChartFactory.createBarChart(chartName,titleX,titleY,categoryDs,
PlotOrientation.VERTICAL,false,false,false);
}
else
{
c=ChartFactory.createLineChart(chartName,titleX,titleY,categoryDs,
PlotOrientation.VERTICAL,false,false,false);
}
c.getTitle().setFont(newFont("Arial",Font.BOLD,16));
NumberAxisaxis=(NumberAxis)c.getCategoryPlot().getRangeAxis();
axis.setAutoRange(true);
TickUnitSourcetickUnits=NumberAxis.createIntegerTickUnits();
axis.setStandardTickUnits(tickUnits);
return(c.createBufferedImage(imageWidth,imageHeight));
}
}
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看NetBeans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。 |
|