为包含 Word 字段的整个 XWPF 段落设置字体属性的示例代码存在问题

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

我正在使用 POI 5.2.3,在问题的答案中查找 getRPr 方法 isSetRFonts、isSetSz、isSetSzCs 以及 setParagraphRunProperties 中相应的“gets”时遇到问题:https://stackoverflow.com/questions/ 64074191/apache-poi-java-如何更改字体名称和列表编号的大小/78245518#78245518

自从 Axel Richter 上面的回复以来,POI 似乎发生了一些变化,但在搜索 Apache POI 更改文档但没有成功后,我不知道下一步该去哪里。

任何帮助将不胜感激。

Axel Richter 的原始代码如下。

import java.io.FileOutputStream;

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

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat;

import java.math.BigInteger;

public class CreateWordNumberingsFormatted {

 static BigInteger getNewDecimalNumberingId(XWPFDocument document, BigInteger abstractNumID) {
  CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
  cTAbstractNum.setAbstractNumId(abstractNumID);

  CTLvl cTLvl = cTAbstractNum.addNewLvl();
  cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
  cTLvl.addNewLvlText().setVal("%1.");
  cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

  XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);

  XWPFNumbering numbering = document.createNumbering();

  abstractNumID = numbering.addAbstractNum(abstractNum);

  BigInteger numID = numbering.addNum(abstractNumID);

  return numID;
 }

 static void setParagraphRunProperties(XWPFParagraph paragraph, String fontFamily, int fontSize) {
  if (!paragraph.getCTP().isSetPPr()) paragraph.getCTP().addNewPPr();
  if (!paragraph.getCTP().getPPr().isSetRPr()) paragraph.getCTP().getPPr().addNewRPr();
  if (!paragraph.getCTP().getPPr().getRPr().isSetRFonts()) paragraph.getCTP().getPPr().getRPr().addNewRFonts();
  if (!paragraph.getCTP().getPPr().getRPr().isSetSz()) paragraph.getCTP().getPPr().getRPr().addNewSz();
  if (!paragraph.getCTP().getPPr().getRPr().isSetSzCs()) paragraph.getCTP().getPPr().getRPr().addNewSzCs();
  paragraph.getCTP().getPPr().getRPr().getRFonts().setAscii(fontFamily);
  paragraph.getCTP().getPPr().getRPr().getRFonts().setHAnsi(fontFamily);
  paragraph.getCTP().getPPr().getRPr().getSz().setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
  paragraph.getCTP().getPPr().getRPr().getSzCs().setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
 }


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

  XWPFDocument document = new XWPFDocument();

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun();  
  run.setText("The paragraph before first numbering:");

  int abstractNumID = 0;

  //get NumID for first decimal numbering
  BigInteger numID = getNewDecimalNumberingId(document, BigInteger.valueOf(abstractNumID++));

  //now apply that NumID to first list
  String fontFamily = "Times New Roman";
  int fontSize = 24;
  //first paragraph
  paragraph = document.createParagraph();
  //apply NumID
  paragraph.setNumID(numID);
  //set paragraph run properties
  setParagraphRunProperties(paragraph, fontFamily, fontSize);
  //create text runs and format
  run = paragraph.createRun(); 
  run.setFontFamily(fontFamily); 
  run.setFontSize(fontSize); 
  run.setText("One");
  //further numbered paragraphs
  paragraph = document.createParagraph();
  paragraph.setNumID(numID);
  setParagraphRunProperties(paragraph, fontFamily, fontSize);
  run = paragraph.createRun(); 
  run.setFontFamily(fontFamily); 
  run.setFontSize(fontSize); 
  run.setText("Two");
  paragraph = document.createParagraph();
  paragraph.setNumID(numID);
  setParagraphRunProperties(paragraph, fontFamily, fontSize);
  run = paragraph.createRun(); 
  run.setFontFamily(fontFamily); 
  run.setFontSize(fontSize); 
  run.setText("Three");

  paragraph = document.createParagraph();

  //get NumID forsecond decimal numbering
  numID = getNewDecimalNumberingId(document, BigInteger.valueOf(abstractNumID++));

  //now apply that NumID to second list having different font
  fontFamily = "Courier New";
  fontSize = 32;
  paragraph = document.createParagraph();
  paragraph.setNumID(numID);
  setParagraphRunProperties(paragraph, fontFamily, fontSize);
  run = paragraph.createRun(); 
  run.setFontFamily(fontFamily); 
  run.setFontSize(fontSize); 
  run.setText("One");
  paragraph = document.createParagraph();
  paragraph.setNumID(numID);
  setParagraphRunProperties(paragraph, fontFamily, fontSize);
  run = paragraph.createRun(); 
  run.setFontFamily(fontFamily); 
  run.setFontSize(fontSize); 
  run.setText("Two");
  paragraph = document.createParagraph();
  paragraph.setNumID(numID);
  setParagraphRunProperties(paragraph, fontFamily, fontSize);
  run = paragraph.createRun(); 
  run.setFontFamily(fontFamily); 
  run.setFontSize(fontSize); 
  run.setText("Three");

  paragraph = document.createParagraph();

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

 }
}

