您的位置:首页 > 编程语言 > ASP

使用jasperreport生成报表

2015-10-23 15:53 701 查看
原文地址:http://log-cd.iteye.com/blog/379531

1.ReportUtils.java通用类

Java代码


/**

* 使用jasperReport做报表时的工具支持类.有两个用途,生成jasperPrint对象,和设置导出时的session

*/

public class ReportUtils {

private HttpServletRequest request;

private HttpServletResponse response;

private HttpSession session;

public ReportUtils(HttpServletRequest request, HttpServletResponse response) {

this.request = request;

this.session = request.getSession();

this.response = response;

}

/**

* 获得JasperPrint对象;自定义填充报表时的parameter和dataSource. 参数说明和动态表头的用法参考上一方法

*/

public JasperPrint getJasperPrint(String filePath, Map parameter,

JRDataSource dataSource) throws JRException {

JasperReport jasperReport = null;

try {

jasperReport = (JasperReport) JRLoader.loadObject(filePath);

return JasperFillManager.fillReport(jasperReport, parameter,

dataSource);

} catch (JRException e) {

e.printStackTrace();

}

return null;

}

/**

* 获得JasperPrint对象;自定义填充报表时的parameter和connection

*/

public JasperPrint getJasperPrint(String filePath, Map parameter,

Connection conn) throws JRException {

JasperReport jasperReport = null;

try {

jasperReport = (JasperReport) JRLoader.loadObject(filePath);

return JasperFillManager.fillReport(jasperReport, parameter,

conn);

} catch (JRException e) {

e.printStackTrace();

}

return null;

}

/**

* 通过传入List类型数据源获取JasperPrint实例

*/

public JasperPrint getPrintWithBeanList(String filePath, Map parameter,

List list) throws JRException {

JRDataSource dataSource = new JRBeanCollectionDataSource(list);

return getJasperPrint(filePath, parameter, dataSource);

}

/**

* 传入类型,获取输出器

*

* @param docType

* @return

*/

public 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;

case CSV:

exporter = new JRCsvExporter();

break;

case TXT:

exporter = new JRTextExporter();

break;

}

return exporter;

}

/**

* 获得相应类型的Content type

* @param docType

* @return

*/

public String getContentType(DocType docType){

String contentType="text/html";

switch(docType){

case PDF:

contentType = "application/pdf";

break;

case XLS:

contentType = "application/vnd.ms-excel";

break;

case XML:

contentType = "text/xml";

break;

case RTF:

contentType = "application/rtf";

break;

case CSV:

contentType = "text/plain";

break;

}

return contentType;

}

public void setAttrToPage(JasperPrint jasperPrint, String report_fileName,

String report_type) {

session.setAttribute("REPORT_JASPERPRINT", jasperPrint);

session.setAttribute("REPORT_FILENAME", report_fileName);

session.setAttribute("REPORT_TYPE", report_type);

}

/**

* 定义了报表输出类型,固定了可输出类型

*/

public static enum DocType {

PDF, HTML, XLS, XML, RTF, CSV, TXT

}

/**

* 编译报表模板文件jrxml,生成jasper二进制文件

*

* @param jrxmlPath

* @param jrsperPath

* @throws JRException

*/

public void complieJrxml(String jrxmlPath, String jasperPath)

throws JRException {

JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);

}

/**

* 输出html静态页面,必须注入request和response

*

* @param jasperPath

* @param params

* @param sourceList

* @param imageUrl

* 报表文件使用的图片路径,比如 ../servlets/image?image=

* @throws JRException

* @throws IOException

* @throws ServletException

*/

public void servletExportHTML(String jasperPath, Map params,

List sourceList, String imageUrl) throws JRException, IOException,

ServletException {

response.setContentType("text/html");

response.setCharacterEncoding("UTF-8");

JRAbstractExporter exporter = getJRExporter(DocType.HTML);

JasperPrint jasperPrint = getPrintWithBeanList(jasperPath, params,

sourceList);

session.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.IMAGES_URI, imageUrl);

exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示px

exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);

exporter.setParameter(JRHtmlExporterParameter.BETWEEN_PAGES_HTML, "<br style='page-break-before:always;'>");

exporter.exportReport();

}

/**

* 输出html静态页面,必须注入request和response

*

* @param jasperPath

* @param params

* @param sourceList

* @param imageUrl

* 报表文件使用的图片路径,比如 ../servlets/image?image=

* @throws JRException

* @throws IOException

* @throws ServletException

*/

public void servletExportHTML(String jasperPath, Map params,

Connection conn, String imageUrl) throws JRException, IOException,

ServletException {

response.setContentType("text/html");

response.setCharacterEncoding("UTF-8");

JRAbstractExporter exporter = getJRExporter(DocType.HTML);

JasperPrint jasperPrint = getJasperPrint(jasperPath, params,

conn);

session.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.IMAGES_URI, imageUrl);

exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,false);//不显示px

exporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);

exporter.exportReport();

}

/**

* 生成不同格式报表文档

*

* @param docType

* 文档类型

* @param jasperPath

*/

public void servletExportDocument(DocType docType, String jasperPath,

Map params, List sourceList, String fileName) throws JRException,

IOException, ServletException {

if (docType == DocType.HTML) {

servletExportHTML(jasperPath, params, sourceList, fileName);

return;

}

JRAbstractExporter exporter = getJRExporter(docType);

// 获取后缀

String ext = docType.toString().toLowerCase();

if (!fileName.toLowerCase().endsWith(ext)) {

fileName += "." + ext;

}

// 判断资源类型

if (ext.equals("xls")) {

// 要想获得更好的视觉效果,可以添加以下代码

exporter.setParameter(

JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,

Boolean.TRUE); // 删除记录最下面的空行

exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,

Boolean.FALSE);// 删除多余的ColumnHeader

exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND

, Boolean.FALSE);// 显示边框

}

response.setContentType(getContentType(docType));

response.setHeader("Content-Disposition", "attachment; filename=\""

+ URLEncoder.encode(fileName, "UTF-8") + "\"");

exporter.setParameter(JRExporterParameter.JASPER_PRINT,

getPrintWithBeanList(jasperPath, params, sourceList));

OutputStream outStream = null;

PrintWriter outWriter = null;

if(ext.equals("csv")){//解决中文乱码问题

response.setCharacterEncoding("GBK");

outWriter = response.getWriter();

exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);

}else{

outStream = response.getOutputStream();

exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);

if(ext.equals("txt")){

exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80));

exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25));

exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");

}

}

try {

exporter.exportReport();

} catch (JRException e) {

throw new ServletException(e);

} finally {

if (outStream != null) {

try {

outStream.close();

} catch (IOException ex) {

}

}

}

}

/**

* 生成不同格式报表文档

*

* @param docType

* 文档类型

* @param jasperPath

*/

public void servletExportDocument(DocType docType, String jasperPath,

Map params, Connection conn, String fileName) throws JRException,

IOException, ServletException {

if (docType == DocType.HTML) {

servletExportHTML(jasperPath, params, conn, fileName);

return;

}

JRAbstractExporter exporter = getJRExporter(docType);

// 获取后缀

String ext = docType.toString().toLowerCase();

if (!fileName.toLowerCase().endsWith(ext)) {

fileName += "." + ext;

}

// 判断资源类型

if (ext.equals("xls")) {

// 要想获得更好的视觉效果,可以添加以下代码

exporter.setParameter(

JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,

Boolean.TRUE); // 删除记录最下面的空行

exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,

Boolean.FALSE);// 删除多余的ColumnHeader

exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND

, Boolean.FALSE);// 显示边框

}

response.setContentType(getContentType(docType));

response.setHeader("Content-Disposition", "attachment; filename=\""

+ URLEncoder.encode(fileName, "UTF-8") + "\"");

exporter.setParameter(JRExporterParameter.JASPER_PRINT,

getJasperPrint(jasperPath, params, conn));

OutputStream outStream = null;

PrintWriter outWriter = null;

if(ext.equals("csv")){//解决中文乱码问题

response.setCharacterEncoding("GBK");

outWriter = response.getWriter();

exporter.setParameter(JRExporterParameter.OUTPUT_WRITER,outWriter);

}else{

outStream = response.getOutputStream();

exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);

if(ext.equals("txt")){

exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, new Integer(80));

exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(25));

exporter.setParameter(JRTextExporterParameter.CHARACTER_ENCODING,"GBK");

}

}

try {

exporter.exportReport();

} catch (JRException e) {

throw new ServletException(e);

} finally {

if (outStream != null) {

try {

outStream.close();

} catch (IOException ex) {

}

}

}

}

}

2.用Servlet导出生成文件

Java代码


public class JapserReportServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

