在Struts2中利用JasperReport导出excel

本文介绍如何在Struts2框架中整合JasperReport实现报表功能,包括配置过程、关键代码示例以及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说明几点:

1.假设读者已经能搭建struts2的环境,已经稍微了解jasperReportiReport的基础知识(这个基础知识能百度出来)

2.制作报表的时候使用的是iReport工具,那么要保证JasperReport的版本和iReport的版本一致!我使用的都是4.5.1(这个要点是我从风中叶的教学视频中得知的)

3.导入jar

jar包分三部分:struts2jar包,struts2-jasperreports-pluginjar(这两个jar包都可以在struts2lib文件夹中找到),和jasperReportjar

4.注意struts2jasper结果类型的转换

5.注意action访问的方式,我测试form提交总是报错….

6.注意工具类的调用,这个很重要,不然导出的excel格式很乱,根本无法使用,被这个折磨好久

下面就贴代码:

1web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

2struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<constant name="struts.devMode" value="true" />
	
	<package name="struts2" namespace="/" extends="struts-default,jasperreports-default">
	
		<action name="JasperAction" class="com.yzj.action.JasperAction">
			<result name="success" type="jasper">
				<param name="location">/report/test.jasper</param>
				<param name="dataSource">list</param>
				<param name="reportParameters">reportParameters</param>
				<param name="exportParameters">exportParameters</param>
				<param name="format">XLS</param>
			</result>
		</action>
		
	</package>
</struts>

说明一下:由于struts2本身不能识别<result name="success" type="jasper">这种结果类型,那么就需要自己配置,这里可以使用下面几种方式配置jasperresult类型

1:利用struts2xml配置中多继承的方式,就如我上面的extends="struts-default,jasperreports-default"

2:修改jasperreports-default.xml中的配置文件,让它继承struts-default.xml,然后自己的struts.xml再继承jasperreports-default.xml

(上面两个的目的都是为了自己的struts.xml能够继承到struts-default.xml)

3:在配置文件的package标签里面加上这句result指定:

<result-types>
			<result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/>
		</result-types>
目的都是为了 struts2 能够识别 jasper 这种结果类型

3.index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type="text/javascript">
	function exp(){
		if(confirm("确定要导出清单?")){
	    	var url="JasperAction.action";
	        window.open(url,'exportReport','height=5,width=5,status=yes,toolbar=no,menubar=no,location=no');
		}
    }
	</script>
  </head>
  
  <body>
    Ttest jasperreport<br>
    	<a href="#" οnclick="exp();">PDF</a>
  </body>
</html>

这个是初始页面,也是进行导出的页面,很简单,就一个链接,使用js访问JasperActionexportReport方法,当然也可以使用location.href=””的方式进去访问~

不过表单提交的方式好像不行,因为我之前使用form提交,总是报错,后来改成这种形式之后,才消除问题的~


4.JasperAction.java

package com.yzj.action;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

public class JasperAction extends ActionSupport{

	private List<User> list;
	private Map<String,String> reportParameters;
	private final Map<Object,Object> exportParameters=(Map<Object,Object>)JasperUtils.getMap();
	
	@Override
	public String execute(){
		System.out.println("OK");
		this.list = new LinkedList<User>();
		this.list.add(new User("111","aaa"));
		this.list.add(new User("222","bbb"));
		this.list.add(new User("333","ccc"));
		
		reportParameters = new HashMap<String,String>();
		reportParameters.put("TIME", "2015");
		return SUCCESS;
	}

	public Map<Object, Object> getExportParameters() {
		return exportParameters;
	}
	public Map<String, String> getReportParameters() {
		return reportParameters;
	}
	public void setReportParameters(Map<String, String> reportParameters) {
		this.reportParameters = reportParameters;
	}
	public List<User> getList() {
		return this.list;
	}
	public void setList(List<User> list) {
		this.list = list;
	}
}

这个就是处理请求的action了,可以看出它关联了两个其他的类,一个是User.java一个是JasperUtils.java,分别如下:

 

5.User.java

package com.yzj.action;

public class User {
	
	private String username;
	private String password;
	
	public User(){}
	
