Character encoding 如何从XLSX文件中读取汉字?(爪哇)

Character encoding 如何从XLSX文件中读取汉字?(爪哇),character-encoding,apache-poi,Character Encoding,Apache Poi,我已经可以从xlsx单元格中读取文本,并且: String s = cell.getStringCellValue(); 然而,当打印出这个字符串时,我得到了垃圾结果。为了解决这个问题,我使用了互联网 我尝试了8种不同的方法,因此发现还没有一个有效的答案。我将IDE和XLSX文件的默认编码设置为UTF-8。可以正确显示拼音 有没有人知道什么地方可能出错以及如何解决这个问题 不清楚你使用汉字的问题来自何方,但我无法重现 我有以下Excel工作簿: 下面是简单的代码: import org.ap

我已经可以从xlsx单元格中读取文本,并且:

String s = cell.getStringCellValue();
然而,当打印出这个字符串时,我得到了垃圾结果。为了解决这个问题,我使用了互联网

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


有没有人知道什么地方可能出错以及如何解决这个问题

不清楚你使用汉字的问题来自何方,但我无法重现

我有以下Excel工作簿:

下面是简单的代码:

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();
  }
 }
}
产生:

如果问题是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记事本中,此文件也应具有适当的内容:

您还可以使用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();
  }
 }
}

这只是最简单的方法,而且只用于获取测试输出,因为它使用Swing在AWT线程问题上不是正确的方法。

不清楚您使用汉字的问题来自何处,但我无法重现它

我有以下Excel工作簿:

下面是简单的代码:

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();
  }
 }
}
产生:

如果问题是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记事本中,此文件也应具有适当的内容:

您还可以使用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不是正确的方法。

我在从Excel文件提取波斯语文本时也遇到了同样的问题。 我正在使用ECLIPSE并更改如下设置:

  • 窗口->首选项->展开常规和
  • 单击“工作区”,文本文件编码(接近底部)有一个编码选择器
  • 选择“其他”单选按钮->从下拉列表中选择UTF-8。 单击“应用并确定”按钮或仅单击“确定”按钮

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

  • 窗口->首选项->展开常规和
  • 单击“工作区”,文本文件编码(接近底部)有一个编码选择器
  • 选择“其他”单选按钮->从下拉列表中选择UTF-8。 单击“应用并确定”按钮或仅单击“确定”按钮

  • 使用此代码:

    String new_Str=新字符串(excelfield.getBytes(1),“Cp1256”);/。。。。波斯语文本

    String new_Str=新字符串(excelfield.getBytes(1),“UTF-8”);/。。。。到中文文本

    String new_Str=新字符串(您的_Str.getBytes(),“Cp1256”)


    String new_Str=新字符串(您的_Str.getBytes(),“UTF-8”)

    使用以下代码:

    String new_Str=新字符串(excelfield.getBytes(1),“Cp1256”);/。。。。波斯语文本

    String new_Str=新字符串(excelfield.getBytes(1),“UTF-8”);/。。。。到中文文本

    String new_Str=新字符串(您的_Str.getBytes(),“Cp1256”)


    String new_Str=新字符串(您的_Str.getBytes(),“UTF-8”)

    你怎么印的?你在哪里印刷?结果如何?我在控制台用System.out.println(s)打印了它;-我在IDE中试过,然后在cmd窗口中试过。我能看到一个有问号的正方形。然而,我可以肯定:这些符号确实包含正确的信息。我将它复制粘贴到编辑器中,并从excel文件中获取汉字。Windows cmd窗口?您为Windows会话配置了什么语言/区域设置/区域?@Alastair McCormack:虽然您可能是对的,而且中文区域设置将使CMD能够显示中文字符,但这真的是解决方案吗?我的意思是它是Unicode,我们正处在21世纪。操作系统应该能够正确处理Unicode。遗憾的是,Windows 10到目前为止还不能在其控制台中执行此操作。@AxelRichter确实情况很糟糕,但Java也有一些问题(Windows在其他地方有很好的Unicode支持,如文件名处理和剪贴板支持)。可以在cmd控制台上显示Unicode,但要求应用程序使用低级访问,而不是DOS兼容模式。看,这使Python能够做到这一点。我不知道JNI是否可以做类似的事情。你如何打印它?你在哪里印刷?结果如何?我在控制台用System.out.println(s)打印了它;-我在IDE中试过,然后在cmd窗口中试过。我能看到一个有问号的正方形。然而,我可以肯定:这些符号确实包含正确的信息。我将它复制粘贴到编辑器中,并从excel文件中获取汉字。Windows cmd窗口?您为Windows会话配置了什么语言/区域设置/区域?@Alastair McCormack:虽然您可能是对的,而且中文区域设置将使CMD能够显示中文字符,但这真的是解决方案吗?我的意思是它是Unicode,我们正处在21世纪。操作系统应该能够正确处理Unicode。遗憾的是,Windows 10到目前为止还不能在其控制台中执行此操作。@AxelRichter确实情况很糟糕,但Java也有一些问题(Windows在其他地方有很好的Unicode支持,如文件名处理和剪贴板支持)。可以在cmd控制台上显示Unicode,但要求应用程序使用低级访问,而不是DOS兼容模式。看,这使Python能够做到这一点。我不知道JNI是否也能做到类似的事情。