2017-02-04 2 views
0

я уже могу читать тексты из XLSX клеток и имею:Как читать китайские символы из файла XLSX? (Java)

String s = cell.getStringCellValue(); 

Однако при печати из этой строки, я получаю мусор результатов. Чтобы решить эту проблему, я использовал Интернет.

Я пробовал около 8 различных подходов и, таким образом, нашел, что еще нет рабочего ответа на SO. Я установил кодировку по умолчанию для моей IDE и моих файлов XLSX для UTF-8. Пиньинь может быть правильно отображен.

Есть ли у кого-нибудь идеи, что может быть неправильным и как решить эту проблему?

+2

Как вы его печатаете? Где вы его печатаете? Каков результат? –

+0

Я напечатал его на консоли с помощью System.out.println (s); - Я попробовал это в своей среде IDE, а затем в окне cmd. Я вижу квадрат с вопросительным знаком. Однако я могу утверждать: эти символы содержат правильную информацию. Я копирую его в редактор и получаю китайские символы из моего файла excel. – blauerschluessel

+1

Windows cmd window? Какой язык/язык/регион вы настроили для сеанса Windows? –

ответ

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 это не BLE отображения Unicode символы должным образом в CMD консоли, потому что он не имеет шрифт с глифы для него, а затем записать содержимое в текстовый файл:

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

Вы также можете с помощью Свинг (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 не в правильном направлении с точки зрения проблем Threading AWT.

Смежные вопросы