	public User(String username,String password){
		this.username = username;
		this.password = password;
	}

	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

这个只是一个POJO,用来给jasperReport填充数据的,我在action中是手动赋值的,当然在实际应用中就可以冲数据库中取值了,然后组装成一个list就行了,结果是一样的--都是生成数据源

6.JasperUtils.java

package com.yzj.action;

import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.export.JExcelApiExporterParameter;
import net.sf.jasperreports.engine.export.JRCsvExporterParameter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;

public class JasperUtils {
	
	private final static Map map = new HashMap();
	
	static {
		map.put(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
		map.put(JRXlsExporterParameter.IS_FONT_SIZE_FIX_ENABLED, Boolean.TRUE);
		
		map.put(JRXlsExporterParameter.PROPERTY_IGNORE_CELL_BORDER, Boolean.TRUE);
		//对于导出excel来说下面三个很重要
		map.put(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
		map.put(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
		map.put(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
		
		map.put(JExcelApiExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE);
		map.put(JRCsvExporterParameter.FIELD_DELIMITER, "");
		map.put(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
	}
	
	public static Map getMap(){
		return map;
	}

}

工具类主要是提供了一些JasperReport的参数,具体意义自己研读一下,百度一下,其实这些常量名字已经很直白了~

 

7.最后就一个.Jasper文件了

test.jasper

 

这个是我在iReport中画的简单模板:


还是贴出对应的.jrxml吧,这样即便没有iReprt也可以利用代码去编译了

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="sss" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
	<property name="ireport.zoom" value="1.4641000000000006"/>
	<property name="ireport.x" value="10"/>
	<property name="ireport.y" value="0"/>
	<parameter name="TIME" class="java.lang.String"/>
	<field name="username" class="java.lang.String"/>
	<field name="password" class="java.lang.String"/>
	<background>
		<band splitType="Stretch"/>
	</background>
	<title>
		<band height="31" splitType="Stretch">
			<staticText>
				<reportElement x="107" y="0" width="295" height="31"/>
				<textElement textAlignment="Center">
					<font size="14"/>
				</textElement>
				<text><![CDATA[Test Struts2 and JaspeRreports]]></text>
			</staticText>
		</band>
	</title>
	<pageHeader>
		<band height="26">
			<staticText>
				<reportElement x="243" y="0" width="159" height="25"/>
				<textElement>
					<font size="12"/>
				</textElement>
				<text><![CDATA[password]]></text>
			</staticText>
			<staticText>
				<reportElement x="107" y="0" width="136" height="25"/>
				<textElement>
					<font size="12"/>
				</textElement>
				<text><![CDATA[username]]></text>
			</staticText>
		</band>
	</pageHeader>
	<detail>
		<band height="26">
			<textField>
				<reportElement x="243" y="0" width="159" height="25"/>
				<textElement>
					<font size="12"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{password}]]></textFieldExpression>
			</textField>
			<textField>
				<reportElement x="107" y="0" width="136" height="25"/>
				<textElement>
					<font size="12"/>
				</textElement>
				<textFieldExpression><![CDATA[$F{username}]]></textFieldExpression>
			</textField>
		</band>
	</detail>
	<lastPageFooter>
		<band height="50">
			<textField>
				<reportElement x="243" y="0" width="159" height="20"/>
				<textElement/>
				<textFieldExpression><![CDATA[$P{TIME}]]></textFieldExpression>
			</textField>
		</band>
	</lastPageFooter>
</jasperReport>

自此,所有的文件都已经备齐了,启动工程访问就可以了

 

多说两句导入jar包吧,如果保证了jasperreportireport的版本一致,jar包就很好弄了,我看视频中是把jasperreport的所有jar都放在了WEB-INF下面了,其实不用这么多的~!虽然我已经删了一些了,但是还有很多没来得及测试,万幸的是,这些jar都可以从下载的jasperreportstruts2的工程里面找到~

还有中文的问题,我还没测试,这个网上也有蛮多解决方式的~


 


顺便推荐一本报表相关的书:

Java报表开发技术深入解析-刘聪著

本人菜鸟初次写心得,有什么问题请大家指教

工程下载(已包含jar包):

http://download.youkuaiyun.com/detail/seguzhizi/8406977


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值