当前位置: 首页 > 知识库问答 >
问题:

在java poi 4.1.2中从excel表中读取国际货币符号

微生俊健
2023-03-14

我无法读取国际货币和会计数字格式从excel表到java独立应用程序使用poi 4.1.2(XSSF)。只能读取美国语言区符号,但无法读取Java中的其他货币符号。使用货币符号在java DataFormatter中只显示某些格式的单元格值,其他格式用?显示(例如:I/P:$10.00O/P:?10.00)。

记帐号码格式无法读取欧元货币符号(异常:非法参数异常)和一些显示单元数据的货币符号(货币符号和值)。代码:

对于(int i=1;i<=行;i++){

             String ExcelFilename = sheet.getRow(i).getCell(<cell no of file>).getRichStringCellValue().getString().trim();  
         
             if(ExcelFilename.equals("<file name>")) {
             
                 for(int j=0;j<columns;j++) {

                      DataFormatter formatter = new DataFormatter();
                     cell = sheet.getRow(i).getCell(j,Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);

                     String  check= "";                      
                      switch (cell.getCellType()) {
                         case BLANK:
                             check=  formatter.formatCellValue(cell);
                             break;
                          case NUMERIC:
                             check=  formatter.formatCellValue(cell);                                
                             break;
                        case BOOLEAN:
                             check =formatter.formatCellValue(cell);
                             break;
                        case STRING:
                             check=formatter.formatCellValue(cell);
                             break;                        
                        case FORMULA:
                             check=  formatter.formatCellValue(cell);                                                       
                             break;                         
                        default:                              
                             break;
                    }       
                }
            }
    null

共有1个答案

戚建白
2023-03-14

DataFormatter中,当使用货币欧元(EURO)时,将欧元符号放在像Euro1,234.56这样的值前面时,似乎确实存在一个bug。所有使用违约欧元的国家通常不会这样做。他们正在编写类似1234.56欧元的货币,所以在值后面放置欧元符号。

如果在Excel中使用数字格式货币或记帐使用符号Euro(欧元123),那么Excel将创建类似于[$欧元-2]\#,##0.00的数字格式。这意味着货币符号欧元放在价值的前面。但是Apache POI2解释为国家代码,如[$-809]#,##0.00中的809表示大不列颠。因此,由于这种误解,它失败了,因为它没有为代码2找到国家。

一个解决办法是用“\u20ac”替换数据格式字符串中的所有“[$\u20ac-2]”。也就是说,仅用欧元符号替换所有[$欧元-2]

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

import java.io.FileInputStream;
import java.io.PrintWriter;

class ReadExcelUsingDataFormatter {

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

  Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));
  
  DataFormat format = workbook.createDataFormat();
  
  DataFormatter dataFormatter = new DataFormatter();
    
  PrintWriter writer = new PrintWriter("Result.txt", "UTF-8");

  Sheet sheet = workbook.getSheetAt(0);
  for (Row row : sheet) {
   for (Cell cell : row) {
     try {
         String dataFormatString = cell.getCellStyle().getDataFormatString();
         if (dataFormatString.contains("[$\u20AC-2]")) {
             System.out.println(dataFormatString);
             dataFormatString = dataFormatString.replace("[$\u20AC-2]", "\u20AC");
             System.out.println(dataFormatString);
             cell.getCellStyle().setDataFormat(format.getFormat(dataFormatString));
         }
         String value = dataFormatter.formatCellValue(cell);
         System.out.println(value); //This might not be printed correctly because of unicode deficiency of `System.out`. But `Result.txt` should contain it corrcetly.
         writer.print(value + "\t\t");
     } catch (Exception ex) {
         ex.printStackTrace();
     }

   }
   writer.println();
  }
  writer.close();
  workbook.close();
 }
}
 类似资料:
  • 让我们从一段简单的代码开始,用格式化货币: 打印:。 如果你想格式化货币,这是可以的。 但是我想做的是为给定的货币ISO 4217代码(例如JPY)获得货币符号(例如¥)。 我的第一个猜测是尝试使用: 但这为构造函数(en_US)中给定的区域设置提供了货币符号,在我的例子中是$。 有没有办法通过PHP中的货币ISO 4217代码获得货币符号?

  • 在本例中,我们根据美国区域设置和丹麦语区域设置格式化货币。 文件:IOTester.java - 执行上面示例代码,得到以下结果 -

  • 我如何从这个具有LODASH的国家数组中获得每个的货币数组?我以前有这个getCurrencys函数,但是我不能用它获得符号,所以现在我创建了这个,但是它正在创建重复的东西,比如这个

  • 我想在Excel中将“2655.32”输出为“$2655.32”。

  • 问题内容: 假设我提供了一个类似于或类似此字符串的字符串(带有数字和小数点以及一些分隔符,例如或或其他不可预测的字符串)。我需要编写一个方法,该方法接受像上面的参数一样的参数,并分别返回像或的String 。 您能否建议最有效,最易读的代码来实现这一目标? 注意:我知道要遍历每个索引,并检查它的重调谐器是否存在,或者 我正在效率和可读性方面寻找更优化的解决方案 谢谢。 问题答案: 这将删除任何不是

  • 问题内容: 我在获取某个国家的货币代码时遇到问题。我的任务是获取用户的位置,找出他现在所在的国家/地区,并获取该国家/地区的货币代码。以下是从获取的位置获取国家/地区名称和国家/地区代码的代码: 这工作得很好。现在,我应该使用该类来获取对象。我可以使用该方法。但是类中没有构造函数,仅允许将国家/地区代码作为参数传递。表示我无法为该国家/地区创建对象。如何解决呢?提前致谢。 问题答案: 如果国家/地