NPOI:像Excel格式化一样实现货币格式

在这里,我看到了一些问题(比如这个问题),询问如果Excel中的单元格可以通过NPOI / POI进行格式化,就像使用Excel格式化一样 。 和大多数人一样,我必须处理货币和date时间问题。 这里让我问一下,如何格式化可以实现,如果它已被格式化为Excel? (我会自己回答这个问题来演示如何去做。)

设置:Windows 10,英语,地区:台湾Excel格式:XLSX(版本2007及更高版本)

(对不起,关于这个问题的各种编辑,因为我已经在意想不到的时间按下了“回车”button。)

如果您将单元格设置为“货币”,则有四种select: Excel货币格式

每种风格的内部格式如下:

  1. -NT $ 1,234.10
    <numFmt formatCode =“”NT $“#,## 0.00”numFmtId =“164”/>

  2. [红色] NT $ 1,234.10
    <numFmt formatCode =“”NT $“#,## 0.00; [Red]”NT $“#,## 0.00”numFmtId =“164”/>

  3. -NT $ 1,234.10
    <numFmt formatCode =“”NT $“#,## 0.00 _);(”NT $“#,## 0.00)”numFmtId =“ 7 ”/>

  4. [红色] -NT $ 1,234.10
    <numFmt formatCode =“”NT $“#,## 0.00 _); [Red](”NT $“#,## 0.00)”numFmtId =“ 8 ”/>

注意:NT $前后有一对双引号(“)。

(要获取XLSX的内部格式,只需将其解压缩即可。样式信息可在<unzip dir> \ xl \ Styles.xml中find,如果需要更多信息,请查看此答案 。

(仅供参考:在formatCode ,'0'代表一个数字,'#'代表一个数字,但是如果数字不够大则不会出现,所以小于1000的数字不会有逗号。 '_'是一个空格,在格式3中,'1.75'显示为'NT $ 1.75',最后一个空格。

(FYI:在numFmtId ,对于情况1和情况2,数字164是用户定义的;对于情况3和4,数字7和8是内置样式) 。

对于使用POI / NPOI的开发人员,您可以使用0x7或0x8来了解如果使用Build In Format格式化货币列,则只能得到第三个或第四个选项。 你不能得到第一个或第二个select。

为了得到第一个select,你build立在样式0x7 "$#,##0.00);($#,##0.00)" 。 您需要在其前面添加货币符号和双引号

 styleCurrency.DataFormat = workbook.CreateDataFormat().GetFormat("\"NT$\"#,##0.00"); 

将此格式应用于具有编号的单元格。 一旦你打开Excel结果文件,右键点击检查格式,你会看到第一个select。

请随时评论这个职位。