JasperReport和iReport是不错的Java报表工具. 在实际项目中, 本人用它们开发了20个Report, 涉及SubReport, Image, Graph, 积累了一些经验. 尤其是关于Export到Excel方面, 文档上也很少提及, 纯粹是摸索出来的, 有的问题还是通过读源代码才解决的. 此贴并非入门教程, 差不多算是笔记吧, 以问答形式记录. /** Title: ReportProviderServlet Description: Servlet to generate Jasper reports Copyright: Copyright (c) 2004 Company: ***** import net.sf.jasperreports.engine.*; import org.apache.log4j.*; import java.io.*; import java.sql.*; import java.util.*; import javax.servlet.*; //Initialize: Setup DataSourceManager DataSourceManager.configure(prefix + file); log.info("initialized successfully!"); //Process the HTTP request log.debug("Running Report:" + reportClass); boolean isExcelFormat = false; if (reportClass == null) String reportFormat = request.getParameter("reportFormat"); if (reportFormat == null) try //set ReprintHeaderOnEachPage=false for Excel Format if (isExcelFormat) margin = JRBaseReport.class.getDeclaredField("topMargin"); margin = JRBaseReport.class.getDeclaredField("bottomMargin"); java.lang.reflect.Field pageHeight = JRBaseReport.class.getDeclaredField( //Don't print group header on each page Map params = new HashMap(10); while (enu.hasMoreElements()) log.debug("Before Filling"); OutputStream httpOut = response.getOutputStream(); Connection conn = DataSourceManager.getConnection(request.getSession()); JasperPrint rptPnt = JasperManager.fillReport(myRpt, params, conn); conn.close(); if (reportFormat.equalsIgnoreCase("jasperPrint")) JRXlsExporter exporter = new JRXlsExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt); Map imagesMap = new HashMap(); request.getSession().setAttribute("IMAGES_MAP", imagesMap); exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, exporter.exportReport(); log.debug("Report Exported"); /** Title: JRDataSourceAdapter Description: Converting JRDataSource to Mapped ArrayList Copyright: Copyright (c) 2004 Company: ***** import net.sf.jasperreports.engine.*; import java.util.*; if (fieldNames.length != fieldClasses.length) JRDesignField[] fields = new JRDesignField[fieldNames.length]; result = new HashMap(4); for (int i = 0; i < fieldNames.length; i++) do return result; /** Title: GraphProvider Description: Generate JFreeChart Image Copyright: Copyright (c) 2004 Company: **** import net.sf.jasperreports.engine.*; import org.jfree.chart.*; import org.jfree.data.*; import java.awt.*; import java.io.*; import java.util.*; JRDesignField fieldY = new JRDesignField(); ArrayList periods = (ArrayList) dataSource.get(fieldNameX); DefaultCategoryDataset categoryDs = new DefaultCategoryDataset(); for (int i = 0; i < values.size(); i++) if (obj != null) categoryDs.addValue(dataValue, null, (String) periods.get(i)); JFreeChart c = null; if (isBarChart) c.getTitle().setFont(new Font("Arial", Font.BOLD, 16)); NumberAxis axis = (NumberAxis) c.getCategoryPlot().getRangeAxis(); TickUnitSource tickUnits = NumberAxis.createIntegerTickUnits(); return (c.createBufferedImage(imageWidth, imageHeight)); }
.....
Boolean.TRUE);
java.lang.reflect.Field margin = JRBaseReport.class.getDeclaredField(
"leftMargin");
margin.setAclearcase/" target="_blank" >ccessible(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);
"pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(myRpt, Integer.MAX_VALUE);
*
*
*
*
* @author zephyr
* @version 1.0
*/
package xyz;
import net.sf.jasperreports.engine.base.*;
import net.sf.jasperreports.engine.export.*;
import net.sf.jasperreports.engine.util.*;
import javax.servlet.http.*;
public class ReportProviderServlet extends HttpServlet
{
private static Logger log = LogManager.getLogger(ReportProviderServlet.class);
public void init() throws javax.servlet.ServletException
{
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("data-source-file");
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String reportClass = request.getParameter("reportClass");
{
throw new IllegalArgumentException("Jasper Class Unspecified");
}
{
reportFormat = "jasperPrint";
}
{
JasperReport myRpt = JasperManager.loadReport(this.getClass()
.getResourceAsStream("/jasperReports/" +
reportClass + ".jasper"));
isExcelFormat = reportFormat.equalsIgnoreCase("excel");
{
//use reflect to set the private field of JRBaseReport
//No margin for excel format, max pageHeight
java.lang.reflect.Field margin = JRBaseReport.class.getDeclaredField(
"leftMargin");
margin.setAccessible(true);
margin.setInt(myRpt, 0);
margin.setAccessible(true);
margin.setInt(myRpt, 0);
margin.setAccessible(true);
margin.setInt(myRpt, 0);
"pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(myRpt, Integer.MAX_VALUE);
if (null != myRpt.getGroups())
{
for (int i = 0; i < myRpt.getGroups().length; i++)
{
myRpt.getGroups()[i].setReprintHeaderOnEachPage(false);
}
}
}
Enumeration enu = request.getParameterNames();
{
String key = (String) enu.nextElement();
params.put(key,
request.getParameter(key).toUpperCase().replaceAll("'", "''"));
log.debug(key + "=" + request.getParameter(key));
}
{
response.setContentType("application/octet-stream");
JRSaver.saveObject(rptPnt, httpOut);
}
else if (reportFormat.equalsIgnoreCase("pdf"))
{
response.setContentType("application/pdf");
response.setHeader("Content-Disposition",
"attachment;filename=\"" + reportClass + ".PDF\"");
JasperManager.printReportToPdfStream(rptPnt, httpOut);
}
else if (reportFormat.equalsIgnoreCase("excel"))
{
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment;filename=\"" + reportClass + ".XLS\"");
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();
}
else if (reportFormat.equalsIgnoreCase("html"))
{
JRHtmlExporter exporter = new JRHtmlExporter();
response.setContentType("text/html");
imagesMap);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI,
"image.jsp image=");
exporter.setParameter(JRExporterParameter.JASPER_PRINT, rptPnt);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, httpOut);
}
}
catch (Exception ex)
{
log.error("Error Occured", ex);
}
}
}
*
*
*
*
* @author zephyr
* @version 1.0
*/
package xyz;
import net.sf.jasperreports.engine.design.*;
public class JRDataSourceAdapter
{
public static Map JRDataSource2Map(JRDataSource dataSource, String[] fieldNames,
Class[] fieldClasses) throws JRException
{
HashMap result;
{
throw new JRException("Number of Field Name & Class unmatch");
}
{
fields[i] = new JRDesignField();
fields[i].setName(fieldNames[i]);
fields[i].setValueClass(fieldClasses[i]);
result.put(fieldNames[i], new ArrayList());
}
{
for (int i = 0; i < fields.length; i++)
{
Object value = dataSource.getFieldValue(fields[i]);
((ArrayList) result.get(fields[i].getName())).add(value);
}
}
while (dataSource.next());
}
}
*
*
*
*
* @author zephyr
* @version 1.0
*/
package xyz;
import net.sf.jasperreports.engine.design.*;
import net.sf.jasperreports.engine.export.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.*;
import java.awt.image.*;
public class GraphProvider
{
public static Image getImage(Map dataSource, String fieldNameX, String fieldNameY,
String chartName, String titleX, String titleY, boolean isBarChart, int imageWidth,
int imageHeight) throws JRException
{
JRDesignField fieldX = new JRDesignField();
fieldX.setName(fieldNameX);
fieldX.setValueClass(java.lang.String.class);
fieldY.setName(fieldNameY);
fieldY.setValueClass(java.lang.Double.class);
ArrayList values = (ArrayList) dataSource.get(fieldNameY);
{
Object obj = values.get(i);
double dataValue = 0;
{
dataValue = ((Double) obj).doubleValue();
}
}
{
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);
}
axis.setAutoRange(true);
axis.setStandardTickUnits(tickUnits);
}