EasyExcel 匯出 excel 後無法實現日期篩選與數值型別合計問題與解決
阿新 • • 發佈:2021-04-29
文章目錄
問題現象
1、對於日期型別
excel做篩選後應該支援按年、月、日篩選,而easyexcel 按註解 @DateTimeFormat(“yyyy-MM-dd”) 實現後雖然呈現格式上沒問題,但是單元格格式還是存在問題導致篩選後不正常,具體如圖效果:
excel對日期型別篩選後正常現象
easyexcel匯出後對日期型別篩選後異常現象
補充現象:
easyexcel 匯出後預設是未雙擊效果,上面得篩選結果就是未雙擊這版格式
本次咱們通過程式解決這個問題。
PS:即使在excel手動設定單元格格式也不生效,所以只能程式解決!
2、對於金額型別
呈現效果類似上面日期問題,也是匯出預設得格式不是真正得數值型別,做合計得時候無法合計。
PS:即使在excel手動設定單元格格式也不生效,所以只能程式解決!
程式解決方案
實現一個註冊一個自定義handler,implements CellWriteHandler 即
.registerWriteHandler(new OrderCellHandler())
// 這裡需要設定不關閉流
EasyExcel. write(response.getOutputStream(), clazz)
.registerWriteHandler(new OrderCellHandler())
.includeColumnFiledNames(columnNames)
.autoCloseStream(Boolean.FALSE)
.sheet(sheetName)
.doWrite(data);
實現類 OrderCellHandler.java
package com.fawm.base.config.easy.excel.write.handler;
import com.alibaba. excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.fawm.base.utils.CommonDateUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* 訂單匯出處理日期格式與金額類
*
* @author liumingxing
*/
public class OrderCellHandler implements CellWriteHandler {
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
boolean columnTwoFlag = cell.getColumnIndex() == 2;
boolean otherDateFlag = cell.getColumnIndex() >= 65 && cell.getColumnIndex() <= 71;
boolean dateFlag = columnTwoFlag || otherDateFlag;
int[] moneyColumnIndex = {8, 9, 10, 11, 51, 52, 53, 55, 57, 59, 61, 62, 64};
int matchMoney = Arrays.stream(moneyColumnIndex).filter(item -> item == cell.getColumnIndex()).findAny().orElse(-1);
boolean moneyColumnFlag = matchMoney != -1;
boolean finalFlag = dateFlag || moneyColumnFlag;
if (!isHead && finalFlag) {
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
CellStyle cellStyle = workbook.createCellStyle();
String stringCellValue = cell.getStringCellValue();
try {
CreationHelper createHelper = workbook.getCreationHelper();
if (StringUtils.isNotBlank(stringCellValue) && dateFlag) {
String[] patterns = {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd"};
Date date = CommonDateUtils.parseDate(stringCellValue, patterns);
if (columnTwoFlag) {
//訂單生成日期
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy h:mm:ss"));
} else {
//其他日期列
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy"));
}
cell.setCellStyle(cellStyle);
cell.setCellValue(date);
} else if (StringUtils.isNotBlank(stringCellValue) && moneyColumnFlag) {
//其他金額列
Float money = Float.parseFloat(stringCellValue);
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("#,##0.00"));
cell.setCellStyle(cellStyle);
cell.setCellValue(money);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}