如何从XLSX文件中读取汉字? (Java)的

时间:2017-02-04 17:18:46

标签: character-encoding apache-poi

我已经可以阅读xlsx单元格的文本了,并且有:

String s = cell.getStringCellValue();

然而,当打印出这个String时,我得到了垃圾结果。为了解决这个问题,我使用了互联网。

我尝试了8种不同的方法,因此发现SO上还没有可行的答案。我将IDE和XLSX文件的默认编码设置为UTF-8。拼音可以正确显示。

有谁知道可能出现的问题以及如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

不清楚使用中文字符的问题来自何处,但我无法重现。

我在Excel中有以下工作簿:

enter image description here

以下简单代码:

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

import java.io.FileInputStream;

class ReadXSSFUnicodeTest {

 public static void main(String[] args) {
  try {

   Workbook wb = WorkbookFactory.create(new FileInputStream("ReadXSSFUnicodeTest.xlsx"));

   Sheet sheet = wb.getSheetAt(0);

   for (Row row : sheet) {
    for (Cell cell : row) {
     String string = cell.getStringCellValue();
     System.out.println(string);
    }
   }

   wb.close();

  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
}

产生

enter image description here

如果问题是Windows无法在CMD控制台中正确显示Unicode字符,因为它没有带字形的字体,请将内容写入文本文件:

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

import java.io.FileInputStream;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;

class ReadXSSFUnicodeTest {

 public static void main(String[] args) {
  try {

   Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("ReadXSSFUnicodeTest.txt"), "UTF-8"));

   Workbook wb = WorkbookFactory.create(new FileInputStream("ReadXSSFUnicodeTest.xlsx"));

   Sheet sheet = wb.getSheetAt(0);

   for (Row row : sheet) {
    for (Cell cell : row) {
     String string = cell.getStringCellValue();
     out.write(string + "\r\n");
     System.out.println(string);
    }
   }
   out.close();   

   wb.close();

  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }
}

即使在Windows记事本中,此文件也应具有适当的内容:

enter image description here

您还可以使用Swing(JTextArea)为测试输出提供自己的输出区域:

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

import java.io.FileInputStream;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;

import javax.swing.*;
import java.awt.*;


class ReadXSSFUnicodeTest {

 public ReadXSSFUnicodeTest() {
  try {

   MySystemOut mySystemOut = new MySystemOut();

   Workbook wb = WorkbookFactory.create(new FileInputStream("ReadXSSFUnicodeTest.xlsx"));

   Sheet sheet = wb.getSheetAt(0);

   for (Row row : sheet) {
    for (Cell cell : row) {
     String string = cell.getStringCellValue();
     //System.out.println(string);
     mySystemOut.println(string);
    }
   }

   wb.close();

  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }

 public static void main(String[] args) {
  ReadXSSFUnicodeTest readXSSFUnicodeTest= new ReadXSSFUnicodeTest();
 }

 private class MySystemOut extends JTextArea {

  private String output = "";

  private MySystemOut() {
   super();  
   this.setLineWrap(true);
   JFrame frame = new JFrame("My System Outputs");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JScrollPane areaScrollPane = new JScrollPane(this);
   areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
   areaScrollPane.setPreferredSize(new Dimension(350, 150));
   frame.getContentPane().add(areaScrollPane, BorderLayout.CENTER);
   frame.pack();
   frame.setVisible(true);  
  }

  private void println(String output) {
   this.output += output + "\r\n";
   this.setText(this.output);
   this.revalidate();
  }
 }
}

这只是最简单的方法,只能获得测试输出,因为它在AWT线程问题方面使用Swing不正确。

答案 1 :(得分:0)

从Excel文件中提取波斯文字时,我遇到了同样的问题。 我正在使用ECLIPSE并更改以下设置:

  1. 窗口->首选项->展开常规和
  2. 单击“工作区”,文本文件编码(在底部附近)具有编码选择器。
  3. 选择“其他”单选按钮->从下拉列表中选择UTF-8。 单击“应用”和“确定”按钮,或者单击“确定”按钮

答案 2 :(得分:0)

使用此代码:

String new_Str = new String(excelfield.getBytes(1),“ Cp1256”); // ....到波斯文字

String new_Str = new String(excelfield.getBytes(1),“ UTF-8”); // ....为中文文本

OR

String new_Str = new String(your_str.getBytes(),“ Cp1256”);

String new_Str = new String(your_str.getBytes(),“ UTF-8”);