日语字符在ReadOnlySharedStringsTable中无法正确显示

时间:2015-11-05 02:12:43

标签: java excel character-encoding character

我在Excel文件中读取日文字符时遇到问题。读者的构造函数是:

public XExcelFileReader(final String excelPath) throws Exception {
    this.opcPkg = OPCPackage.open(excelPath, PackageAccess.READ);
    this.stringsTable = new ReadOnlySharedStringsTable(this.opcPkg);

    XSSFReader xssfReader = new XSSFReader(this.opcPkg);
    XMLInputFactory factory = XMLInputFactory.newInstance();
    InputStream inputStream = xssfReader.getSheetsData().next();
    this.xmlReader = factory.createXMLStreamReader(inputStream);

    while (this.xmlReader.hasNext()) {
      this.xmlReader.next();
      if (this.xmlReader.isStartElement()) {
        if (this.xmlReader.getLocalName().equals("sheetData"))
          break;
      }
    }
  }

此时,stringsTable具有日语字符,例如予算ヨサン,但在Excel文件中,它只读为予算。有些显示在Excel文件中,但有些则不显示。我不确定它出错的地方,编码是UTF-8。

我正在阅读一个大型Excel文件,我尝试创建一个工作簿,但它会发出内存错误,所以使用它不是一个选项。

知道它可能出错的地方吗?

1 个答案:

答案 0 :(得分:0)

找到答案。将构造函数修改为:

public XExcelFileReader(final String excelPath) throws Exception {
    this.opcPkg = OPCPackage.open(excelPath, PackageAccess.READ);
    XSSFReader xssfReader = new XSSFReader(this.opcPkg);
    this.stringsTable = xssfReader.getSharedStringsTable();

    XMLInputFactory factory = XMLInputFactory.newInstance();
    InputStream inputStream = xssfReader.getSheetsData().next();
    this.xmlReader = factory.createXMLStreamReader(inputStream);

    while (this.xmlReader.hasNext()) {
      this.xmlReader.next();
      if (this.xmlReader.isStartElement()) {
        if (this.xmlReader.getLocalName().equals("sheetData")) {
          break;
        }
      }
    }
  }

并将stringsTable更改为SharedStringsTable。我不确定为什么XSSFReader必须先行。任何能够解释的人都非常欢迎这样做。