为了账号安全,请及时绑定邮箱和手机立即绑定

POI 电子表格本地化

POI 电子表格本地化

蓝山帝景 2023-02-16 16:29:53
使用Apache POI OOXML 和XSSF 模式,创建一个新的工作簿,如何设置电子表格的语言(即英语(美国))?我在上面找不到任何东西。该设置不需要是特定于单元格的,应该适用于所有工作表。我正在使用 POI 4.1.0 版。
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

文件中工作表数据的存储Excel未本地化。工作表数据的存储在函数名称、列表定界符、小数点和千位定界符方面始终是美国英语。只有 Excel 应用程序是本地化的。Excel GUI从文件中读取数据,然后翻译函数名称、列表定界符和小数点以及千位定界符。


让我们举个例子:


import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import java.util.GregorianCalendar;


class CreateExcel {


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


  try (Workbook workbook = new XSSFWorkbook(); 

       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {


   Object[][] data = new Object[][] {

    new Object[] {"Value", "Date", "Formatted value", "Formula"},

    new Object[] {123.456789, new GregorianCalendar(2019, 0, 15), 123.456789, "ROUND(A2,2)"},

    new Object[] {1234.56789, new GregorianCalendar(2019, 5, 15), 1234.56789, "ROUND(A3,2)"}

   };


   DataFormat dataFormat = workbook.createDataFormat();

   CellStyle dateStyle = workbook.createCellStyle();

   dateStyle.setDataFormat(dataFormat.getFormat("DDDD, MMMM, DD, YYYY"));

   CellStyle numberStyle = workbook.createCellStyle();

   numberStyle.setDataFormat(dataFormat.getFormat("#,##0.00 \" Coins\""));


   Sheet sheet = workbook.createSheet(); 


   for (int r = 0; r < data.length; r++) {

    Row row = sheet.createRow(r);

    for (int c = 0; c < data[0].length; c++) {

     Cell cell = row.createCell(c);


     if (r == 0) cell.setCellValue((String)data[r][c]);

     if (r > 0 && c == 0) {

      cell.setCellValue((Double)data[r][c]);

     } else if (r > 0 && c == 1) {

      cell.setCellValue((GregorianCalendar)data[r][c]);

      cell.setCellStyle(dateStyle);

     } else if (r > 0 && c == 2) {

      cell.setCellValue((Double)data[r][c]);

      cell.setCellStyle(numberStyle);

     } else if (r > 0 && c == 3) {

      cell.setCellFormula((String)data[r][c]);

     }

    }

   }


   for (int c = 0; c < data[0].length; c++) {

    sheet.autoSizeColumn(c);

   }


   workbook.write(fileout);

  }


 }

}

如您所见,代码中没有任何内容是本地化的。都是en_US。函数名ROUND在公式中,函数参数之间的分隔符是逗号,同样是列表分隔符,double值中的小数点分隔符是点。数字格式代码也是en_US.


文件中存储的内容没有Excel.xlsx以任何方式本地化。


但是如果我用Excel.xlsx我的 German打开Excel,那么它看起来像:

//img1.sycdn.imooc.com//63edead10001ec3e10190321.jpg

注意公式=RUNDEN(A3;2)。函数名称翻译成德语,函数参数之间的分隔符是分号,同样是列表分隔符,double 值中的小数点分隔符是逗号,千位分隔符是点。

此外,数字格式代码现在是德语:

//img1.sycdn.imooc.com//63edeadd0001076405380454.jpg

为什么是这样?主要是因为是德文Excel申请。但也因为Windows决定日期格式的区域设置

//img1.sycdn.imooc.com//63edeaea00017eb404700539.jpg

...和十进制分隔符、列表分隔符和千位分隔符。

//img1.sycdn.imooc.com//63edeaf60001eb5604630571.jpg


查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信