我有一些程序,我在Java上使用poi包开发了一些程序,它从一个word文件中获取一些内容并将其注入到新文件中。
新文件是根据现有文件模板生成的,并将内容注入表中。
大部分内容都是希伯来语。
问题是生成的所有内容都会出现校对警告(见图),尽管拼写正确。
复制到另一个文件并不能解决问题(但是如果我手动输入新单词,文件会很好地纠正),这是一个非常烦人的问题。
我希望校样检查能够顺利进行。
我用谷歌搜索了一下,但没有找到解决方案。
有人有线索吗?
这是将内容注入到表中的方法。
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
}
根据屏幕截图,您的 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) 设置,以免增加进一步的复杂性。