Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改了Apache POI自定义数据格式_Java_Excel_Apache Poi - Fatal编程技术网

Java 修改了Apache POI自定义数据格式

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]*\\“-

我正在使用ApachePOI修改一个Excel文件,并在其中放入一些数据。 我尝试的大部分都很顺利。但是,我的货币格式设置没有100%正确

我想要的是我的货币格式像
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(“…;@”)
将是错误的。这确实是我的问题!谢谢你向我指出这一点!:-)它现在起作用了!