public void init(){}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{

String docType = request.getParameter("docType");

String jasperFile = request.getParameter("jasperFile");

String isBean = request.getParameter("isBean");//数据提供方式

String fileName = new String(request.getParameter("fileName").getBytes("ISO-8859-1"),"UTF-8");

//jasper文件放在应用根目录的reports中

String jasperPath = request.getSession().getServletContext().getRealPath("/") + "/reports/"+ jasperFile;

if(StringUtils.isNotEmpty(jasperPath)){

if(StringUtils.isEmpty(fileName)){

fileName = "报表";

}

ReportUtils jasperReport = new ReportUtils(request,response);

//传递报表中(SQL)用到的参数值:$P{ProjectName}

Map params = new HashMap();

//"Name"是报表中定义过的一个参数名称,其类型为String 型

//params.put("ProjectName", new String("Project1"));

try {

if(isBean.equals("1")){

jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getSourceList(), fileName);

}else{

jasperReport.servletExportDocument(getEnumDocType(docType), jasperPath, params, getConnection(), fileName);

}

} catch (JRException e) {

e.printStackTrace();

} catch (ServletException e) {

e.printStackTrace();

}

}else{

response.setCharacterEncoding("UTF-8");

response.sendError(-1, "出错:jasperPath参数是必须的!");

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{

this.doGet(request, response);

}

public void destroy() {

super.destroy();

}

public static DocType getEnumDocType(String docType){

DocType type = DocType.HTML;

docType = docType.toUpperCase();

if(docType.equals("PDF")){

type = DocType.PDF;

}else if(docType.equals("XLS")){

type = DocType.XLS;

}else if(docType.equals("XML")){

type = DocType.XML;

}else if(docType.equals("RTF")){

type = DocType.RTF;

}else if(docType.equals("CSV")){

type = DocType.CSV;

}else if(docType.equals("TXT")){

type = DocType.TXT;

}

return type;

}

/***数据对象****/

public static List getSourceList(){

List<TUser> sourceList = new ArrayList<TUser>();// 测试数据源

for (int i = 0; i < 15; i++) {

TUser user = new TUser();

user.setId(1000 + i);

user.setUsername("user_" + i);

user.setPassword("*******");

sourceList.add(user);

}

return sourceList;

}

/****数据库连接****/

public static Connection getConnection() {

Connection conn = null;

String driver = "com.mysql.jdbc.Driver";

String url = "jdbc:mysql://127.0.0.1/springapp?useUnicode=true&characterEncoding=gb2312";

try {

Class.forName(driver);

conn = DriverManager.getConnection(url,"root", "root");

return conn;

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException ex) {

ex.printStackTrace();

}

return null;

}

}

3.web.xml中的Servlet配置

Xml代码


<servlet>

<servlet-name>JapserReportServlet</servlet-name>

<servlet-class>

com.logcd.servlet.JapserReportServlet

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>JapserReportServlet</servlet-name>

<url-pattern>/reports</url-pattern>

</servlet-mapping>

4.调用

Js代码


function jasperReport(docType){

var jasperFile = "Regist_User_Group.jasper";

var paramStr = "?docType=" + docType + "&jasperFile="+jasperFile + "&fileName=" +'人员名单列表' + "&isBean=0";

var url = getCurrentDirectory() + "/reports" + paramStr;

window.open(url);

}

/***获取当前路径***/

function getCurrentDirectory(){

var locHref = location.href;

var locArray = locHref.split("/");

delete locArray[locArray.length-1];

var dirStr = locArray.join("/");

return dirStr;

}

Html代码


报表类型

<select name="reportType" id="reportType">

<option value="html">HTML</option>

<option value="pdf">PDF</option>

<option value="rtf">RTF</option>

<option value="xls">XLS</option>

<option value="xml">XML</option>

<option value="csv">CSV</option>

<option value="txt">TXT</option>

</select> 

<button onclick="jasperReport($('reportType').value);">Reports</button>

5.直接生成文件

Java代码


public class FirstJasperReports {

static String fileName="E:/workspace/js_test/jrxml/HelloWorld.jrxml";

public static void main(String[] args)throws Exception{

long startTime=System.currentTimeMillis();

//将报表的定义文件HelloWorld.jrxml编译成HelloWorld.jasper文件

String jasperFile=JasperCompileManager.compileReportToFile(fileName);

//向HelloWorld.jasper文件中填充数据,这一步将生产出HelloWorld .jrprint文件

String jrprintFile=JasperFillManager.fillReportToFile(jasperFile,null,new JREmptyDataSource());

//将.jrprint文件转换成HTML格式

JasperExportManager.exportReportToHtmlFile(jrprintFile);

//将.jrprint文件转换成PDF格式

//JasperExportManager.exportReportToPdfFile(jrprintFile);

//将.jrprint文件转换成XML格式

JasperExportManager.exportReportToXmlFile(jrprintFile,false);

//将.jrprint文件转换成XLS格式(即Excel文件),需要用到POI类库.

File sourceFile = new File(jrprintFile);

JasperPrint jasperPrint = (JasperPrint)JRLoader.loadObject(sourceFile);

File destFile = new File(sourceFile.getParent(), jasperPrint.getName() + ".xls");

JRXlsExporter exporter = new JRXlsExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, destFile.toString());

exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);

exporter.exportReport();

long endTime=System.currentTimeMillis();

long time=(endTime-startTime)/1000;

System.out.println("success with "+time+" s");

}

}

jasperreports-3.5.0.jar (2.2 MB)
下载次数: 164

jxl.jar (708.2 KB)
下载次数: 132

iText-2.1.5.jar (1.1 MB)
下载次数: 134
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息