前言
公司老项目需要添加关于jasperreports打印功能,刚好有一个maven项目有类似的功能,所以做了下代码迁移。本人项目相关环境 JavaWeb项目+struts2,在这其中遇到的一些问题做下汇总。希望对大家有所帮助。
总结
异常1.java.lang.NoSuchMethodError问题
一般这样的都是缺少相关的jar,这里也给出本人使用的相关的jar。
commons-collections-3.2.1.jar
commons-digester.jar
commons-beanutils.jar
commons-lang-2.0.jar
commons-lang3-3.4.jar
commons-logging-1.0.4.jar
jackson-core-2.3.2.jar
jackson-databind-2.3.2.jar
commons-io-2.5.jar
jackson-core-2.3.2.jar
jackson-databind-2.3.2.jar
-- 生成PDF相关
itext-asian-5.2.0.jar
itextpdf-5.5.0.jar
itext-pdfa-5.5.7.jar
-- reports相关
jasperreports-6.0.0.jar
groovy-all-2.0.1.jar
如何找不到相关的jar,建议去https://mvnrepository.com/ 这里面。下面给出示例。
异常2. java.lang.ExceptionInInitializerError问题
Tomcat启动第一次尝试报java.lang.ExceptionInInitializerError .....
第二次尝试报错无法初始化类net.sf.jasperreports.engine.util.JRStyledTextParser
方案1:这是无头模式问题,需要将java.awt.headless属性设置为true
static { System.setProperty("java.awt.headless", "true"); }
通过将tomcat启动命令中的无头属性设置为 -Djava.awt.headless=true。
方案2:Tomcat目录中没有temp文件夹,由于Font.java中,会创建临时文件:
Files.createTempFile("+~JF", ".tmp").toFile();
这里手动创建一个就OK了
这里给出其他问题的解决方式,供大家参考!
https://xbuba.com/questions/4998762
相关代码:
package com.toshiba.tce.popup.vo;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.Collection;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContextException;
import net.sf.jasperreports.engine.JRAbstractExporter;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.base.JRBaseReport;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.export.JExcelApiExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporter;
import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXmlExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleXlsxReportConfiguration;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
/**
* jasperreports 工具类
*
*/
public class JasperHelper {
private static Logger logger = Logger.getLogger(JasperHelper.class);
public static final String PRINT_TYPE = "print";
public static final String PDF_TYPE = "pdf";
public static final String EXCEL_TYPE = "excel";
public static final String HTML_TYPE = "html";
public static final String WORD_TYPE = "word";
public static void prepareReport(JasperReport jasperReport, String type) {
logger.debug("The method======= prepareReport() start.......................");
/*
* 如果导出的是excel,则需要去掉周围的margin
*/
if ("excel".equals(type))
try {
Field margin = JRBaseReport.class.getDeclaredField("leftMargin");
margin.setAccessible(true);
margin.setInt(jasperReport, 0);
margin = JRBaseReport.class.getDeclaredField("topMargin");
margin.setAccessible(true);
margin.setInt(jasperReport, 0);
margin = JRBaseReport.class.getDeclaredField("bottomMargin");
margin.setAccessible(true);
margin.setInt(jasperReport, 0);
Field pageHeight = JRBaseReport.class.getDeclaredField("pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(jasperReport, 2147483647);
} catch (Exception exception) {
}
}
/**
* 导出excel
*/
public static void exportExcel(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
HttpServletResponse response) throws IOException, JRException {
/*
* 设置头信息
*/
response.setContentType("application/vnd.ms-excel");
String defaultname = null;
if (defaultFilename.trim() != null && defaultFilename != null) {
defaultname = defaultFilename + ".xls";
} else {
defaultname = "export.xls";
}
String fileName = HttpUtil.encodeFilename(defaultname, request);
response.setHeader("Content-Disposition",
"attachment; filename=\"" + fileName + "\"");
ServletOutputStream ouputStream = response.getOutputStream();
JRXlsxExporter exporter = new JRXlsxExporter();
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(ouputStream));
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
configuration.setRemoveEmptySpaceBetweenRows(Boolean.TRUE);
configuration.setOnePagePerSheet(Boolean.TRUE);
configuration.setWhitePageBackground(Boolean.FALSE);
exporter.setConfiguration(configuration);
exporter.exportReport();
ouputStream.flush();
ouputStream.close();
}
/**
* 导出excel
*/
public static void exportExcel(JasperPrint jasperPrint,String filename) throws IOException, JRException {
OutputStream outputStream = FileUtils.openOutputStream(new File(filename));
JRXlsxExporter exporter = new JRXlsxExporter();
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
configuration.setRemoveEmptySpaceBetweenRows(Boolean.TRUE);
configuration.setOnePagePerSheet(Boolean.TRUE);
configuration.setWhitePageBackground(Boolean.FALSE);
exporter.setConfiguration(configuration);
// exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
//
// exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
// exporter.setParameter(JRXlsxExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); // 删除记录最下面的空行
//
// exporter.setParameter(JRXlsxExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);// 删除多余的ColumnHeader
// //
// exporter.setParameter(JRXlsxExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);// 显示边框
exporter.exportReport();
outputStream.flush();
outputStream.close();
}
public static enum DocType {
PDF, HTML, XLS, XML, RTF
}
public static JRAbstractExporter getJRExporter(DocType docType) {
JRAbstractExporter exporter = null;
switch (docType) {
case PDF:
exporter = new JRPdfExporter();
break;
case HTML:
exporter = new JRHtmlExporter();
break;
case XLS:
exporter = new JExcelApiExporter();
break;
case XML:
exporter = new JRXmlExporter();
break;
case RTF:
exporter = new JRRtfExporter();
break;
}
return exporter;
}
/**
* 导出html
*/
private static void exportHtml(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
HttpServletResponse response) throws IOException, JRException {
response.setContentType("text/html");
ServletOutputStream ouputStream = response.getOutputStream();
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
exporter.exportReport();
ouputStream.flush();
ouputStream.close();
}
/**
* 导出html
*/
private static void exportHtml(JasperPrint jasperPrint, String filename) throws IOException, JRException {
OutputStream outputStream = FileUtils.openOutputStream(new File(filename));
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
exporter.exportReport();
outputStream.flush();
outputStream.close();
}
/**
* 导出pdf,注意此处中文问题,
*
* 这里应该详细说:主要在ireport里变下就行了。看图
*
* 1)在ireport的classpath中加入iTextAsian.jar 2)在ireport画jrxml时,看ireport最左边有个属性栏。
*
* 下边的设置就在点字段的属性后出现。 pdf font name :STSong-Light ,pdf encoding :UniGB-UCS2-H
*/
private static void exportPdf(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
HttpServletResponse response) throws IOException, JRException {
response.setContentType("application/pdf");
String defaultname = null;
if (defaultFilename.trim() != null && defaultFilename != null) {
defaultname = defaultFilename + ".pdf";
} else {
defaultname = "export.pdf";
}
// String fileName = new String(defaultname.getBytes("GBK"), "ISO8859_1");
String fileName = HttpUtil.encodeFilename(defaultname, request);
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
ServletOutputStream ouputStream = response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, ouputStream);
ouputStream.flush();
ouputStream.close();
}
/**
* 导出pdf,注意此处中文问题,
*
* 这里应该详细说:主要在ireport里变下就行了。看图
*
* 1)在ireport的classpath中加入iTextAsian.jar 2)在ireport画jrxml时,看ireport最左边有个属性栏。
*
* 下边的设置就在点字段的属性后出现。 pdf font name :STSong-Light ,pdf encoding :UniGB-UCS2-H
*/
private static void exportPdf(JasperPrint jasperPrint, String fileName) throws IOException, JRException {
JasperExportManager.exportReportToPdfFile(jasperPrint, fileName);
}
/**
* 导出word
*/
private static void exportWord(JasperPrint jasperPrint, String defaultFilename, HttpServletRequest request,
HttpServletResponse response) throws JRException, IOException {
response.setContentType("application/msword;charset=utf-8");
String defaultname = null;
if (defaultFilename.trim() != null && defaultFilename != null) {
defaultname = defaultFilename + ".doc";
} else {
defaultname = "export.doc";
}
// String fileName = new String(defaultname.getBytes("GBK"), "utf-8");
String fileName = HttpUtil.encodeFilename(defaultname, request);
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
ServletOutputStream outputStream = response.getOutputStream();
JRExporter exporter = new JRRtfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
exporter.exportReport();
outputStream.flush();
outputStream.close();
}
/**
* 导出word
*/
private static void exportWord(JasperPrint jasperPrint, String filename) throws JRException, IOException {
OutputStream outputStream = FileUtils.openOutputStream(new File(filename));
JRExporter exporter = new JRRtfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
exporter.exportReport();
outputStream.flush();
outputStream.close();
}
/**
* 按照类型导出不同格式文件
*
* @param datas
* 数据
* @param type
* 文件类型
* @param is
* jasper文件的来源
* @param request
* @param response
* @param defaultFilename默认的导出文件的名称
*/
public static void export(String type, String defaultFilename, File is, HttpServletRequest request,
HttpServletResponse response, Map parameters, Connection conn) {
try {
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
prepareReport(jasperReport, type);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
if (EXCEL_TYPE.equals(type)) {
exportExcel(jasperPrint, defaultFilename, request, response);
} else if (PDF_TYPE.equals(type)) {
exportPdf(jasperPrint, defaultFilename, request, response);
} else if (HTML_TYPE.equals(type)) {
exportHtml(jasperPrint, defaultFilename, request, response);
} else if (WORD_TYPE.equals(type)) {
exportWord(jasperPrint, defaultFilename, request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void export(String type, String defaultFilename, File is, HttpServletRequest request,
HttpServletResponse response, Map parameters, JRDataSource conn) {
try {
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
prepareReport(jasperReport, type);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
if (EXCEL_TYPE.equals(type)) {
exportExcel(jasperPrint, defaultFilename, request, response);
} else if (PDF_TYPE.equals(type)) {
exportPdf(jasperPrint, defaultFilename, request, response);
} else if (HTML_TYPE.equals(type)) {
exportHtml(jasperPrint, defaultFilename, request, response);
} else if (WORD_TYPE.equals(type)) {
exportWord(jasperPrint, defaultFilename, request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 下载
* @param type
* @param defaultFilename
* @param is
* @param request
* @param response
* @param parameters
* @param reportDataValue
*/
public static void export(String type, String defaultFilename, String url, HttpServletRequest request,
HttpServletResponse response, Map parameters, Object reportDataValue) {
try {
JasperReport jasperReport = loadReport(url);
prepareReport(jasperReport, type);
JasperPrint jasperPrint = null;
if (reportDataValue instanceof DataSource) {
DataSource jdbcDataSourceToUse = (DataSource) reportDataValue;
Connection conn = jdbcDataSourceToUse.getConnection();
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
}
else {
JRDataSource jrDataSource = convertReportData(reportDataValue);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
}
if (EXCEL_TYPE.equals(type)) {
exportExcel(jasperPrint, defaultFilename, request, response);
} else if (PDF_TYPE.equals(type)) {
exportPdf(jasperPrint, defaultFilename, request, response);
} else if (HTML_TYPE.equals(type)) {
exportHtml(jasperPrint, defaultFilename, request, response);
} else if (WORD_TYPE.equals(type)) {
exportWord(jasperPrint, defaultFilename, request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 导出到文件
* @param type
* @param filename
* @param url
* @param parameters
* @param reportDataValue
*/
public static void export(String type, String filename, String url, Map parameters, Object reportDataValue) {
try {
JasperReport jasperReport = loadReport(url);
prepareReport(jasperReport, type);
JasperPrint jasperPrint = null;
if (reportDataValue instanceof DataSource) {
DataSource jdbcDataSourceToUse = (DataSource) reportDataValue;
Connection conn = jdbcDataSourceToUse.getConnection();
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
}
else {
JRDataSource jrDataSource = convertReportData(reportDataValue);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
}
if (EXCEL_TYPE.equals(type)) {
exportExcel(jasperPrint, filename);
} else if (PDF_TYPE.equals(type)) {
exportPdf(jasperPrint, filename);
} else if (HTML_TYPE.equals(type)) {
exportHtml(jasperPrint, filename);
} else if (WORD_TYPE.equals(type)) {
exportWord(jasperPrint, filename);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 显示
* @param type
* @param defaultFilename
* @param is
* @param request
* @param response
* @param parameters
* @param reportDataValue
*/
public static void show(String type, String defaultFilename, String url, HttpServletRequest request,
HttpServletResponse response, Map parameters, Object reportDataValue) {
try {
JasperReport jasperReport = loadReport(url);
prepareReport(jasperReport, type);
JasperPrint jasperPrint = null;
if (reportDataValue instanceof DataSource) {
DataSource jdbcDataSourceToUse = (DataSource) reportDataValue;
Connection conn = jdbcDataSourceToUse.getConnection();
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
}
else {
JRDataSource jrDataSource = convertReportData(reportDataValue);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
}
if (EXCEL_TYPE.equals(type)) {
exportExcel(jasperPrint, defaultFilename, request, response);
} else if (PDF_TYPE.equals(type)) {
showPdf(jasperPrint, defaultFilename, request, response);
} else if (HTML_TYPE.equals(type)) {
showHtml(jasperPrint, defaultFilename, request, response);
} else if (WORD_TYPE.equals(type)) {
exportWord(jasperPrint, defaultFilename, request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static JRDataSource convertReportData(Object value) throws IllegalArgumentException {
if (value instanceof JRDataSource) {
return (JRDataSource) value;
}
else if (value instanceof Collection) {
return new JRBeanCollectionDataSource((Collection) value);
}
else if (value instanceof Object[]) {
return new JRBeanArrayDataSource((Object[]) value);
}
else {
throw new IllegalArgumentException("Value [" + value + "] cannot be converted to a JRDataSource");
}
}
/**
* Loads a {@code JasperReport} from the specified {@code Resource}.
* If the {@code Resource} points to an uncompiled report design file then
* the report file is compiled dynamically and loaded into memory.
* @param resource the {@code Resource} containing the report definition or design
* @return a {@code JasperReport} instance
*/
protected static final JasperReport loadReport(String filename) {
try {
if (filename != null) {
if (filename.endsWith(".jasper")) {
// Load pre-compiled report.
if (logger.isInfoEnabled()) {
logger.info("Loading pre-compiled Jasper Report from " + filename);
}
InputStream is = FileUtils.openInputStream(new File(filename));
try {
return (JasperReport) JRLoader.loadObject(is);
}
finally {
is.close();
}
}
else if (filename.endsWith(".jrxml")) {
// Compile report on-the-fly.
if (logger.isInfoEnabled()) {
logger.info("Compiling Jasper Report loaded from " + filename);
}
InputStream is = FileUtils.openInputStream(new File(filename));
try {
JasperDesign design = JRXmlLoader.load(is);
return JasperCompileManager.compileReport(design);
}
finally {
is.close();
}
}
}
throw new IllegalArgumentException(
"Report filename [" + filename + "] must end in either .jasper or .jrxml");
}
catch (IOException ex) {
throw new ApplicationContextException(
"Could not load JasperReports report from " + filename, ex);
}
catch (JRException ex) {
throw new ApplicationContextException(
"Could not parse JasperReports report from " + filename, ex);
}
}
/**
* 输出html静态页面,必须注入request和response
*
* @param jasperPath
* @param params
* @param sourceList
* @param imageUrl
* 报表文件使用的图片路径,比如 ../servlets/image?image=
* @throws JRException
* @throws IOException
* @throws ServletException
*/
public static void showHtml(JasperPrint jasperPrint,String defaultFilename, HttpServletRequest request,
HttpServletResponse response) throws JRException, IOException {
request.setCharacterEncoding("utf-8");
//response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
JRAbstractExporter exporter = getJRExporter(DocType.HTML);
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
PrintWriter out = response.getWriter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
exporter.exportReport();
out.flush();
}
public static void showPdf(JasperPrint jasperPrint,String defaultFilename, HttpServletRequest request,
HttpServletResponse response) throws JRException, IOException {
request.setCharacterEncoding("utf-8");
//response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
response.setContentType("application/pdf");
JRAbstractExporter exporter = getJRExporter(DocType.PDF);
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
PrintWriter out = response.getWriter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
exporter.exportReport();
out.flush();
}
}