POI-XSSF:用户定义的数据格式

POI-XSSF: user defined data formats

我正在读一个 excel ,它似乎有 user defined data formats。 例如它有一个数据格式: "yyyy"E ,它只显示 yyyy 格式的日期,后跟字母 E.

现在,此格式不是内置可用格式的一部分。

所以,当我尝试将其设置为 CellStyleDataFormat 时,它似乎不起作用。

首先我阅读了一本工作簿,然后根据该工作簿创建了 DataFormat

XSSFWorkbook wb = new XSSFWorkbook(excelToRead);
XSSFDataFormat df = wb.createDataFormat();

df 对象现在也有 user defined data formats (通过打印检查直到 200)。 现在,我尝试在同一个工作簿中创建一个新的单元格,使用如下新样式:

XSSFCell cellTemp = row.createCell(0);
XSSFCellStyle styleTemp = wb.createCellStyle();
styleTemp.setDataFormat(df.getFormat(cell.getCellStyle().getDataFormatString()));
cellTemp.setCellStyle(styleTemp);
cellTemp.setCellValue(cell.getStringCellValue());
System.out.print(formatter.formatCellValue(cellTemp)+" ");

但是,格式化程序没有给我正确的字符串值,而是给了我日期的基础整数值(如果无法识别格式,我想这是默认值)。

在 XSSF 中使用用户定义格式的正确方法是什么?

UPDATE:看来我可以使用其他用户定义的格式,例如 yyyy0.0%,但不能使用 yyyy"E"yyyy"A"

我不太清楚你到底想达到什么目的。但是,如果 DataFormatter 格式不正确,那么也可以使用派生的 class CellFormatter

示例:

import java.io.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.format.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.awt.Desktop;
import java.util.Date;

class CustomDateFormatTest {

 public static void main(String[] args) {
  try {

   Workbook wb = new XSSFWorkbook();
   Sheet sheet = wb.createSheet("Sheet1");
   Row row = sheet.createRow(0);
   Cell cell = row.createCell(0);

   cell.setCellValue(new Date());

   DataFormat format = wb.createDataFormat();
   CellStyle cellstyle = wb.createCellStyle();
   cellstyle.setDataFormat(format.getFormat("yyyy\"E\""));

   cell.setCellStyle(cellstyle);

   OutputStream out = new FileOutputStream("CustomDateFormatTest.xlsx");
   wb.write(out);
   wb.close();

   System.out.println("Done");
   File outputfile = new File("CustomDateFormatTest.xlsx");
   Desktop.getDesktop().open(outputfile);

   InputStream inp = new FileInputStream("CustomDateFormatTest.xlsx");
   wb = WorkbookFactory.create(inp);

   sheet = wb.getSheetAt(0);
   row = sheet.getRow(0);
   cell = row.getCell(0);

   //This will not format properly
   DataFormatter dataformatter = new DataFormatter();
   System.out.println(dataformatter.formatCellValue(cell));

   //This will format properly
   String formatstring = cell.getCellStyle().getDataFormatString();
   System.out.println(formatstring);
   CellDateFormatter celldateformatter = new CellDateFormatter(formatstring);
   //For using CellDateFormatter we need to know that the cell value is a Date.
   System.out.println(celldateformatter.format(cell.getDateCellValue()));


  } catch (InvalidFormatException ifex) {
  } catch (FileNotFoundException fnfex) {
  } catch (IOException ioex) {
  }
 }
}