java使用apache.poi导出word文件
功能说明:将试卷导出word,并可以打印,装订,效果图:
https://img2023.cnblogs.com/blog/2699913/202307/2699913-20230718094848710-642780924.png
下面是实现代码:
package com.xxxxx.business.course.utils;import com.alibaba.fastjson.JSONObject;import com.deepoove.poi.xwpf.NiceXWPFDocument;import com.xxxxx.business.course.domain.*;import com.xxxxx.business.utils.UtilTools;import com.xxxxx.business.utils.domain.JudgeRule;import com.xxxxx.business.utils.impl.BaseImpl;import com.xxxxx.common.core.domain.R;import com.xxxxx.common.core.utils.DateUtils;import com.xxxxx.common.core.utils.StringUtils;import com.xxxxx.common.core.utils.file.FileTypeUtils;import com.xxxxx.common.core.utils.file.ImageUtils;import com.xxxxx.common.core.utils.reflect.ReflectUtils;import com.xxxxx.common.core.utils.sign.Base64;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;import org.apache.poi.util.IOUtils;import org.apache.poi.util.Units;import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;import org.apache.poi.xwpf.usermodel.*;import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletResponse;import java.awt.image.BufferedImage;import java.io.*;import java.math.BigDecimal;import java.math.BigInteger;import java.math.RoundingMode;import java.text.SimpleDateFormat;import java.util.List;import java.util.*;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;/** * 试卷归档帮助类 */public class VerifyPaperFileUtils extends BaseImpl { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); public static VerifyPaperFileUtils getInstance() { return new VerifyPaperFileUtils(); } private VerifyPaperFileUtils() { } private Integer pageNum = 0; private XWPFDocument docx; private CTSectPr ctSectPr; private QuestionImportRule importRule = QuestionImportRule.getDefaultRule(""); private VerifyPaper verifyPaper; private PaperTemplate paperTemplate; private boolean includeAnswer = false; private String imgRegex = "img"; private String[] quSortNoArr = new String[]{"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十"}; private String rgb_black = "000000"; /** * 外部调用方法,导出word * * @param response * @param verifyPaper * @throws IOException */ public R exportWord(HttpServletResponse response, VerifyPaper verifyPaper, PaperTemplate paperTemplate) throws Exception { this.verifyPaper = verifyPaper; if (paperTemplate == null) paperTemplate = VerifyPaperFileUtils.getDefaultPaperTemplate(); this.paperTemplate = paperTemplate; R r = this.init(); if (!r.isSuccess()) throw new Exception(r.getMsg()); response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); response.setCharacterEncoding("utf-8"); return this.exportWord(response); } /** * 验证相关数据 * * @return */ private R init() { if (this.verifyPaper == null) { return R.fail("未选择试卷"); } if (this.verifyPaper.getVerifyPaperQtList() == null || verifyPaper.getVerifyPaperQtList().size() == 0) { return R.fail("未设置课程题型"); } if (this.verifyPaper.getVerifyPaperQtList().stream().filter(s -> s.getVerifyPaperQuList() == null || s.getVerifyPaperQuList().size() == 0).count() > 0) return R.fail("有题型未设置试题"); return validTemplate(); } private R validTemplate() { if (this.paperTemplate == null) { return R.fail("未设置模板"); } return R.ok(); } /** * 导出word,私有方法 * * @param response * @throws IOException */ private R exportWord(HttpServletResponse response) throws IOException, InvalidFormatException { try { R r = writeWord(); if (!r.isSuccess()) return r; docx.write(response.getOutputStream()); return R.ok(); } catch (Exception e) { logger.error("导出Word异常,{}", e.getMessage()); throw e; } finally { IOUtils.closeQuietly(docx); } } /** * 试题数据写入文档 */ private R writeWord() throws IOException, InvalidFormatException { R r = createDocxTemplate(); if (!r.isSuccess()) return R.fail(r.getMsg()); docx = r.getData(); writePaperInfo(); writeWordQts(); return R.ok(); } /** * 制作模板 * 模板各种设置 * * @return */ private R createDocxTemplate() { XWPFDocument document = new NiceXWPFDocument(); R r = writeWordPageSetting(document); if (!r.isSuccess()) return R.fail(r.getMsg()); //整体设置 writeWordPageSetting(document); //页眉 writeWordHeader(document); //页脚 writeWordFooter(document); return R.ok(document); } /** * 页面设置 * * @return */ private R writeWordPageSetting(XWPFDocument docx) { if (StringUtils.isEmpty(paperTemplate.getPtPageSize())) return R.fail("未设置模板尺寸"); ctSectPr = docx.getDocument().getBody().getSectPr(); if (ctSectPr == null) ctSectPr = docx.getDocument().getBody().addNewSectPr(); CTPageSz ctPageSz = ctSectPr.isSetPgSz() ? ctSectPr.getPgSz() : ctSectPr.addNewPgSz(); switch (paperTemplate.getPtPageSize().toUpperCase()) { case "A3": ctPageSz.setW(getTwipFromCM(29.7));//设置宽度(这里是一个ulong类型,单位:缇 ,1厘米=567缇) ctPageSz.setH(getTwipFromCM(42)); //设置高度(这里是一个ulong类型) break; case "A4": ctPageSz.setW(getTwipFromCM(21)); ctPageSz.setH(getTwipFromCM(29.7)); break; case "A5": ctPageSz.setW(getTwipFromCM(14.8)); ctPageSz.setH(getTwipFromCM(21)); break; case "B4": ctPageSz.setW(getTwipFromCM(25.7)); ctPageSz.setH(getTwipFromCM(36)); break; case "B5": ctPageSz.setW(getTwipFromCM(18.2)); ctPageSz.setH(getTwipFromCM(25.7)); break; case "16开": ctPageSz.setW(getTwipFromCM(18.4)); ctPageSz.setH(getTwipFromCM(26)); break; case "32开": ctPageSz.setW(getTwipFromCM(13)); ctPageSz.setH(getTwipFromCM(18.4)); break; case "大32开": ctPageSz.setW(getTwipFromCM(14)); ctPageSz.setH(getTwipFromCM(20.3)); break; default: return R.fail(StringUtils.format("不支持的尺寸:{}", paperTemplate.getPtPageSize())); } if (paperTemplate.getPtDirection().intValue() == 1) // 横向 { BigInteger tempW = ctPageSz.getW(); ctPageSz.setW(ctPageSz.getH()); ctPageSz.setH(tempW); ctPageSz.setOrient(STPageOrientation.LANDSCAPE); } //设置边距 CTPageMar pageMar = ctSectPr.getPgMar(); if (pageMar == null) pageMar = ctSectPr.addNewPgMar(); pageMar.setBottom(getTwipFromCM(paperTemplate.getPtMarginBottom().doubleValue())); pageMar.setTop(getTwipFromCM(paperTemplate.getPtMarginTop().doubleValue())); pageMar.setRight(getTwipFromCM(paperTemplate.getPtMarginRight().doubleValue())); pageMar.setLeft(getTwipFromCM(paperTemplate.getPtMarginLeft().doubleValue())); pageMar.setHeader(getTwipFromCM(paperTemplate.getPtHeaderMargin().doubleValue()));//页眉到顶端的距离 pageMar.setFooter(getTwipFromCM(paperTemplate.getPtFooterMargin().doubleValue()));//页脚到低端的距离 if (paperTemplate.getPtMarginBottom().doubleValue() > 2) { pageMar.setFooter(getTwipFromCM(1)); } else { double leftH = paperTemplate.getPtMarginBottom().doubleValue() - 1; if (leftH > 0) { pageMar.setFooter(getTwipFromCM(leftH)); } } //处理分栏 if (paperTemplate.getPtColumNum().intValue() > 1) { if (!ctSectPr.isSetCols()) ctSectPr.addNewCols(); if (!UtilTools.compareBigIntegerValue(BigInteger.valueOf(paperTemplate.getPtColumNum()), ctSectPr.getCols().getNum())) { CTColumns ctColumns = ctSectPr.getCols(); ctColumns.setNum(BigInteger.valueOf(paperTemplate.getPtColumNum().longValue())); ctSectPr.setCols(ctColumns); } } return R.ok(); } /** * 设置头部 */ private void writeWordHeader(XWPFDocument docx) { if (StringUtils.isEmpty(paperTemplate.getPtSealLineType())) { paperTemplate.setPtSealLineType("once"); } XWPFHeader header = null; //STHdrFtr.Enum headerType = StringUtils.equalsIgnoreCase(paperTemplate.getPtSealLineType(), "once") ? STHdrFtr.DEFAULT : STHdrFtr.Enum.forString(paperTemplate.getPtSealLineType()); if (!StringUtils.equalsIgnoreCase(paperTemplate.getPtSealLineType(), "once")) { XWPFHeaderFooterPolicy headerFooterPolicy = docx.getHeaderFooterPolicy(); if (headerFooterPolicy == null) headerFooterPolicy = docx.createHeaderFooterPolicy(); String sealType = ""; sealType = paperTemplate.getPtSealLineType().toLowerCase(); switch (sealType) { case "default": //每页 header = headerFooterPolicy.createHeader(STHdrFtr.DEFAULT); break; case "odd": //奇数页 header = headerFooterPolicy.createHeader(STHdrFtr.DEFAULT); docx.setEvenAndOddHeadings(true); break; case "even": //偶数页 header = headerFooterPolicy.createHeader(STHdrFtr.EVEN); docx.setEvenAndOddHeadings(true); break; } } if (paperTemplate.getPtPageHeadShow() && StringUtils.isNotEmpty(paperTemplate.getPtPageHeadText())) { if (header == null) { XWPFHeaderFooterPolicy headerFooterPolicy = docx.getHeaderFooterPolicy(); if (headerFooterPolicy == null) headerFooterPolicy = docx.createHeaderFooterPolicy(); header = headerFooterPolicy.createHeader(STHdrFtr.DEFAULT); } XWPFParagraph p = header.createParagraph(); if (StringUtils.isNotEmpty(paperTemplate.getPtPageHeadAlign())) p.setAlignment(Enum.valueOf(ParagraphAlignment.class, paperTemplate.getPtPageHeadAlign())); XWPFRun run = p.createRun(); run.setText(paperTemplate.getPtPageHeadText()); run.setFontSize(paperTemplate.getPtPageHeadSize()); } //在页眉里面添加装订线 //制作左边装订线 writeWordBroadside(docx, header); } /** * 设置侧边栏 * 换新页面设置一个 */ private void writeWordBroadside(XWPFDocument docx, XWPFHeader header) { if (paperTemplate.getPtSealLineShow() == null || !paperTemplate.getPtSealLineShow()) return; ctSectPr = docx.getDocument().getBody().getSectPr(); if (ctSectPr == null) ctSectPr = docx.getDocument().getBody().addNewSectPr(); //创建一个 CTPageMar pageMar = ctSectPr.isSetPgMar() ? ctSectPr.getPgMar() : ctSectPr.addNewPgMar(); //装订线宽度 BigInteger slideBarWidth = pageMar.getLeft(); if (pageMar.getGutter() != null) slideBarWidth.add(pageMar.getGutter()); if (paperTemplate.getPtSealLineWidth().doubleValue() > 2.5) { slideBarWidth = slideBarWidth.subtract(getTwipFromCM(0.5)); } BigInteger cellWidth = slideBarWidth.divide(BigInteger.valueOf(2)); //BigInteger top = BigInteger.valueOf(1); BigInteger slideBarHeight = ctSectPr.getPgSz().getH().subtract(BigInteger.valueOf(2)); // 创建一个侧边栏 XWPFTable sidebarTable = StringUtils.equalsIgnoreCase(paperTemplate.getPtSealLineType(), "once") ? docx.createTable(1, 2) : header.createTable(1, 2); CTTblPr ctTblPr = sidebarTable.getCTTbl().getTblPr(); if (ctTblPr == null) ctTblPr = sidebarTable.getCTTbl().addNewTblPr(); //设置宽度 ctTblPr.getTblW().setType(STTblWidth.DXA); ctTblPr.getTblW().setW(slideBarWidth);// BigInteger x = BigInteger.ZERO.subtract(slideBarWidth); //居左 CTJc jcTable = ctTblPr.isSetJc() ? ctTblPr.getJc() : ctTblPr.addNewJc(); jcTable.setVal(STJc.LEFT); sidebarTable.setTableAlignment(TableRowAlign.LEFT); //定位 CTTblPPr ctTblPPr = ctTblPr.isSetTblpPr() ? ctTblPr.getTblpPr() : ctTblPr.addNewTblpPr(); ctTblPPr.setVertAnchor(STVAnchor.PAGE); ctTblPPr.setHorzAnchor(STHAnchor.PAGE); ctTblPPr.setTblpXSpec(STXAlign.LEFT); ctTblPPr.setTblpYSpec(STYAlign.TOP); ctTblPPr.setTblpX(BigInteger.ZERO); ctTblPPr.setTblpY(BigInteger.ZERO); //去除边框 setTableBorder(sidebarTable, false); for (XWPFTableRow row : sidebarTable.getRows()) { row.setHeight(slideBarHeight.intValue()); for (XWPFTableCell cell : row.getTableCells()) { cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); CTTcPr ctTcPr = cell.getCTTc().isSetTcPr() ? cell.getCTTc().getTcPr() : cell.getCTTc().addNewTcPr(); if (!ctTcPr.isSetTcW()) ctTcPr.addNewTcW(); ctTcPr.getTcW().setW(cellWidth); //文字方向 CTTextDirection cellDirection = ctTcPr.isSetTextDirection() ? ctTcPr.getTextDirection() : ctTcPr.addNewTextDirection(); cellDirection.setVal(STTextDirection.BT_LR); //垂直居中 CTVerticalJc ctVerticalJc = ctTcPr.isSetVAlign() ? ctTcPr.getVAlign() : ctTcPr.addNewVAlign(); ctVerticalJc.setVal(STVerticalJc.Enum.forString("center")); //左对齐 CTOnOff noWap = ctTcPr.isSetNoWrap() ? ctTcPr.getNoWrap() : ctTcPr.addNewNoWrap(); noWap.setVal(STOnOff.Enum.forString("on")); } } //学生信息 XWPFTableCell cellInfo = sidebarTable.getRow(0).getCell(0); //String blankStr = " "; String blankStr = "_____________"; XWPFParagraph paragraph = cellInfo.getParagraphs().get(0); paragraph.setVerticalAlignment(TextAlignment.CENTER); paragraph.setAlignment(ParagraphAlignment.CENTER); //paragraph.setFontAlignment(2); if (paperTemplate.getPtSealLineStudentCode()) { addTextToSidebar(paragraph, " 学号:", false); addTextToSidebar(paragraph, blankStr, false); } if (paperTemplate.getPtSealLineStudentName()) { addTextToSidebar(paragraph, " 姓名:", false); addTextToSidebar(paragraph, blankStr, false); } if (paperTemplate.getPtSealLineStudentCollege()) { addTextToSidebar(paragraph, " 学院:", false); addTextToSidebar(paragraph, blankStr, false); } if (paperTemplate.getPtSealLineStudentGrade()) { addTextToSidebar(paragraph, " 年级:", false); addTextToSidebar(paragraph, blankStr, false); } if (paperTemplate.getPtSealLineStudentDepartment()) { addTextToSidebar(paragraph, " 系:", false); addTextToSidebar(paragraph, blankStr, false); } if (paperTemplate.getPtSealLineStudentSpecialty()) { addTextToSidebar(paragraph, " 专业:", false); addTextToSidebar(paragraph, blankStr, false); } if (paperTemplate.getPtSealLineStudentClass()) { addTextToSidebar(paragraph, " 班级:", false); addTextToSidebar(paragraph, blankStr, false); } //装订线 XWPFTableCell cellLine = sidebarTable.getRow(0).getCell(1); paragraph = cellLine.getParagraphs().get(0); paragraph.setVerticalAlignment(TextAlignment.CENTER); paragraph.setAlignment(ParagraphAlignment.CENTER);// paragraph.setAlignment(ParagraphAlignment.CENTER);// paragraph.setFontAlignment(2); //String lineStr = "-----------------------------------------------"; String lineStr = "-------------------------------------------"; addTextToSidebar(paragraph, lineStr, false); addTextToSidebar(paragraph, " 密 - 封 - 线 ", false); addTextToSidebar(paragraph, lineStr, false); } private void addTextToSidebar(XWPFParagraph paragraph, String text, boolean isUnderline) { XWPFRun studentRun = paragraph.createRun(); studentRun.setText(text); studentRun.setFontSize(paperTemplate.getPtSealLineSize()); studentRun.setFontFamily(paperTemplate.getPtSealLineFamily()); if (isUnderline) { studentRun.setUnderline(UnderlinePatterns.SINGLE); } } private void addTextToSidebar(XWPFParagraph paragraph, String text, boolean isUnderline, boolean isBold) { XWPFRun studentRun = paragraph.createRun(); studentRun.setText(text); studentRun.setFontSize(paperTemplate.getPtSealLineSize()); studentRun.setFontFamily(paperTemplate.getPtSealLineFamily()); if (isBold) studentRun.setBold(true); if (isUnderline) { studentRun.setUnderline(UnderlinePatterns.SINGLE); } } /** * 设置页脚 */ private void writeWordFooter(XWPFDocument docx) { boolean hasFoot = paperTemplate.getPtPageFootShow() && StringUtils.isNotEmpty(paperTemplate.getPtPageFootText()); boolean hasPageNum = paperTemplate.getPtPageNumShow(); if (hasFoot || hasPageNum) { XWPFHeaderFooterPolicy headerFooterPolicy = docx.getHeaderFooterPolicy(); if (headerFooterPolicy == null) headerFooterPolicy = docx.createHeaderFooterPolicy(); XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT); XWPFParagraph p = footer.getParagraphs() != null && footer.getParagraphs().size() > 0 ? footer.getParagraphs().get(0) : footer.createParagraph(); if (hasFoot) { if (StringUtils.isNotEmpty(paperTemplate.getPtPageFootAlign())) p.setAlignment(Enum.valueOf(ParagraphAlignment.class, paperTemplate.getPtPageFootAlign())); XWPFRun run = p.createRun(); run.setText(paperTemplate.getPtPageFootText()); run.setFontSize(paperTemplate.getPtPageFootSize()); if (hasPageNum) { p.setAlignment(ParagraphAlignment.LEFT); } } else { p.setAlignment(ParagraphAlignment.CENTER); } if (hasPageNum) { //设置分页 if (hasFoot) { CTTabStop tabStop = p.getCTP().getPPr().addNewTabs().addNewTab(); tabStop.setVal(STTabJc.RIGHT); //设置位置? int twipsPerInch = 1440; tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch)); } XWPFRun run = p.createRun(); run.setFontSize(paperTemplate.getPtPageNumSize()); run.setText("第"); if (hasFoot) run.addTab(); //当前页 begin //p.getCTP().addNewFldSimple().setInstr("PAGE \\* MERGEFORMAT"); run = p.createRun(); run.setShadow(false); run.setFontSize(paperTemplate.getPtPageNumSize()); CTFldChar fldChar = run.getCTR().addNewFldChar(); fldChar.setFldCharType(STFldCharType.Enum.forString("begin")); run.setFontSize(paperTemplate.getPtPageNumSize()); CTText ctText = run.getCTR().addNewInstrText(); ctText.setStringValue("PAGE\\* MERGEFORMAT"); ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve")); fldChar = run.getCTR().addNewFldChar(); fldChar.setFldCharType(STFldCharType.Enum.forString("end")); //当前页 end run = p.createRun(); run.setFontSize(paperTemplate.getPtPageNumSize()); run.setText("页 (共"); //总页数 begin run = p.createRun(); run.setFontSize(paperTemplate.getPtPageNumSize()); fldChar = run.getCTR().addNewFldChar(); fldChar.setFldCharType(STFldCharType.Enum.forString("begin")); run = p.createRun(); run.setFontSize(paperTemplate.getPtPageNumSize()); ctText = run.getCTR().addNewInstrText(); ctText.setStringValue("NUMPAGES \\* MERGEFORMAT"); ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve")); //run = p.createRun(); //run.setFontSize(paperTemplate.getPtPageNumSize()); fldChar = run.getCTR().addNewFldChar(); fldChar.setFldCharType(STFldCharType.Enum.forString("end")); //总页数 end run = p.createRun(); run.setFontSize(paperTemplate.getPtPageNumSize()); run.setText("页)"); } } } /** * 写入试卷信息 */ private void writePaperInfo() throws IOException, InvalidFormatException { //顶部标题 if (paperTemplate.getPtTitle() && StringUtils.isNotEmpty(verifyPaper.getVerifyPaperTopName())) { XWPFParagraph topTitle = createParagraph(paperTemplate.getPtTitleFontSize()); topTitle.setAlignment(ParagraphAlignment.CENTER); XWPFRun run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtTitleFontFamily()); run.setFontSize(paperTemplate.getPtTitleFontSize()); run.setText(verifyPaper.getVerifyPaperTopName()); run.setBold(paperTemplate.getPtTitleBold()); } //试卷标题 if (StringUtils.isNotEmpty(verifyPaper.getVerifyPaperName())) { XWPFParagraph topTitle = createParagraph(paperTemplate.getPtTitleSubFontSize()); topTitle.setAlignment(ParagraphAlignment.CENTER); XWPFRun run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtTitleSubFontFamily()); run.setFontSize(paperTemplate.getPtTitleSubFontSize()); run.setText(verifyPaper.getVerifyPaperName()); run.setBold(paperTemplate.getPtTitleSubBold()); } // 答案及标准字样 if (includeAnswer) { XWPFParagraph topTitle = createParagraph(paperTemplate.getPtTitleSubFontSize()); topTitle.setAlignment(ParagraphAlignment.CENTER); XWPFRun run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtTitleSubFontFamily()); run.setFontSize(paperTemplate.getPtTitleSubFontSize()); run.setText("参考答案及评分标准"); } //考试信息 if (paperTemplate.getPtPaperInfoShow()) { XWPFParagraph topTitle = createParagraph(paperTemplate.getPtPaperInfoSize()); topTitle.setAlignment(ParagraphAlignment.CENTER); boolean haPre = false; if (paperTemplate.getPtShowAnswerMode()) { XWPFRun run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText("考试形式:"); run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText(StringUtils.format(" {} ", verifyPaper.getVpAnswerMode() == 0 ? "闭卷" : "开卷")); run.setUnderline(UnderlinePatterns.SINGLE); haPre = true; } if (paperTemplate.getPtShowAnswerTime()) { XWPFRun run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText((haPre ? " " : "") + "考试时间:"); run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText(StringUtils.format(" {} ", verifyPaper.getVpTotalTimeMinute())); run.setUnderline(UnderlinePatterns.SINGLE); run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText("分钟"); haPre = true; } if (paperTemplate.getPtShowAnswerTime()) { XWPFRun run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText((haPre ? " " : "") + "满分:"); run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText(StringUtils.format(" {} ", verifyPaper.getVpTotalMark().stripTrailingZeros().toPlainString())); run.setUnderline(UnderlinePatterns.SINGLE); run = topTitle.createRun(); run.setFontFamily(paperTemplate.getPtPaperInfoFamily()); run.setFontSize(paperTemplate.getPtPaperInfoSize()); run.setText("分。"); haPre = true; } addNewBlankLine(docx); } //得分栏 if (paperTemplate.getPtScoreColumn()) { int colNum = 2 + verifyPaper.getVerifyPaperQtList().size(); double colWidth = 2; XWPFTable scoreTable = docx.createTable(3, colNum); scoreTable.setTableAlignment(TableRowAlign.CENTER); scoreTable.setWidth(getTwipFromCM(colWidth * colNum).intValue()); setTableBorder(scoreTable, true); for (XWPFTableRow row : scoreTable.getRows()) { row.setHeight(getTwipFromCM(1).intValue()); for (XWPFTableCell cell : row.getTableCells()) { cell.setWidth(getTwipFromCM(colWidth).toString()); } } setCellText(scoreTable.getRows().get(0).getTableCells().get(0), "题号", paperTemplate.getPtScoreColumnFamily(), paperTemplate.getPtScoreColumnSize(), paperTemplate.getPtScoreColumnBold(), false, ParagraphAlignment.CENTER, XWPFTableCell.XWPFVertAlign.CENTER); for (int i = 0; i < verifyPaper.getVerifyPaperQtList().size(); i++) { setCellText(scoreTable.getRow(0).getCell(i + 1), this.quSortNoArr, paperTemplate.getPtScoreColumnFamily(), paperTemplate.getPtScoreColumnSize(), paperTemplate.getPtScoreColumnBold(), false, ParagraphAlignment.CENTER, XWPFTableCell.XWPFVertAlign.CENTER); } setCellText(scoreTable.getRow(0).getCell(colNum - 1), "总分", paperTemplate.getPtScoreColumnFamily(), paperTemplate.getPtScoreColumnSize(), paperTemplate.getPtScoreColumnBold(), false, ParagraphAlignment.CENTER, XWPFTableCell.XWPFVertAlign.CENTER); setCellText(scoreTable.getRow(1).getCell(0), "得分", paperTemplate.getPtScoreColumnFamily(), paperTemplate.getPtScoreColumnSize(), paperTemplate.getPtScoreColumnBold(), false, ParagraphAlignment.CENTER, XWPFTableCell.XWPFVertAlign.CENTER); setCellText(scoreTable.getRow(2).getCell(0), "评阅人", paperTemplate.getPtScoreColumnFamily(), paperTemplate.getPtScoreColumnSize(), paperTemplate.getPtScoreColumnBold(), false, ParagraphAlignment.CENTER, XWPFTableCell.XWPFVertAlign.CENTER); addNewBlankLine(docx); } if (StringUtils.isNotEmpty(paperTemplate.getPtReadme())) { XWPFTable readmeTable = docx.createTable(1, 2); readmeTable.setTableAlignment(TableRowAlign.CENTER); readmeTable.setWidth(getTwipFromCM(15).intValue()); setTableBorder(readmeTable, false); XWPFTableCell cell1 = readmeTable.getRow(0).getCell(0); cell1.setWidth(getTwipFromCM(2).toString()); XWPFParagraph paragraph = cell1.getParagraphs().get(0); paragraph.setVerticalAlignment(TextAlignment.TOP); paragraph.setAlignment(ParagraphAlignment.RIGHT); XWPFRun run = paragraph.createRun(); run.setFontSize(paperTemplate.getPtReadmeFontSize()); run.setFontFamily(paperTemplate.getPtReadmeFontFamily()); if (paperTemplate.getPtReadmeBold()) run.setBold(true); run.setText("注意:"); //右侧注意事项 XWPFTableCell cell2 = readmeTable.getRow(0).getCell(1); paragraph = cell2.getParagraphs().get(0); paragraph.setSpacingLineRule(LineSpacingRule.AT_LEAST); paragraph.setVerticalAlignment(TextAlignment.TOP); paragraph.setAlignment(ParagraphAlignment.LEFT); run = paragraph.createRun(); run.setFontSize(paperTemplate.getPtReadmeFontSize()); run.setFontFamily(paperTemplate.getPtReadmeFontFamily()); if (paperTemplate.getPtReadmeBold()) run.setBold(true); run.setText(paperTemplate.getPtReadme()); addNewBlankLine(docx); } } private XWPFParagraph createParagraph(Integer fontSize) { XWPFParagraph paragraph = docx.createParagraph(); paragraph.setAlignment(ParagraphAlignment.LEFT); paragraph.setVerticalAlignment(TextAlignment.CENTER); if (fontSize != null) { setParagraphTopPadding(paragraph, fontSize); } return paragraph; } /** * 设置段落第一行头部间隔 * 间隔为字体的一半 * * @param paragraph * @param fontSize */ private void setParagraphTopPadding(XWPFParagraph paragraph, Integer fontSize) { BigInteger space = getTwipFromPound(fontSize.doubleValue()).divide(BigInteger.valueOf(2)); paragraph.setSpacingBefore(space.intValue()); } /** * 表格设置文字 * * @param cell * @param text * @param fontFamily * @param fontSize * @param isBold * @param isUnderLine * @param align * @param vAlign */ private void setCellText(XWPFTableCell cell, String text, String fontFamily, Integer fontSize, Boolean isBold, Boolean isUnderLine, ParagraphAlignment align, XWPFTableCell.XWPFVertAlign vAlign ) { XWPFParagraph paragraph = cell.getParagraphs().get(0); if (align != null) paragraph.setAlignment(align); if (vAlign != null) cell.setVerticalAlignment(vAlign); XWPFRun run = paragraph.createRun(); run.setText(text); if (StringUtils.isNotEmpty(fontFamily)) run.setFontFamily(fontFamily); if (fontSize != null) run.setFontSize(fontSize); if (isBold != null) run.setBold(isBold); if (isUnderLine != null && isUnderLine) run.setUnderline(UnderlinePatterns.SINGLE); } /** * 添加空行 * * @param document */ private void addNewBlankLine(XWPFDocument document) { XWPFParagraph paragraph = document.createParagraph(); paragraph.createRun().setText(""); } /** * 设置题型 */ private void writeWordQts() throws IOException, InvalidFormatException { for (int i = 0; i < verifyPaper.getVerifyPaperQtList().size(); i++) { VerifyPaperQt qt = verifyPaper.getVerifyPaperQtList().get(i); //处理标题 writeWordQtTitle(qt, i); //处理试题 writeQuestionForQt(qt); } } /** * 写入题型试题 * * @return */ private void writeWordQtTitle(VerifyPaperQt qt, Integer qtIndex) { String ext = qt.getVpQtDescription(); if (StringUtils.isEmpty(ext)) ext = StringUtils.format("(本大题{}小题,每小题{}分,共{}分)", qt.getVpQtQuNum(), qt.getVpQtQuMark().stripTrailingZeros().toPlainString(), qt.getVpQtMark().stripTrailingZeros().toPlainString()); String title = StringUtils.format("{}、{} {}", quSortNoArr, qt.getVerifyPaperQtName(), ext); //表格 if (paperTemplate.getPtQtScoreColumn() != null && paperTemplate.getPtQtScoreColumn()) { if (qtIndex > 1) addNewBlankLine(docx); setQtTitleScoreColumn(title); } else { XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQtTitleSize()); paragraph.setAlignment(ParagraphAlignment.LEFT); //字体左对齐 XWPFRun runText = paragraph.createRun(); runText.setBold(paperTemplate.getPtQtTitleBold()); runText.setText(title); runText.setFontSize(paperTemplate.getPtQtTitleSize().intValue()); runText.setFontFamily(paperTemplate.getPtQtTitleFamily(), XWPFRun.FontCharRange.ascii); } } /** * 添加得分栏+标题 * 创建表格合并行 * * @param title */ private void setQtTitleScoreColumn(String title) { BigInteger w = this.ctSectPr.getPgSz().getW(); XWPFTable pTable = docx.createTable(2, 2); pTable.setTableAlignment(TableRowAlign.LEFT); CTTblPr ctTblPr = pTable.getCTTbl().getTblPr(); ctTblPr.getTblW().setType(STTblWidth.DXA); //设置宽度 ctTblPr.getTblW().setW(w); mergeCell(pTable, 0, 1, 1); pTable.getRow(0).setHeight(getTwipFromCM(1).intValue()); pTable.getRow(1).setHeight(getTwipFromCM(1).intValue()); //得分栏 2 厘米 XWPFTableCell cellScore = pTable.getRow(0).getCell(0); cellScore.setWidth(getTwipFromCM(2).toString()); setCellText(cellScore, "得分", paperTemplate.getPtQtScoreColumnFamily(), paperTemplate.getPtQtScoreColumnSize(), true, false, ParagraphAlignment.CENTER, XWPFTableCell.XWPFVertAlign.CENTER); //标题栏 XWPFTableCell cellTitle = pTable.getRow(0).getCell(1); cellTitle.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); XWPFParagraph paragraph = cellTitle.getParagraphs().get(0); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQtTitleSize()).divide(BigInteger.valueOf(2)).intValue()); paragraph.setAlignment(ParagraphAlignment.LEFT); paragraph.setVerticalAlignment(TextAlignment.CENTER); XWPFRun runText = paragraph.createRun(); if (paperTemplate.getPtQtTitleBold() != null) runText.setBold(paperTemplate.getPtQtTitleBold()); runText.setText(title); runText.setFontSize(paperTemplate.getPtQtTitleSize().intValue()); runText.setFontFamily(paperTemplate.getPtQtTitleFamily(), XWPFRun.FontCharRange.ascii); setTableBorder(pTable, false); //设置边框 CTTcBorders borders = CTTcBorders.Factory.newInstance(); CTBorder border = CTBorder.Factory.newInstance(); border.setVal(STBorder.SINGLE); border.setColor(rgb_black); border.setSz(BigInteger.ONE); border.setSpace(BigInteger.ZERO); borders.setLeft(border); borders.setBottom(border); borders.setRight(border); borders.setTop(border); CTTcPr ctTcPr1 = pTable.getRow(0).getCell(0).getCTTc().getTcPr(); if (ctTcPr1 == null) ctTcPr1 = pTable.getRow(0).getCell(0).getCTTc().addNewTcPr(); ctTcPr1.setTcBorders(borders); CTTcPr ctTcPr2 = pTable.getRow(1).getCell(0).getCTTc().getTcPr(); if (ctTcPr2 == null) ctTcPr2 = pTable.getRow(1).getCell(0).getCTTc().addNewTcPr(); ctTcPr2.setTcBorders(borders); }//// private void setQtTitleScoreColumn(String title) {// BigInteger w = this.ctSectPr.getPgSz().getW();// XWPFTable pTable = docx.createTable(1, 2);// setTableBorder(pTable, false);// pTable.setTableAlignment(TableRowAlign.LEFT);// CTTblPr ctTblPr = pTable.getCTTbl().getTblPr();// ctTblPr.getTblW().setType(STTblWidth.DXA);// //设置宽度// ctTblPr.getTblW().setW(w);//// pTable.getRow(0).setHeight(getTwipFromCM(2).intValue());// //得分栏 2 厘米// XWPFTableCell cellScore = pTable.getRow(0).getCell(0);// cellScore.setWidth(getTwipFromCM(2).toString());// setQtScoreColumnTable(cellScore);//// //标题栏// XWPFTableCell cellTitle = pTable.getRow(0).getCell(1);// cellTitle.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);//// XWPFParagraph paragraph = cellTitle.getParagraphs().get(0);// paragraph.setAlignment(ParagraphAlignment.LEFT);// paragraph.setVerticalAlignment(TextAlignment.CENTER);// XWPFRun runText = paragraph.createRun();// if (paperTemplate.getPtQtTitleBold() != null) runText.setBold(paperTemplate.getPtQtTitleBold());// runText.setText(title);// runText.setFontSize(paperTemplate.getPtQtTitleSize().intValue());// runText.setFontFamily(paperTemplate.getPtQtTitleFamily(), XWPFRun.FontCharRange.ascii);// } /** * 合并单元格 * * @param table 表格对象 * @param beginRowIndex 开始行索引 * @param endRowIndex 结束行索引 * @param colIndex 合并列索引 */ private void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) { if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) { return; } //合并行单元格的第一个单元格 CTVMerge startMerge = CTVMerge.Factory.newInstance(); startMerge.setVal(STMerge.RESTART); //合并行单元格的第一个单元格之后的单元格 CTVMerge endMerge = CTVMerge.Factory.newInstance(); endMerge.setVal(STMerge.CONTINUE); CTTc ctTc = table.getRow(beginRowIndex).getCell(colIndex).getCTTc(); (ctTc.isSetTcPr() ? ctTc.getTcPr() : ctTc.addNewTcPr()).setVMerge(startMerge); for (int i = beginRowIndex + 1; i0) { BigDecimal divide = maxWidthWord.divide(widthDecimal, 2, RoundingMode.HALF_UP); scaling = divide.doubleValue(); picRun.addPicture(picStream, getPictureType(picExtension), picName, Units.toEMU(width - width * scaling), Units.toEMU(height - height * scaling)); } else { picRun.addPicture(picStream, getPictureType(picExtension), picName, Units.toEMU(width), Units.toEMU(height)); } CTInline inline = picRun.getCTR().getDrawingList().get(0).getInlineArray(0); inline.getDocPr().setId(1L); //id必须从1开始 解决打开文档时 报错(NPOI v2.4 已修复) //此处是否可关闭 picStream.close(); } else if (StringUtils.isNotEmpty(imgLine)) { //创建 run对象 XWPFRun runText = paragraph.createRun(); runText.setText(imgLine); runText.setBold(paperTemplate.getPtQuStemBold()); runText.setFontSize(paperTemplate.getPtQuStemSize()); runText.setFontFamily(paperTemplate.getPtQuStemFamily(), XWPFRun.FontCharRange.ascii); } } } /** * 获取一道试题段落 * * @param qe * @param qIndex * @return */ private void getQuLines(VerifyPaperQu qe, Integer qIndex) throws IOException, InvalidFormatException { if (qe.getQuestionIsMultipleStem() == null || !qe.getQuestionIsMultipleStem()) { //无子试题 //list.addAll(); getSingleLines(qe, qIndex); } else { //有子试题 getMultipleLines(qe, qIndex); } } /** * 获取单题面行 * * @param qe * @return */ private void getSingleLines(VerifyPaperQu qe, Integer qIndex) throws IOException, InvalidFormatException { VerifyPaperQuStem quStem = qe.getVerifyPaperQuStem(); //题面 String stem = StringUtils.getTextFromHTML(quStem.getQuStem(), imgRegex); String line = StringUtils.format("{}. ", qIndex); XWPFParagraph stemParagraph = createParagraph(paperTemplate.getPtQuStemSize()); //试题题号加粗 XWPFRun run = stemParagraph.createRun(); run.setText(line); run.setFontSize(paperTemplate.getPtQuStemSize()); run.setBold(true); writeWordQuLine(stemParagraph, stem); //选项 for (int i = 0; i < 10; i++) { char c = ((char) (65 + i)); String optionTag = String.valueOf(c).toUpperCase(); String pName = StringUtils.format("quOption{}{}", optionTag, i + 1); String option = ReflectUtils.invokeGetter(quStem, pName); if (StringUtils.isEmpty(option)) break; option = StringUtils.getTextFromHTML(option, imgRegex); XWPFParagraph optionParagraph = createParagraph(paperTemplate.getPtQuStemSize()); optionParagraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(optionParagraph, StringUtils.format("{}、{}", optionTag, option)); } //答案 if (includeAnswer && StringUtils.isNotEmpty(quStem.getQuAnswer())) { String answer = StringUtils.getTextFromHTML(quStem.getQuAnswer(), imgRegex); XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.AnswerStartWord, answer)); } //评分点,填空题不显示评分点 if (includeAnswer && StringUtils.isNotEmpty(quStem.getQuJudgePoint()) && !qe.getQuestionIsFillBlank()) { JudgeRule judgeRule = JSONObject.parseObject(quStem.getQuJudgePoint(), JudgeRule.class); if (judgeRule.getItems() != null && judgeRule.getItems().size() > 0) { String points = StringUtils.joinWith(importRule.PointSeparateWord, judgeRule.getItems().get(0).getPoints().stream().map(p -> p.getAnswer()).toArray(String[]::new)); XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.PointStartWord, points)); } } //评析 if (includeAnswer && StringUtils.isNotEmpty(quStem.getQuAnalyse())) { String answer = StringUtils.getTextFromHTML(quStem.getQuAnalyse(), imgRegex); XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.AnalyseStartWord, answer)); } if (includeAnswer) { //难度 XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.DifficultyStartWord, qe.getDifficulty())); } //知识点 if (includeAnswer && StringUtils.isNotEmpty(qe.getKnowledgeList())) { //须处理关系 ????????? //list.add(StringUtils.format("{}{}", importRule.KnowledgeStartWord,qe.getKnowledgeList().)); } //年份 if (includeAnswer) { XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.YearStartWord, qe.getQuestionYear())); } //来源 if (includeAnswer && StringUtils.isNotEmpty(qe.getQuestionOrigin())) { XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.OriginStartWord, qe.getQuestionOrigin())); } docx.createParagraph().createRun().setText("\n"); //添加一个空行 //list.add("\n"); if (!includeAnswer && qe.getQuestionIsSubjective()) { //自适应高度计算,根据答案文字数量 } } /** * 获取多题面试题行 * * @param qe * @return */ private void getMultipleLines(VerifyPaperQu qe, Integer qIndex) throws IOException, InvalidFormatException { VerifyPaperQuStem quStem = qe.getVerifyPaperQuStem(); //题面 String stem = StringUtils.getTextFromHTML(quStem.getQuStem(), imgRegex); String line = (StringUtils.format("{}.", qIndex.toString())); XWPFParagraph stemParagraph = createParagraph(paperTemplate.getPtQuStemSize()); //试题题号加粗 XWPFRun run = stemParagraph.createRun(); run.setText(line); run.setFontSize(paperTemplate.getPtQuStemSize()); run.setBold(true); writeWordQuLine(stemParagraph, stem); //子试题 for (int i = 0; i < qe.getSubQuestionList().size(); i++) { getSubQuLines(qe.getSubQuestionList().get(i), i + 1); } //评析 if (includeAnswer && StringUtils.isNotEmpty(quStem.getQuAnalyse())) { String answer = StringUtils.getTextFromHTML(quStem.getQuAnalyse(), imgRegex); XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.AnalyseStartWord, answer)); } //难度 if (includeAnswer) { XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.DifficultyStartWord, qe.getDifficulty())); //知识点 if (includeAnswer && StringUtils.isNotEmpty(qe.getKnowledgeList())) { //list.add(StringUtils.format("{}{}", importRule.KnowledgeStartWord, qe.getKnowledgeName())); } //年份 paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.YearStartWord, qe.getQuestionYear())); //来源 if (includeAnswer && StringUtils.isNotEmpty(qe.getQuestionOrigin())) { paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize() * 2).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.OriginStartWord, qe.getQuestionOrigin())); } } //添加一个空行 this.addNewBlankLine(docx); } /** * 获取子题面行 * * @param subQe * @return */ private void getSubQuLines(VerifyPaperQu subQe, Integer qSubIndex) throws IOException, InvalidFormatException { //题面 VerifyPaperQuStem quStem = subQe.getVerifyPaperQuStem(); String stem = StringUtils.getTextFromHTML(quStem.getQuStem(), imgRegex); String line = (StringUtils.format("{}). ", qSubIndex)); XWPFParagraph stemParagraph = createParagraph(paperTemplate.getPtQuStemSize()); stemParagraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize()).intValue()); //试题题号加粗 XWPFRun run = stemParagraph.createRun(); run.setText(line); run.setFontSize(paperTemplate.getPtQuStemSize()); run.setBold(true); writeWordQuLine(stemParagraph, stem); //选项 for (int i = 0; i < 10; i++) { char c = ((char) (65 + i)); String optionTag = String.valueOf(c).toUpperCase(); String pName = StringUtils.format("quOption{}{}", optionTag, i + 1); String option = ReflectUtils.invokeGetter(quStem, pName); if (StringUtils.isEmpty(option)) break; option = StringUtils.getTextFromHTML(option, imgRegex); XWPFParagraph optionParagraph = createParagraph(paperTemplate.getPtQuStemSize()); optionParagraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize()).intValue()); writeWordQuLine(optionParagraph, StringUtils.format("{}、{}", optionTag, option)); } //答案 if (includeAnswer && StringUtils.isNotEmpty(quStem.getQuAnswer())) { String answer = StringUtils.getTextFromHTML(quStem.getQuAnswer(), imgRegex); XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize()).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.AnswerStartWord, answer)); } //评分点 if (includeAnswer && StringUtils.isNotEmpty(quStem.getQuJudgePoint()) && !subQe.getQuestionIsFillBlank()) { JudgeRule judgeRule = JSONObject.parseObject(quStem.getQuJudgePoint(), JudgeRule.class); if (judgeRule.getItems() != null && judgeRule.getItems().size() > 0) { String points = StringUtils.joinWith(importRule.PointSeparateWord, judgeRule.getItems().get(0).getPoints().stream().map(p -> p.getAnswer()).toArray(String[]::new)); XWPFParagraph paragraph = createParagraph(paperTemplate.getPtQuStemSize()); paragraph.setIndentationLeft(getTwipFromPound(paperTemplate.getPtQuStemSize()).intValue()); writeWordQuLine(paragraph, StringUtils.format("{}{}", importRule.PointStartWord, points)); } } //添加一个空行 this.addNewBlankLine(docx); if (!includeAnswer && subQe.getQuestionIsSubjective()) { //自适应高度计算,根据答案文字数量 } } private boolean isMatchWithRegex(String regex, String input) { if (StringUtils.isEmpty(regex)) return false; return Pattern.compile(regex, Pattern.CASE_INSENSITIVE).matcher(input).find(); } /** * 通过图片分割 * * @param str * @return */ public List getContainImgArr(String str) { String imgReg = "]*>"; List list = new ArrayList(); if (!isMatchWithRegex(imgReg, str)) { list.add(new LineIncludeImg(str)); return list; } String getSrcReg = "\\bsrc\\b\\s*=\\s*['\"]?([^'\"]*)['\"]?";// "
页:
[1]