我正在使用 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 文件尝试了完整的示例代码,但出现了有关无法识别的方法的编译错误。
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
}