Apache POI 设置日期格式在 Excel 中并不总是正确格式化

Apache POI setting date format not always properly formatting in Excel

我最近一直在使用 Apache POI 导出到 XLS。我正在尝试以正确的格式导出日期。为此,我使用以下代码:

CellStyle cellStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
cellStyle.setDataFormat(
    createHelper.createDataFormat().getFormat("dd-mm-yyyy")
);

cell.setCellValue(exportDate.getDate());

cell.setCellStyle(cellStyle);

// To check that this row is properly formatted
log.info("Format of row " + rowIndex + " and cell " + cellIndex + ": " + DateUtil.isCellDateFormatted(cell));

问题是一开始Apache POI 是正确导出这个日期的,但是在导出一个日期大约20 次之后,它就不再格式化了。我在工作簿创建结束时检查了所有内容是否仍然是 DateUtil.isCellDateFormatted(cell) 的日期格式并且每个调用都返回 true.

有谁知道发生了什么事吗? There is a related question from 5 years ago but unanswered.

这会不会是 Excel 的一些奇怪行为?

此代码适用于 XSSFWorkbook,因此我不确定它是否 100% 适合您。

short dateStyle = workBook.createDataFormat().getFormat("dd-mm-yyyy;@");
XSSFCellStyle dateCellFormat = workBook.createCellStyle();
dateCellFormat.setDataFormat(dateStyle);
cell.setCellStyle(dateCellFormat);

对于 XSSF 它工作得很好。可能需要为 HSSF

重做

@Mauro Palsgraaf 我曾经为 XSSF 和 HSSF 设置日期麦粒肿,我从来没有遇到过问题。 我使用 XtremeBaumer

解释的类似代码
workbook.createDataFormat().getFormat("dd-mm-yyyy");
style = workbook.createCellStyle()
style.setDataFormat(dateFormat);
cell.setCellStyle(style);

我在您的代码中注意到的唯一区别是您使用 creationHelper 来创建数据格式,但我使用 workbook.I 我不确定这是否真的是个问题,但也许您可以尝试使用 Workbook

createHelper.createDataFormat().getFormat("dd-mm-yyyy")

到目前为止,每个人的意见都有助于找到解决方案。我不确定这怎么可能是问题所在,但有帮助的是创建 CellStyle 一次,然后对不同的单元格使用相同的样式。在我动态创建每次创建新 CellStyle 的行和单元格之前。我注意到使用 workbook.getCreationHelper() 和 workbook.createDataFormat() 之间没有区别。

我在尝试修改单元格样式时遇到了同样的问题,当您超过一定数量的 class CellStyle 实例时会出现此问题。 我通过对所有单元格使用相同的对象解决了这个问题 需要相同的样式。这是我为解决问题而创建的 class 示例:

package com.h2s.service.utils;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;


public class ExcelCellStyle {

    private HSSFCellStyle defaultCellStyle = null;
    private Map<Integer, HSSFCellStyle> mapColoredStyles = new HashMap<>();
    private HSSFWorkbook workBook = null;
    private HSSFCellStyle defaultCellStyleForTitle = null;
    private HSSFCellStyle defaultCellStyleForBigTitle = null;
    private HSSFFont bigFont;

    private ExcelCellStyle(){
    }

    public static ExcelCellStyle getInstance(){
        return new ExcelCellStyle();
    }

    public HSSFCellStyle getDefaultCellStyle() {
        if(defaultCellStyle == null){
            generateDefaultStyle();
        }
        return defaultCellStyle;
    }

    private void generateDefaultStyle() {
        defaultCellStyle = workBook.createCellStyle();
        defaultCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        defaultCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        defaultCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        defaultCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
    }

    public HSSFCellStyle getColoredCellStyle(short index) {
        if(!mapColoredStyles.containsKey(index)){
            HSSFCellStyle newCellStyle = workBook.createCellStyle();
            newCellStyle.setFillForegroundColor(index);
            newCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            mapColoredStyles.put((int) index, newCellStyle);
        }
        return mapColoredStyles.get((int)index);
    }

    public void setWorkBook(HSSFWorkbook wb) {
        this.workBook  = wb;
    }

    public HSSFCellStyle getDefaultCellStyleForTitle() {
        if(defaultCellStyleForTitle == null){
            defaultCellStyleForTitle = workBook.createCellStyle();
            defaultCellStyleForTitle.setBorderRight(HSSFCellStyle.BORDER_THICK);
            defaultCellStyleForTitle.setBorderLeft(HSSFCellStyle.BORDER_THICK);
            defaultCellStyleForTitle.setBorderBottom(HSSFCellStyle.BORDER_THICK);
            defaultCellStyleForTitle.setBorderTop(HSSFCellStyle.BORDER_THICK);
        }
        return defaultCellStyleForTitle;
    }

    public HSSFCellStyle getDefaultCellStyleForBigTitle() {
        if(defaultCellStyleForBigTitle == null){
            defaultCellStyleForBigTitle = workBook.createCellStyle();
            defaultCellStyleForBigTitle.setBorderRight(HSSFCellStyle.BORDER_THICK);
            defaultCellStyleForBigTitle.setBorderLeft(HSSFCellStyle.BORDER_THICK);
            defaultCellStyleForBigTitle.setBorderBottom(HSSFCellStyle.BORDER_THICK);
            defaultCellStyleForBigTitle.setBorderTop(HSSFCellStyle.BORDER_THICK);
            defaultCellStyleForBigTitle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
            defaultCellStyleForBigTitle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            defaultCellStyleForBigTitle.setFont(getBigFont());
            defaultCellStyleForBigTitle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            defaultCellStyleForBigTitle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        }
        return defaultCellStyleForBigTitle;
    }

    private HSSFFont getBigFont() {
        if(bigFont == null){
            bigFont = workBook.createFont();
            bigFont.setFontHeightInPoints((short) 28);
            bigFont.setFontName("Calibri");
        }
        return bigFont;
    }
}

祝你有愉快的一天。