3

I am reading an excel , which seems to have user defined data formats. for example it has a data format : "yyyy"E , which just displays the date in yyyy format followed by the letter E.

Now, this format is not a part of the built in ,available formats.

So, it seems that when i try to set this as DataFormat of a CellStyle, it doesn't work.

First i read a workbook and then create the DataFormat from this workbook.

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

the df object now has the user defined data formats as well (checked by printing till 200). Now, I try to create a new cell in the same workbook, with a new style like this:

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)+" ");

But, the formatter does not give me the correct string value, instead it gives me the underlying Integer value of the date (which i guess is the default if the format is not recognized).

What is the correct way to use user defined formats in XSSF?

UPDATE: It seems that i am able to use other user defined formats like yyyy, 0.0% but not yyyy"E" or yyyy"A"

gaurav5430
  • 12,934
  • 6
  • 54
  • 111

1 Answers1

1

It is not really clear for me what exactly you are trying to achieve. But if the DataFormatter not properly formats, then one could also use a class derived from CellFormatter.

Example:

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) {
  }
 }
}
Axel Richter
  • 56,077
  • 6
  • 60
  • 87
  • That actually worked! thanks a lot... do you have any idea why other user formats were working but this (yyyy"E") one did not ? – gaurav5430 Jul 05 '16 at 04:30