我正在阅读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中使用用户定义格式的正确方法是什么?
更新:我似乎能够使用其他用户定义的格式,例如yyyy
,0.0%
,但不能使用yyyy"E"
或yyyy"A"
< / p>
答案 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) {
}
}
}