基于poi的excel导出封装
之前我所过的项目中,进行excel导出时,无一例外地都是先读取excel模板,然后再导出excel,修改导出这块的时候,代码和excel模板都得修改,使用起来感觉很麻烦;
还有,如果我要在一个sheet中导出用户数据和省份数据时,后端实现起来也很复杂。
我对基于poi导出excel进行了封装,现在贴出来,与大家交流交流。
主要名词解释:
ExcelModel:excel数据封装类。
Sheet:一个工作表。
Block:一个块,一个工作表可以包含多个块。
先看效果图:
以下是示例代码:
package com.excel.controller;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.excel.service.ExportService;
import com.excel.util.ExcelUtil;
import com.excel.util.excel.part.Block;
import com.excel.util.excel.part.ExcelModel;
import com.excel.util.excel.part.Sheet;
@Controller
public class ExporController {
@Autowired
ExportService exportService;
@RequestMapping(value = "/export")
public void export(HttpServletResponse response){
ExcelModel em=exportService.getExcelModel();
ExcelUtil.exportXlsx(em, response);
}
@RequestMapping(value = "/export2")
public void export2(@RequestParam Map<String, Object> params,HttpServletResponse response){
ExcelModel em=new ExcelModel("导出测试");
//------工作表1
Sheet sheet1 = em.createSheet("用户和省份");
sheet1.setBlockSpace(3);//设置block的间隔
List<Map<String,Object>> userList = exportService.getUserList(params);
Block block1 = sheet1.createBlock();
block1.setHeader("名字","手机号","身份证","邮箱");//设置表头
block1.setHeaderKeys("name","phonenumber","idcard","email");//设置表头对应的key
block1.setData(userList);
List<Map<String,Object>> provinceList = exportService.getProvinceList(params);
Block block2 = sheet1.createBlock();
block2.setHeader("省市编号","省份名称");
block2.setHeaderKeys("code","name");
block2.setData(provinceList);
block2.setShowRowNo(true);//控制是否显示序号
//------工作表2
Sheet sheet2 = em.createSheet("省份");
Block block3 = sheet2.createBlock();
block3.setTitle("标题");
block3.setHeader("省市编号","省份名称");
block3.setHeaderKeys("code","name");
block3.setData(provinceList);
ExcelUtil.exportXlsx(em, response);
}
}
注意:
导出时调用ExcelUtil.exportXlsx(excelModel, httpServletResponse);
不建议使用ExcelUtil.export(excelModel, httpServletResponse),行数超过65535时会报错。