1. 程式人生 > 其它 >EasyExcel 匯出 excel 後無法實現日期篩選與數值型別合計問題與解決

EasyExcel 匯出 excel 後無法實現日期篩選與數值型別合計問題與解決

文章目錄

問題現象

1、對於日期型別

excel做篩選後應該支援按年、月、日篩選,而easyexcel 按註解 @DateTimeFormat(“yyyy-MM-dd”) 實現後雖然呈現格式上沒問題,但是單元格格式還是存在問題導致篩選後不正常,具體如圖效果:

excel對日期型別篩選後正常現象

在這裡插入圖片描述

easyexcel匯出後對日期型別篩選後異常現象

在這裡插入圖片描述
補充現象:
easyexcel 匯出後預設是未雙擊效果,上面得篩選結果就是未雙擊這版格式

如果滑鼠左鍵雙擊後,excel就會自動轉換正常得日期格式,就能篩選了。
本次咱們通過程式解決這個問題。

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(); } } } }