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

时间:2016-07-04 12:47:27

标签: excel apache-poi xssf

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

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

所以,当我尝试将其设置为CellStyle的{​​{1}}时,它似乎无效。

首先,我阅读了一个工作簿,然后从此工作簿中创建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)+" ");

但是,格式化程序没有给我正确的字符串值,而是它给出了日期的基础Integer值(如果格式未被识别,我猜是默认值)。

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

更新:我似乎能够使用其他用户定义的格式,例如yyyy0.0%,但不能使用yyyy"E"yyyy"A" < / p>

1 个答案:

答案 0 :(得分:0)

对我来说,你究竟想要达到的目标并不是很清楚。但如果DataFormatter格式不正确,那么也可以使用派生自的类 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) {
  }
 }
}