接上文,由于本人在使用Jxls进行Excel导出时遇到数据遍历时Shift Row的格式问题无法解决,同时项目又较为紧张,于是尝试了使用Jett,幸好该框架基本能满足本人的需求,同时感觉各项功能的支持也不错,于是转而使用Jett。
初识Jett
模版制作
如下为制作好的模版,使用${}来标识我们需要填充的数据。【A4:D4】处使用<jt></jt>
遍历一个集合,我们对集合的每个元素取名为e
,每个元素的又可以使用${e.属性}
来进行获取
包依赖
我们使用Maven来进行包依赖管理
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>net.sf.jett</groupId>
<artifactId>jett-core</artifactId>
<version>0.9.1</version>
</dependency>
注意
使用Maven的 maven-resources-plugin 插件管理 resources 时,Maven会对模版进行转码处理,因此需要对xls格式的文件进行过滤,使其不处理。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>swf</nonFilteredFileExtension>
<nonFilteredFileExtension>data</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
</build>
数据填充
try (InputStream is = AppTest.class.getClassLoader().getResourceAsStream("template.xls")) {
try (OutputStream os = new FileOutputStream("output.xls")) {
Map<String, Object> model = new HashMap<>();
model.put("report_year", 2015);
model.put("report_month", 8);
List<Employee> userList = generateSampleEmployeeData();
model.put("employees", userList);
Workbook workbook = new ExcelTransformer().transform(is, model);
workbook.write(os);
} catch (IOException | InvalidFormatException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
效果展示
与Spring MVC结合
编写View
我们继承Spring提供的 AbstractView 抽象类。
package com.closer.jett.common;
import net.sf.jett.transform.ExcelTransformer;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.AbstractView;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
/**
* JettExcelView
* Created by Zhang Jinlong on 2015/11/4.
*/
public class JettExcelView extends AbstractView {
private static final String CONTENT_TYPE = "application/vnd.ms-excel";
private String templatePath;
private String exportFileName;
public JettExcelView(String templatePath, String exportFileName) {
this.templatePath = templatePath;
if (exportFileName != null) {
try {
exportFileName = URLEncoder.encode(exportFileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
this.exportFileName = exportFileName;
setContentType(CONTENT_TYPE);
}
@Override
protected void renderMergedOutputModel(
Map<String, Object> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
try (InputStream is = getClass().getClassLoader().getResourceAsStream(templatePath)) {
response.setContentType(getContentType());
response.setHeader("content-disposition", "attachment;filename=" + exportFileName + ".xls");
ServletOutputStream os = response.getOutputStream();
Workbook workbook = new ExcelTransformer().transform(is, model);
workbook.write(os);
}
}
}
请求处理
@RequestMapping(value = "/report")
public ModelAndView export() {
Map<String, Object> model = new HashMap<>();
model.put("report_year", 2015);
model.put("report_month", 8);
List<Employee> userList = generateSampleEmployeeData();
model.put("employees", userList);
return new ModelAndView(new JettExcelView("template.xls", "output"), model);
}
最后
这里只是写了一个简单的例子,Jett还有很多对Excel导出的用法,这里不一一细说,详细可以查阅官网Jett