package com.estate.expert.admin.stat.report.render;
|
|
import com.deepoove.poi.XWPFTemplate;
|
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber;
|
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumPr;
|
|
import java.math.BigInteger;
|
|
/**
|
* 修复模板中缺失层级的编号段落,避免 POI 转换时读取 ilvl 空指针。
|
*/
|
public final class WordNumberingSanitizer {
|
|
private WordNumberingSanitizer() {
|
}
|
|
public static XWPFTemplate sanitize(XWPFTemplate template) {
|
if (template == null) {
|
return null;
|
}
|
|
sanitizeDocument(template.getXWPFDocument());
|
return template;
|
}
|
|
private static void sanitizeDocument(XWPFDocument document) {
|
if (document == null) {
|
return;
|
}
|
|
document.getParagraphs().forEach(WordNumberingSanitizer::sanitizeParagraph);
|
document.getTables().forEach(table -> table.getRows().forEach(row ->
|
row.getTableCells().forEach(WordNumberingSanitizer::sanitizeCell)));
|
document.getHeaderList().forEach(header -> header.getParagraphs().forEach(WordNumberingSanitizer::sanitizeParagraph));
|
document.getFooterList().forEach(footer -> footer.getParagraphs().forEach(WordNumberingSanitizer::sanitizeParagraph));
|
}
|
|
private static void sanitizeCell(XWPFTableCell cell) {
|
if (cell == null) {
|
return;
|
}
|
cell.getParagraphs().forEach(WordNumberingSanitizer::sanitizeParagraph);
|
cell.getTables().forEach(table -> table.getRows().forEach(row ->
|
row.getTableCells().forEach(WordNumberingSanitizer::sanitizeCell)));
|
}
|
|
private static void sanitizeParagraph(XWPFParagraph paragraph) {
|
if (paragraph == null || !paragraph.getCTP().isSetPPr()) {
|
return;
|
}
|
|
var paragraphProperties = paragraph.getCTP().getPPr();
|
if (!paragraphProperties.isSetNumPr()) {
|
return;
|
}
|
|
CTNumPr numPr = paragraphProperties.getNumPr();
|
if (numPr.getNumId() != null && numPr.getIlvl() == null) {
|
CTDecimalNumber ilvl = numPr.addNewIlvl();
|
ilvl.setVal(BigInteger.ZERO);
|
}
|
}
|
}
|