做项目的时候,经常会有一些报表类的应用,需要导出,但是POI提供了大量的API,写一个复杂的导出文件,光对样式,格式就需要几百行的代码,不仅不美观,可读性也很差,对此,我做了不少研究后,发现通过事先设计好EXCEL的模板,java只做对数据的解析,将数据填进模板里,可读性强,代码量少,对于某些情景能做到万能公式的效果,无需修改代码,修改模板即可完成复杂的导出文件。废话不多说,代码献上。
首先是工具类:
public class ExcelUtil {
public ExcelUtil() {
}
public static Workbook setDataInTemplateExcel(Workbook wb, int rowNum, int colNum, int sheetNum, List<Map<String, Object>> data, boolean isProtect) {
//数据写在第几个sheet页中
Sheet sheet = wb.getSheetAt(sheetNum);
//从第几行开始写入
int i = rowNum;
for(Iterator var8 = data.iterator(); var8.hasNext(); ++i) {
Map<String, Object> mapStore = (Map)var8.next();
Row row = sheet.getRow(i);
if (row == null) {
row = sheet.createRow(i);
}
//从第几列写入
int j = colNum;
for(Iterator var12 = mapStore.entrySet().iterator(); var12.hasNext(); ++j) {
Entry<String, Object> entry = (Entry)var12.next();
Cell cell = row.getCell(j);
if (cell == null) {
cell = row.createCell(j);
}
if (entry.getValue() != null) {
//这里根据你的业务需要,如还有日期,等其他形式 也可以继续添加
Object val = entry.getValue();
if (!(val instanceof Long) && !(val instanceof Integer)) {
if (val instanceof Double) {
cell.setCellValue(Double.parseDouble(val.toString()));
} else {
cell.setCellValue(val.toString());
}
} else {
cell.setCellValue((double)Long.parseLong(val.toString()));
}
} else {
cell.setCellValue("");
}
}
}
//文件加密,加密后不允许他们编辑
if (isProtect) {
sheet.protectSheet("123");
}
return wb;
}
}
业务逻辑代码:
@RequestMapping(value = "/export",method = {RequestMethod.GET})
public void export(HttpServletResponse response) throws Exception{
//输出流
ServletOutputStream out = response.getOutputStream();
String exportPath="test";
//设置表名
setResponseHeader(response,"测试表格");
// 1. 加载模板文件
String fileDir = System.getProperty("user.dir") + File.separator
+ "template" + File.separator;
String filePath = fileDir + exportPath + ".xlsx";
File file = new File(filePath);
//判断模板是否存在
if (!file.exists()) {
throw new Exception("模板不存在");
}
//数据源 用于测试 本人造了几个数据
List<Map<String, Object>> dateList=new ArrayList<>();
for (int i=0;i<10;i++) {
Map<String, Object> map = new LinkedHashMap<>();
map.put(i+"e",i+1);
map.put(i+"a",i+2);
dateList.add(map);
}
InputStream stream = null;
stream =new FileInputStream(file);
Workbook wb = WorkbookFactory.create(stream);
//参数一次代表:wb 输入流 rowNum 第几行 colNum 第几列 sheetNum 第几个sheet页 datelist 数据源 isProtect Excel文件是否可被被人编辑
//下面的参数表示从第3行第1列第一个sheet页开始写入,不对excel加密
wb = ExcelUtil.setDataInTemplateExcel(wb, 2, 0, 0,dateList,false);
wb.write(out);
stream.close();
out.close();
}
//文件名
public HttpServletResponse setResponseHeader(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName+".xlsx").getBytes("utf-8"), "ISO-8859-1"));
return response;
}
两段代码即可
文件模板可根据自己的业务存放:
模板样式:
导出结果显示:
短短几行代码搞定 是不是很简单呢
版权声明:本文为yousiwangqh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。