做项目遇到了根据模板导出可是折磨人了!之前没有用过EasyPoi但是项目中都用的这个。只能用这个了,官网:https://easypoi.mydoc.io/#text_225967
EasyPoi官方文档总结
**模板中的fe的用法很好用**
空格分割
三目运算 {{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: 统计数据
文档中有这样的话,本以为我不用关心样式了,是我想多了。基本上jar每个版本都会出现很多奇奇怪怪的问题。jar包我是一路升级到4.2.0
模板样子:
由于遇到的问题太多,这次只说根据模板导出样式缺失的问题
一顿导出感觉一次就ok了可是出现的是(数据我删除掉了)
2个Sheet页第一个页样式都是乱的,第二个Sheet页是可以的。我猜测是第一个Sheet页表格下面有一个其他的表格,2个表格之间还差了一行,复制上一个单元格的样式的时候出现了不清楚的问题没有细致的研究
排查来排查去。用List cellRangeAddresses = sheet.getMergedRegions();获取了当前页面所有的合并,也是有问题的。
想了很久,没有办法,只能使用傻瓜式的解决办法了。自己写了几个合并单元格和设置单元格样式的工具类。重新合并和设置了样式。具体代码如下。我的解决思路是这样的。工具类不是很完善。你们可以自己补充。
工具类
/**
* 根据模板导出Excel
* 每个sheet对应一个map,
* @param params 参数
* @param templateFileName 模板全路径
*/
public static Workbook templateExportExcelManySheet(Map<String, Object> params, String templateFileName){
TemplateExportParams templateUrl = new TemplateExportParams(templateFileName,true);
return ExcelExportUtil.exportExcel(templateUrl,params);
}
/**
* 设置单元格的样式
* 精确到某个单元格
* x和y定位一个
* @param sheet Sheet页
* @param startRow 从第几行开始
* @param endRow 到第几行
* @param startCell 从第几列开始
* @param endCell 到第几列
* @param style 样式
*/
public static void styleCells(Sheet sheet, int startRow, int endRow, int startCell, int endCell, CellStyle style){
for (int i = startRow; i <= endRow; i++) {
for (int a = startCell; a <= endCell; a++){
Cell cell = sheet.getRow(i).getCell(a);
cell.setCellStyle(style);
}
}
}
/**
* 按照顺序(批量)合并列单元格
* @param sheet sheet页
* @param startRow 从第几行开始 包含当前行
* @param endRow 到第几行 包含当前行
* @param startCell 从第几列开始数组
* @param endCell 到第几列数组
*/
public static void batchCellMergeColumn(Sheet sheet, int startRow, int endRow, int[] startCell, int[] endCell){
for (int a = 0; a <= startCell.length-1; a++){
List<CellRangeAddress> cellRangeAddresses = sheet.getMergedRegions();
for (int i = startRow; i <= endRow; i++) {
Boolean type = true;
CellRangeAddress craOne = new CellRangeAddress(i, i, startCell[a], endCell[a]);
for (CellRangeAddress cellAddresses:cellRangeAddresses){
if (cellAddresses.intersects(craOne)){
type = false;
break;
}
}
if (type){
sheet.addMergedRegion(craOne);
}
}
}
}
/**
* 按照顺序(批量)合并行单元格
* @param sheet sheet页
* @param startRow 从第几行开始数组
* @param endRow 到第几行数组
* @param startCell 从第几列开始 包含当前列
* @param endCell 到第几列 包含当前列
*/
public static void batchMergeRowCells(Sheet sheet, int[] startRow, int[] endRow, int startCell, int endCell){
for (int b = 0; b <= startRow.length-1; b++){
List<CellRangeAddress> cellRangeAddresses = sheet.getMergedRegions();
for (int a = startCell; a <= endCell; a++) {
Boolean type = true;
CellRangeAddress cellRangeAddress = new CellRangeAddress(startRow[b], endRow[b],a,a);
for (CellRangeAddress cellAddresses:cellRangeAddresses){
if (cellAddresses.intersects(cellRangeAddress)){
type = false;
break;
}
}
if (type){
sheet.addMergedRegion(cellRangeAddress);
}
}
}
}
/**
* 按照顺序设置合并行单元格
* 只会合并行
* @param sheet sheet页
* @param startRow 从第几行开始合并
* @param endRow 合并到第几行
* @param startCell 从第几列开始
* @param endCell 到第几列
*/
public static void mergeRowCells(Sheet sheet, int startRow, int endRow, int startCell, int endCell){
for (int i = startCell; i <= endCell; i++) {
CellRangeAddress craOne = new CellRangeAddress(startRow, endRow, i, i);
sheet.addMergedRegion(craOne);
}
}
/**
* 跳着合并单元格
* 注意每一个数组的长度必须一致。这里没有做校验
* @param sheet sheet页
* @param startRow 需要合并的开始行
* @param endRow 需要合并的结束行
* @param startCell 需要合并的开始列
* @param endCell 需要合并的结束列
*/
public static void intervalCellMerge(Sheet sheet, int[] startRow, int[] endRow, int[] startCell, int[] endCell){
for (int i = 0; i <= startRow.length-1; i++) {
CellRangeAddress craOne = new CellRangeAddress(startRow[i], endRow[i], startCell[i], endCell[i]);
sheet.addMergedRegion(craOne);
}
}
如果对你有帮助请点个赞谢谢
求助大佬:有没有其他好的方案。或者使用了其他方便的技术-留个言,谢谢大哥哥大姐姐们