Apache POI>处理特殊格式?

时间:2019-07-04 16:08:31

标签: apache-poi locale

我正在考虑生成一个xlsx文件,并且对于某些单元格,应用一个“特殊” (这是Excel中使用的确切单词,在“格式单元格”>“类别”中)类别具有特定的语言环境。例如,我在Excel的本地安装中带有“英语(加拿大)”语言环境的“社会保险号”。

我已经检查了POI API,对Google进行了一些搜索,但我对如何做到这一点感到困惑。 我尝试手动创建此类单元格(直接使用Excel),然后使用POI读取它们。
如果我将getCellStyle()。getDataFormat()应用于我的单元格,则返回的值等于或大于164。我猜这意味着它被认为是用户定义的,因为POI org.apache.poi.ss.usermodel.BuiltinFormats #FIRST_USER_DEFINED_FORMAT_INDEX常数为164。

到底是想做些什么?我什至不知道一般来讲,Excel的特殊类型在哪里定义。这些似乎是内置的。

1 个答案:

答案 0 :(得分:2)

所有Excel数字格式均基于特殊格式模式。参见How to control and understand settings in the Format Cells dialog box in Excel

要获得特殊格式需要的确切格式模式,可以将特殊格式应用于单元格,然后查看相应的自定义格式。

以下是特殊格式“社会保险号(CH)”-瑞士:

enter image description here这是德语Excel,“ Sonderformat”是“ Special”。

这对应于自定义格式000\.00\.000\.000。您只需在Custom的对话框Excel-Format Cells中更改为类别Number即可得出结论。然后从Type:下面的文本字段中读取模式:

enter image description here这是德语Excel,“ Benutzerdefiniert”是“自定义”。

所以通常的方法是:首先在Excel的对话框Format Cells-Number中选择特殊格式。然后将类别更改为Custom,然后从Type:下面的文本字段中读取相应的模式。

如果您有数字格式模式,可以使用apache poi如下使用它:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class CreateExcelNumberFormat {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   DataFormat format = workbook.createDataFormat();
   CellStyle specialSIN = workbook.createCellStyle();
   specialSIN.setDataFormat(format.getFormat("000\\.00\\.000\\.000"));

   Sheet sheet = workbook.createSheet(); 

   Cell cell = sheet.createRow(0).createCell(0);
   cell.setCellStyle(specialSIN);
   cell.setCellValue(12345678901d);

   sheet.setColumnWidth(0, 14*256);

   workbook.write(fileout);
  }

 }
}

您在英语(加拿大)语言环境中的社会保险号码必须为:

...
specialSIN.setDataFormat(format.getFormat("000 000 000"));
...
cell.setCellValue(46454286);
...