最近在学习SpringMVC框架时,需要用到POI处理Excel文件的导出。碰到一些问题及处理心得,记录一下。本人初学者,不足之处欢迎指正。
本人使用的POI版本为4.1.2。在SpringMVC中导出Excel时,可以自定义视图,继承自AbstractXlsView。该类大部分方法Spring已经帮我们实现了,我们只需要实现buildExcelDocument方法即可。
AbstractXlsView中创建的默认workbook对象是HSSFWorkbook实例,而HSSF只支持Excel2003(.xls)格式的。如果我们要导出.xlsx格式的文件,可以采用XSSF模型。此时需要在自定义ExcelView中重载createWorkbook方法。返回一个XSSFWorkbook对象即可。
自定义ExcelView代码如下:
public class ExcelView extends AbstractXlsView
{
private String fileName;
private ExportExcelSrvs exportExcelSrvs;
// 待插入数据的类型
private TYPE type;
/***************setters and getters***************/
@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
if (getExportExcelSrvs() == null)
throw new RuntimeException("自定义导出服务接口不能为空");
if (!StringUtils.isEmpty(getFileName()))
{
// 获取请求中的字符编码
String charset = request.getCharacterEncoding();
charset = StringUtils.isEmpty(charset) ? "UTF-8" : charset;
// 将文件名转换为ISO8895-1类型
setFileName(new String(getFileName().getBytes(charset), "ISO8859-1"));
// 将文件名设置到响应头中
response.setHeader("Content-disposition", "attachment;filename=" + getFileName());
}
// 回调接口方法,使用自定义属性生成excel文档
getExportExcelSrvs().customWorkBook(model, workbook, getType().getClazz());
}
// 重载此方法,自定义workbook实例
@Override
protected Workbook createWorkbook(Map<String, Object> model, HttpServletRequest request)
{
if (getFileName