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;
}
}
祝你有愉快的一天。
我最近一直在使用 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;
}
}
祝你有愉快的一天。