java - 使用 Apache POI 读取 MS-word 文件中表格单元格内的 UTF-8 编码文本内容

标签 java utf-8 apache-poi

我正在尝试使用 apache poi 读取 Microsoft Word 文档(docx 文件)中的表格和精确数据。该文件包含 UTF-8 编码字符(僧伽罗语)。我正在使用以下代码块。

FileInputStream fis = new FileInputStream("path\\to\\file.docx");
XWPFDocument doc = new XWPFDocument(fis);
Iterator<IBodyElement> iter = doc.getBodyElementsIterator();
while (iter.hasNext()) {
    IBodyElement elem = iter.next();
    if (elem instanceof XWPFTable) {
        List<XWPFTableRow> rows = ((XWPFTable) elem).getRows();
        for(XWPFTableRow row :rows){
            List<XWPFTableCell> cells = row.getTableCells();
            for(XWPFTableCell cell : cells){
                PrintStream out = new PrintStream(System.out, true, "UTF-8");
                out.println(cell.getText());
            }
        }
    }
}

但是我在输出控制台中没有得到正确的 UTF-8 字符。

console output

我已经引用了几种解决方案,包括以下内容。

How to parse UTF-8 characters in Excel files using POI |我正在尝试读取 Word 文件中的表格。所以我的 Cell 对象没有 getStringCellValue() 方法。

http://www.herongyang.com/Java-Tools/native2ascii-Set-UTF-8-Encoding-in-PrintStream.html |我已经尝试过这个解决方案,但它不起作用。

有谁知道如何使用apache poi读取word文件中的UTF-8编码字符?

最佳答案

我找到了一个为单元格设置字体(作为图表)的解决方案。

代码:

private static final String FILE_NAME = "/tmp/Diskade.docx";

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

        FileInputStream fis = new FileInputStream(FILE_NAME);
        XWPFDocument doc = new XWPFDocument(fis);

        Iterator<IBodyElement> iter = doc.getBodyElementsIterator();
        while (iter.hasNext()) {
            IBodyElement elem = iter.next();
            if (elem instanceof XWPFTable) {

                List<XWPFTableRow> rows = ((XWPFTable) elem).getRows();
                for(XWPFTableRow row :rows){
                    List<XWPFTableCell> cells = row.getTableCells();

                    for(XWPFTableCell cell : cells){

                        String celltext = cell.getText();
                        XWPFParagraph paragraph = cell.addParagraph();
                        setRun(paragraph.createRun() , "Arial" , 10, "2b5079" , celltext , false, false);
                        System.out.print(cell.getParagraphs().get(0).getParagraphText() + " - ");

                    }
                    System.out.println();
                }
            }
        }
    }

    private static void setRun (XWPFRun run , String fontFamily , int fontSize , String colorRGB , String text , boolean bold , boolean addBreak) {
        run.setFontFamily(fontFamily);
        run.setFontSize(fontSize);
        run.setColor(colorRGB);
        run.setText(text);
        run.setBold(bold);
        if (addBreak) run.addBreak();
    }


编辑:
后来我注意到,实际上添加段落就足够了。您不需要 setRun 方法或将其调用为 setRun(paragraph.createRun() , "Arial", 10, "2b5079", celltext , false, false);

enter image description here

看看是否可以通过编码来完成任何事情。 (因为,对我来说,一旦加载字体,即使没有段落也可以正常工作)

关于java - 使用 Apache POI 读取 MS-word 文件中表格单元格内的 UTF-8 编码文本内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46020769/

相关文章:

php - 转换 mysql 字符

java - Apache POI 无法从 Excel 单元格中正确读取秒数

Java Home 不同吗?如何在Android Studio中正确设置?

java - 如何设置 Handler/Looper 在 Service 回调中调用 requestLocationUpdates

java - 将 UTF-8 字节数组编码和解码为字符串

java - 如何禁止使用这些字符 € [\] ^ { | } ~ 在 java 字符串中

java - 当我在 apache poi 库中使用 Calibri 字体时,可运行 jar 中的列宽无法正确显示

java - 为 HSSFCellStyle 设置前景色总是黑色

java - 在对象上同步并更改引用

java - 如何有条件地将 Java 中的参数传递给采用可变数量参数的方法?