JAVA中模板导出excel之JXLS

Java中实现Excel根据模板导出数据有多种方法,如操作POI、使用工具。国内的easyPOI适合动态列导出,国外的JXLS适合固定模板导出。介绍了使用JXLS的步骤,包括加入依赖包、编写工具类、在controller调用方法、编写模板等。

Java中实现excel根据模板导出数据的方法有很多,一般简单的可以通过操作POI进行。还可以使用一些工具很轻松的实现模板导出。这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是这个JXLS了。个人觉得easyPOI做动态列导出(不固定列)比较好;JXLS做固定模板导出比较方便。

1. 首先加入JXLS依赖包。

<dependency>
      <groupId>org.jxls</groupId>
      <artifactId>jxls</artifactId>
      <version>2.4.6</version>
      <exclusions>
          <exclusion>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-core</artifactId>
          </exclusion>
      </exclusions>
  </dependency>

  <dependency>
      <groupId>org.jxls</groupId>
      <artifactId>jxls-poi</artifactId>
      <version>1.0.15</version>
  </dependency>

  <dependency>
      <groupId>org.jxls</groupId>
      <artifactId>jxls-jexcel</artifactId>
      <version>1.0.7</version>
  </dependency>

2.使用

  1. .在项目中编写util工具类
public class JxlsExcelView extends AbstractView{
	private static final String	CONTENT_TYPE	= "application/vnd.ms-excel";

	private String				templatePath;
	private String				exportFileName;

	/**
	 * @param templatePath
	 *            模版相对于当前classpath路径
	 * @param exportFileName
	 *            导出文件名
	 */
	public JxlsExcelView(String templatePath, String exportFileName)
	{
		this.templatePath = templatePath;
		this.exportFileName = exportFileName;
		setContentType(CONTENT_TYPE);
	}

	@Override
	protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		Context context = PoiTransformer.createInitialContext();
		if (model != null)
		{
			for (String key : model.keySet())
			{
				context.putVar(key, model.get(key));
			}
		}
		String userAgent = request.getHeader("user-agent").toLowerCase();
		response.setContentType(getContentType());
		// 防止乱码
		if (userAgent.contains("msie") || userAgent.contains("like gecko"))
		{
			// win10 ie edge 浏览器 和其他系统的ie
			exportFileName = URLEncoder.encode(exportFileName, "UTF-8");
		} else
		{
			exportFileName = new String(exportFileName.getBytes("UTF-8"), "ISO-8859-1");
		}
		response.setCharacterEncoding("UTF-8");
		response.setHeader("content-disposition", "attachment;filename=" + exportFileName + ".xlsx");
		ServletOutputStream os = response.getOutputStream();
		Resource resource = new ClassPathResource("/static/xlstemplate/" + templatePath);
		InputStream is = resource.getInputStream();
		JxlsHelper jxlsHelper = JxlsHelper.getInstance();
		Transformer transformer = jxlsHelper.createTransformer(is, os);
		// 获得配置
		JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
		//设置静默模式,不报警告
		evaluator.getJexlEngine().setSilent(true);
		//必须要这个,否者表格函数统计会错乱
		jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
		is.close();
	}
}
  1. 在controller中调用方法
@RequestMapping("downloadTeacherTemplate")
	public JxlsExcelView downModel(Model model, HttpServletRequest request)
	{
		try
		{
			model.addAttribute("XB", dictService.queryDict("STD_GB_XB"));
			model.addAttribute("MZ", dictService.queryDict("STD_GB_MZ"));
			model.addAttribute("ZJLX", dictService.queryDict("STD_JB_SFZJLX"));
			model.addAttribute("DQZT", dictService.queryDict("STD_JB_JZGDQZT"));
			// 模版相对于当前classpath路径;导出文件名;
			return new JxlsExcelView("jzgImportTemplate.xlsx", "教职工导入模板");
		} catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
  1. 编写模板jzgImportTemplate.xlsx
    在这里插入图片描述
    我此处是循环的批注写法jx:area(lastCell=“A1”) jx:each(items=“XB” var=“item” lastCell=“A1” )
    如果不循环,就更简单了。直接在所对应单元格中直接写入${XB}此种样式即可。
根据excel模板动态导出数据库数据 package text; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletContext; import net.sf.jxls.transformer.XLSTransformer; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TextAction extends ActionSupport { /** */ private static final long serialVersionUID = 1L; private String filename; @SuppressWarnings("rawtypes") public String export() throws Exception { String templateFile = "18.xls"; // String sql = "select * from t_ry order by rybm"; // exportAndDownload(templateFile, DataBase.retrieve(sql)); List datas = new ArrayList(); @SuppressWarnings("unchecked") HashMap map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload(templateFile, datas); return SUCCESS; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void exportAndDownload(String templateFile, List datas) { try { filename = UUID.randomUUID() + templateFile; // FacesContext context = FacesContext.getCurrentInstance(); // ServletContext servletContext = (ServletContext) // context.getExternalContext().getContext(); ServletContext servletContext = ServletActionContext .getServletContext(); String path = servletContext.getRealPath("\\ExcelFile"); String srcFilePath = path + "\\template\\" + templateFile; String destFilePath = path + "\\download\\" + filename; Map beanParams = new HashMap(); beanParams.put("results", datas); XLSTransformer transfer = new XLSTransformer(); transfer.transformXLS(srcFilePath, beanParams, destFilePath); // Browser.execClientScript("window.location.href='../ExcelFile/downloadfile.jsp?filename=" // + destFile + "';"); } catch (Exception e) { e.printStackTrace(); } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值