POI word文件生成器,生成充满错误校对警告的文件

问题描述 投票:0回答:1

我有一些程序,我在Java上使用poi包开发了一些程序,它从一个word文件中获取一些内容并将其注入到新文件中。

新文件是根据现有文件模板生成的,并将内容注入表中。

大部分内容都是希伯来语。

问题是生成的所有内容都会出现校对警告(见图),尽管拼写正确。

problem

复制到另一个文件并不能解决问题(但是如果我手动输入新单词,文件会很好地纠正),这是一个非常烦人的问题。

我希望校样检查能够顺利进行。

我用谷歌搜索了一下,但没有找到解决方案。

有人有线索吗?

这是将内容注入到表中的方法。

public boolean fillInTable() throws IOException {

    System.out.println("fillInTable -current data = " + data);
    XWPFTable table = document.getTables().get(0);

    
    boolean moreResults = false;
    ListIterator<MichrazOutputLine> lines = data.listIterator();
    

    while(lines.hasNext()) {
        XWPFTableRow row4 = table.getRow(table.getRows().size()-1);
        XWPFTableRow tableRow = table.createRow();
        MichrazOutputLine currLine = lines.next();
        tableRow.getCell(0).setText((rowIndex++) + ".");
        
        
        for(int i = 0; i < parameters.size(); i++) {
            
            SearchParameter<?> curr = parameters.get(i);
            if(curr.isOutput()) {
                
                
                String value = "";
                
                switch(curr.getAppCriteria()){
                    
                case CUSTOMER_NAME:
                    value = currLine.getCustomerName();
                    break;
                case DATE:
                    value = currLine.getYear();
                    break;
                case EMPLOYEES_NUMBER:
                    value = currLine.getEmployeeNum();
                    break;
                case PROJECT_DESCRIPTION:
                    value = currLine.getProjectDescription();
                    break;
                case WORK_HOURS:
                    value = currLine.getWorkHoursSum();
                    break;
                case BUDGET:
                    value = currLine.getBudget();
                    break;
                case RECOMMENDER:
                    value = currLine.getRecommender();
                    break;
                case FILE_PATH:
                    value = currLine.getFilePath();
                    break;
                    
                    
                    
                }           
                            

                                    
                
                tableRow.getCell(curr.getOutputCellIndex()).setText(value);

            }
        }
        
        


        
        lines.remove();


        if(table.getRows().size()-1> maxResult-1) {


            dataFull = true;
            System.out.println("fillInTable -data finished  = " + data);

            return true;
            
            
        }   


    }
    System.out.println("fillInTable -data finished  = " + data);


    return moreResults;//true - continue the process
}
java apache-poi ms-office
1个回答
3
投票

根据屏幕截图,您的 Word 应用程序似乎无法正确检测语言。是希伯来语吗?如果无法正确检测语言,校对(拼写检查)将使用默认校对语言。在您的 Word 应用程序中,这似乎也不是希伯来语。

您可以通过设置与文本运行关联的语言标签来帮助Word应用程序正确检测语言。请参阅XWPFRun.setLang

完整示例:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

public class CreateWordForeignLanguages {

 public static void main(String[] args) throws Exception {
     
  XWPFDocument document = new XWPFDocument();

  XWPFParagraph paragraph;
  XWPFRun run;

  paragraph = document.createParagraph();
  run = paragraph.createRun();
  run.setText("Paragraph containing English text");
  run.setLang("en-US");
  
  paragraph = document.createParagraph();
  run = paragraph.createRun();
  run.setText("Absatz mit deutschsprachigem Text");
  run.setLang("de-DE");
  
  paragraph = document.createParagraph();
  run = paragraph.createRun();
  run.setText("Абзац с текстом на русском языке");
  run.setLang("ru-RU");
 
  paragraph = document.createParagraph();
  run = paragraph.createRun();
  run.setText("פסקה עם טקסט בעברית");
  run.setLang("he-IL");
 
  paragraph = document.createParagraph();

  FileOutputStream out = new FileOutputStream("./CreateWordForeignLanguages.docx");
  document.write(out);
  out.close();
  document.close();

 }
}

这应该会生成没有红色波浪线的文档。


使用表格,尤其是使用

XWPFTableCell.setText()
会增加复杂性。
XWPFTableCell.setText()
在内部创建
XWPFParagraph
XWPFRun
,并且必须为这些
XWPFRun
设置语言设置。但访问
XWPFRun
并不像应有的那么容易。需要迭代所有
XWPFParagraph
XWPFRun? s in the 
XWPFTableCell` 才能运行文本。

再次完整示例:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

public class CreateWordForeignLanguagesInTable {

 public static void main(String[] args) throws Exception {
     
  XWPFDocument document = new XWPFDocument();
  
  XWPFTable table;
  XWPFTableRow tableRow;
  XWPFTableCell tableCell;
    
  XWPFParagraph paragraph = document.createParagraph();
  
  table = document.createTable(1, 3);
  
  paragraph = document.createParagraph();
  
  tableRow = table.getRow(0);
  tableRow.getCell(0).setText("German");
  tableRow.getCell(1).setText("Russian");
  tableRow.getCell(2).setText("Hebrew");
  for (XWPFTableCell tC : tableRow.getTableCells()) {
   for (XWPFParagraph p : tC.getParagraphs()) {
    for (XWPFRun r : p.getRuns()) {
     r.setLang("en-US");
    }
   }       
  }
  
  tableRow = table.createRow();
  
  tableCell = tableRow.getCell(0);
  tableCell.setText("Absatz mit deutschsprachigem Text");
  for (XWPFParagraph p : tableCell.getParagraphs()) {
   for (XWPFRun r : p.getRuns()) {
    r.setLang("de-DE");
   }
  }    
  
  tableCell = tableRow.getCell(1);
  tableCell.setText("Абзац с текстом на русском языке");
  for (XWPFParagraph p : tableCell.getParagraphs()) {
   for (XWPFRun r : p.getRuns()) {
    r.setLang("ru-RU");
   }
  }    
  
  tableCell = tableRow.getCell(2);
  tableCell.setText("פסקה עם טקסט בעברית");
  for (XWPFParagraph p : tableCell.getParagraphs()) {
   for (XWPFRun r : p.getRuns()) {
    r.setLang("he-IL");
   }
  }    

  FileOutputStream out = new FileOutputStream("./CreateWordForeignLanguagesInTable.docx");
  document.write(out);
  out.close();
  document.close();

 }
}

注意:此示例忽略双向 (Bidi) 设置,以免增加进一步的复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.