使用正确的 POI 5.2.3 jar 文件尝试了完整的示例代码,但出现了有关无法识别的方法的编译错误。

fonts apache-poi field xwpf
1个回答
0
投票

Microsoft 更改了其 XSD,现在声明一个运行属性中可能有 multiple 字体设置和 multiple 大小设置。这就是为什么

XMLBeans
现在为
List
中这些元素的
Array
和/或
CTRPr
生成代码:现在的
CTRPr.getRFontsList
与过去的
CTRPr.getRFonts
,现在的
CTRPr.getSzList
与过去的
CTRPr.getSz
过去,...

所以如果需要检查

CTRPr
是否有字体设置,需要检查
CTRPr.getRFontsList
是否返回一个
java.util.List<CTFonts>
大于0的
size
。而要获取
CTFonts
,需要获取然后该列表中的第一项。与从
java.util.List<CTSz>
获得的
CTRPr.getSzList
相同。

请参阅如何使用最新 Apache POI 5.2.2 的低级 CTRPr 和 CTPPr 类POI 版本从 4.x 升级到 5.x 后缺少的方法了解详细信息。

需要在上面的代码中更改以下内容才能使用 Apache POI 5:

 // version up to Apache POI 4
 // static void setParagraphRunProperties(XWPFParagraph paragraph, String fontFamily, int fontSize) {
  // if (!paragraph.getCTP().isSetPPr()) paragraph.getCTP().addNewPPr();
  // if (!paragraph.getCTP().getPPr().isSetRPr()) paragraph.getCTP().getPPr().addNewRPr();
  // if (!paragraph.getCTP().getPPr().getRPr().isSetRFonts()) paragraph.getCTP().getPPr().getRPr().addNewRFonts();
  // if (!paragraph.getCTP().getPPr().getRPr().isSetSz()) paragraph.getCTP().getPPr().getRPr().addNewSz();
  // if (!paragraph.getCTP().getPPr().getRPr().isSetSzCs()) paragraph.getCTP().getPPr().getRPr().addNewSzCs();
  // paragraph.getCTP().getPPr().getRPr().getRFonts().setAscii(fontFamily);
  // paragraph.getCTP().getPPr().getRPr().getRFonts().setHAnsi(fontFamily);
  // paragraph.getCTP().getPPr().getRPr().getSz().setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
  // paragraph.getCTP().getPPr().getRPr().getSzCs().setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
 // }
 // version from Apache POI 5
 static void setParagraphRunProperties(XWPFParagraph paragraph, String fontFamily, int fontSize) {
  if (!paragraph.getCTP().isSetPPr()) paragraph.getCTP().addNewPPr();
  if (!paragraph.getCTP().getPPr().isSetRPr()) paragraph.getCTP().getPPr().addNewRPr();
  if (paragraph.getCTP().getPPr().getRPr().getRFontsList().size() == 0) paragraph.getCTP().getPPr().getRPr().addNewRFonts();
  if (paragraph.getCTP().getPPr().getRPr().getSzList().size() == 0) paragraph.getCTP().getPPr().getRPr().addNewSz();
  if (paragraph.getCTP().getPPr().getRPr().getSzCsList().size() == 0) paragraph.getCTP().getPPr().getRPr().addNewSzCs();
  paragraph.getCTP().getPPr().getRPr().getRFontsArray(0).setAscii(fontFamily);
  paragraph.getCTP().getPPr().getRPr().getRFontsArray(0).setHAnsi(fontFamily);
  paragraph.getCTP().getPPr().getRPr().getSzArray(0).setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
  paragraph.getCTP().getPPr().getRPr().getSzCsArray(0).setVal(BigInteger.valueOf(fontSize*2)); //measurement unit is half pt
 }
© www.soinside.com 2019 - 2024. All rights reserved.