Java 修改了Apache POI自定义数据格式
我正在使用ApachePOI修改一个Excel文件,并在其中放入一些数据。 我尝试的大部分都很顺利。但是,我的货币格式设置没有100%正确 我想要的是我的货币格式像Java 修改了Apache POI自定义数据格式,java,excel,apache-poi,Java,Excel,Apache Poi,我正在使用ApachePOI修改一个Excel文件,并在其中放入一些数据。 我尝试的大部分都很顺利。但是,我的货币格式设置没有100%正确 我想要的是我的货币格式像1000,43欧元。因此,左边是欧元符号,右边是金额,用点作为千位分隔符,逗号作为十进制分隔符,两位小数 如果我在Excel中这样做并应用此自定义格式规则,它会起作用:“\u[$-nl-BE]*.\u35;.\ u35;.\ u35; 0,00\u[$-nl-BE]*.\u35; 0,00\u35;.\ u[$-nl-BE]*\\“-
1000,43欧元。因此,左边是欧元符号,右边是金额,用点作为千位分隔符,逗号作为十进制分隔符,两位小数
如果我在Excel中这样做并应用此自定义格式规则,它会起作用:“\u[$-nl-BE]*.\u35;.\ u35;.\ u35; 0,00\u[$-nl-BE]*.\u35; 0,00\u35;.\ u[$-nl-BE]*\\“-\”?\u35;
所以我只是复制了这个规则并通过Apache POI应用它:
XSSFDataFormat dataFormat = (XSSFDataFormat) workbook.createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat("_ [$€-nl-BE] * #.##0,00_ ;_ [$€-nl-BE] * -#.##0,00_ ;_ [$€-nl-BE] * \"-\"??_ ;_ @_ "));
然而,这导致了一些略微不同的结果:1.0004300欧元
。你可以看到,除了小数外,它进行得很顺利。有4个而不是2个。。。
当我在Excel中查看自定义格式时,它也略有不同(注意4个零):\u[$-nl BE]*.\u35;##000000 35;[$€-nl BE]*-####000000#[$€-nl BE]*“-”@_代码>
所以我想知道有人(ApachePOI或Excel)在某个地方输入4位小数而不是我定义的2位小数会有什么问题。请注意,如果我在Excel中将它改回2位小数,它将再次显示正确。即使在保存并关闭并重新打开文档之后。Apache poi
也会创建*.xlsx
文件,因为Excel
会存储该文件。在存储器中,数字格式从不本地化,而是始终采用en_US
格式。只有Excel
GUI
才能本地化数字格式
因此,对于存储,您的数字格式必须是
"_ [$€-nl-BE] * #,##0.00_ ;_ [$€-nl-BE] * -#,##0.00_ ;_ [$€-nl-BE] * \"-\"??_ ;_ @_ "
注:十进制分隔符是,
,千位分隔符是,
,这是因为en_US
locale
如果在本地化的Excel
GUI
中打开,则会更改为特定于区域设置的十进制分隔符和千位分隔符
但是Excel本身也没有以数字格式存储像NLBE
这样的语言标记。相反,它使用了。这是NLBE
的813
。因此,使用与[$€-813]
相同的[$€-nl BE]
会更好
以下内容也适用于我的德语Excel
:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
class CreateExcelCustomNumberFormat {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
DataFormat dataFormat = workbook.createDataFormat();
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(dataFormat.getFormat("_ [$€-813] * #,##0.00_ ;_ [$€-813] * -#,##0.00_ ;_ [$€-813] * \"-\"??_ ;_ @_ "));
Cell cell = workbook.createSheet().createRow(0).createCell(0);
cell.setCellValue(1000.43);
cell.setCellStyle(cellStyle);
FileOutputStream out = new FileOutputStream("Excel.xlsx");
workbook.write(out);
out.close();
workbook.close();
}
}
此代码使用当前的apache poi 4.1.2
和Excel 2016
进行测试,它是否与XSSFDataFormat dataFormat=workbook.getCreationHelper().createDataFormat()一起工作
而不是XSSFDataFormat dataFormat=(XSSFDataFormat)工作簿。createDataFormat()代码>?@deHaar不,没有任何区别。。。因此我将其更改为:XSSFDataFormat dataFormat1=(XSSFDataFormat)工作簿。getCreationHelper().createDataFormat();cellStyle.setDataFormat(dataFormat1.getFormat(“\u[$-nl BE]*\u35;.\ u35; \ 0,00\u35;;\ u[$-nl BE]*-\u35;.\ u35;-0,00\u35;-\ u35;-nl BE]*\“-”?\u35;代码>这一个是否如预期工作?不,没有,结果相同…感谢您的输入,我确实更改了千分位数和小数点分隔符,但现在当我打开Excel时,它说有一些数据问题,它希望尝试从中恢复,当我这样做时,我可以看到金额不再格式化…@Dirkvarnckaert:我给了你一个完整的例子,它是使用当前的apache poi 4.1.2
和Excel 2016
测试的。所以我无法重现您的问题。@Dirkvarnckaert:您在格式代码中把空格放在最后一个下划线后面了吗?所以dataFormat.getFormat(“…;@u”)
dataFormat.getFormat(“…;@”)
将是错误的。这确实是我的问题!谢谢你向我指出这一点!:-)它现在起作用了!