在 Java 开发中经常会遇到做 Excel 报表导出需求,这里我推荐比 poi 更简单些的 easypoi 它可以满足大部分需求,如果你的需求更为复杂请研究 poi 官方文档
首先附上 easypoi 文档地址
定制你的 Excel 模板,语法如下
空格分割
三目运算 {{test ? obj:obj2}}
n: 表示 这个cell是数值类型 {{n:}}
le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
fn: 格式化数字 {{fn:(obj;###.00)}}
fe: 遍历数据,创建row
!fe: 遍历数据不创建row
$fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
#fe: 横向遍历
v_fe: 横向遍历值
!if: 删除当前列 {{!if:(test)}}
单引号表示常量值 '' 比如'1' 那么输出的就是 1
&NULL& 空格
]] 换行符 多行遍历导出
sum: 统计数据
这里面有正常的标签以及 fe 遍历应该是使用最广的遍历,用来解决遍历后下面还有数据的处理方式
我们要生成的是这个需要一些list集合和一些单纯的数据
fe 的写法 fe 标志 冒号 list数据 单个元素数据(默认 t ,可以不写) 第一个元素 {{$fe: maplist t t.id }}
看下数据代码,主要是构造数据 TemplateExportParams 是主要的参数数据
@Test
public void fe_map() throws Exception {
TemplateExportParams params = new TemplateExportParams(
"WEB-INF/doc/专项支出用款申请书_map.xls");
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2014-12-25");
map.put("money", 2000000.00);
map.put("upperMoney", "贰佰万");
map.put("company", "执笔潜行科技有限公司");
map.put("bureau", "财政局");
map.put("person", "JueYue");
map.put("phone", "1879740****");
List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
for (int i = 0; i < 4; i++) {
Map<String, String> lm = new HashMap<String, String>();
lm.put("id", i + 1 + "");
lm.put("zijin", i * 10000 + "");
lm.put("bianma", "A001");
lm.put("mingcheng", "设计");
lm.put("xiangmumingcheng", "EasyPoi " + i + "期");
lm.put("quancheng", "开源项目");
lm.put("sqje", i * 10000 + "");
lm.put("hdje", i * 10000 + "");
listMap.add(lm);
}
map.put("maplist", listMap);
Workbook workbook = ExcelExportUtil.exportExcel(params, map);
File savefile = new File("D:/excel/");
if (!savefile.exists()) {
savefile.mkdirs();
}
FileOutputStream fos = new FileOutputStream("D:/excel/专项支出用款申请书_map.xls");
workbook.write(fos);
fos.close();
}
输出效果如下
同时这里的 List<Map<String, String>> listMap 可以换为你定制的实体类例如: List<MyClass> listMyClass
这里你的实体类的属性名称应与模板设置列的名称对应
SpringBoot Excel导出完整实现示例
1.Excel 模板
如下(这里只展示配置部分,其余可自行定制)
2.配置对应实体类
import java.math.BigDecimal;
public class Revenue {
String channel;
String channelId;
String date;
BigDecimal totalPayAmount;
Integer newAccount;
String listPosition;
BigDecimal activeARPU;
BigDecimal payRate;
BigDecimal payARPU;
String mailiangCost;
String asoCost;
String mailiangNewadd;
BigDecimal pullNatureAddRate;
BigDecimal buyCPA;
BigDecimal synCPA;
/**
*这里省略get、set方法,使用时请自行添加
**/
}
省略数据获取等方法(根据自身需求定制)
3.Controller层接口
@RequestMapping("/exportexcel")
public void downloadByPoiBaseView(@RequestParam Map<String, Object> params,ModelMap modelMap,HttpServletRequest request,HttpServletResponse response) {
TemplateExportParams templateExportParams = new TemplateExportParams(globalProperties.getExcelTemplateUrl());
Map<String, Object> map = new HashMap<>(16);
map.put("date", DateTimeUtil.getCurrentTime());
List<Revenue> revenueList = tkzmDailyExcelService.getListRevenue(params);
map.put("revenueList", revenueList);
modelMap.put(TemplateExcelConstants.FILE_NAME, "yourFileName"+DateTimeUtil.getCurrentTime());
modelMap.put(TemplateExcelConstants.PARAMS, templateExportParams);
modelMap.put(TemplateExcelConstants.MAP_DATA, map);
PoiBaseView.render(modelMap, request, response,TemplateExcelConstants.EASYPOI_TEMPLATE_EXCEL_VIEW);
}
这里强调一个问题对于初始化
TemplateExportParams templateExportParams = new TemplateExportParams(globalProperties.getExcelTemplateUrl());
这条语句我是采用全局配置其真实值是C:/OPENSOURCE/IDEA/TestRunJar/test.xls
这是模板的路径,这里我选择放在系统路径中原因是如果放在项目路径编译器中可以正常运行导出,而在 Maven 打 Jar 包后会出现 Excel 模板读取不到的 Bug 所以我选择了这种曲线救国的方式,上述 Bug 在 War 包中不存在。
(如果你有更好的解决方法可以评论告诉我,感激不尽)
4.前端调用
function exportData() {
window.open("/test/dataexport/exportexcel?appId=" + appId + "&List=" + this.List);
}
按钮调用此方法即可。
- 如有其他问题请关注此公众号寻求解答