Ver código fonte

试卷导入bug修改

luoshi@qmth.com.cn 8 anos atrás
pai
commit
dbc61be4c0

+ 65 - 62
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java

@@ -1,34 +1,14 @@
 package com.qmth.cqb.utils.word;
 
-import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.xml.bind.JAXBElement;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
+import com.qmth.cqb.utils.CommonUtils;
+import com.qmth.cqb.utils.enums.QuesUnit;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import net.sf.saxon.TransformerFactoryImpl;
+import net.sourceforge.jeuclid.LayoutContext;
+import net.sourceforge.jeuclid.context.LayoutContextImpl;
+import net.sourceforge.jeuclid.context.StyleAttributeLayoutContext;
+import net.sourceforge.jeuclid.converter.Converter;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
@@ -53,12 +33,7 @@ import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
 import org.docx4j.openpackaging.parts.relationships.Namespaces;
 import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
 import org.docx4j.relationships.Relationship;
-import org.docx4j.wml.ContentAccessor;
-import org.docx4j.wml.Drawing;
-import org.docx4j.wml.ObjectFactory;
-import org.docx4j.wml.P;
-import org.docx4j.wml.R;
-import org.docx4j.wml.Text;
+import org.docx4j.wml.*;
 import org.dom4j.Namespace;
 import org.dom4j.io.SAXReader;
 import org.jsoup.Jsoup;
@@ -66,16 +41,17 @@ import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.xml.sax.InputSource;
 
-import com.qmth.cqb.utils.CommonUtils;
-import com.qmth.cqb.utils.enums.QuesUnit;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import net.sf.saxon.TransformerFactoryImpl;
-import net.sourceforge.jeuclid.LayoutContext;
-import net.sourceforge.jeuclid.context.LayoutContextImpl;
-import net.sourceforge.jeuclid.context.StyleAttributeLayoutContext;
-import net.sourceforge.jeuclid.converter.Converter;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.bind.JAXBElement;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import java.io.*;
+import java.util.*;
 
 /**
  * docx处理工具类 Created by songyue on 17/3/10.
@@ -84,6 +60,7 @@ public final class DocxProcessUtil {
 
     public static final LayoutContext IMG_LAYOUT = new StyleAttributeLayoutContext(
             LayoutContextImpl.getDefaultLayoutContext(), "2em", java.awt.Color.BLACK);
+
     public static final String IMG_OUT_TYPE = "image/png";
 
     public static final String ENCODING = "utf-8";
@@ -129,6 +106,7 @@ public final class DocxProcessUtil {
 
     /**
      * 获取段落的所有文本
+     *
      * @param p
      * @return
      */
@@ -144,6 +122,7 @@ public final class DocxProcessUtil {
 
     /**
      * 校验段落中是否含有公式或图片
+     *
      * @param p
      * @return
      */
@@ -159,6 +138,7 @@ public final class DocxProcessUtil {
 
     /**
      * 获取文档包副本(去除段落)
+     *
      * @param wordMLPackage
      * @return
      * @throws Exception
@@ -168,8 +148,8 @@ public final class DocxProcessUtil {
         Set<String> relationshipTypes = new HashSet<String>();
         relationshipTypes.add(wordMLPackage.getMainDocumentPart().getRelationshipType());
         // 深拷贝
-        WordprocessingMLPackage tmpWordMlPackage = (WordprocessingMLPackage) PartialDeepCopy.process(wordMLPackage,
-                relationshipTypes);
+        WordprocessingMLPackage tmpWordMlPackage = (WordprocessingMLPackage) PartialDeepCopy
+                .process(wordMLPackage, relationshipTypes);
         // 移除所有段落
         initTmpPackage(tmpWordMlPackage);
 
@@ -178,6 +158,7 @@ public final class DocxProcessUtil {
 
     /**
      * 初始化文档包(去除所有段落)
+     *
      * @param wordMLPackage
      * @return
      * @throws Exception
@@ -190,6 +171,7 @@ public final class DocxProcessUtil {
 
     /**
      * 获得段落wordml
+     *
      * @param p
      * @return
      */
@@ -199,6 +181,7 @@ public final class DocxProcessUtil {
 
     /**
      * 转换wordMl为html
+     *
      * @param wordMl
      * @return
      * @throws Exception
@@ -238,6 +221,7 @@ public final class DocxProcessUtil {
 
     /**
      * 替换所有公式为图片
+     *
      * @param wordMLPackage
      * @throws Exception
      */
@@ -267,6 +251,7 @@ public final class DocxProcessUtil {
 
     /**
      * 替换公式为图片
+     *
      * @param p
      * @throws Exception
      */
@@ -292,6 +277,7 @@ public final class DocxProcessUtil {
 
     /**
      * 创建新图片
+     *
      * @param wordMLPackage
      * @param bytes
      * @param filenameHint
@@ -321,6 +307,7 @@ public final class DocxProcessUtil {
 
     /**
      * 获取wordMl固定节点下所有子节点
+     *
      * @param obj
      * @param toSearch
      * @return
@@ -343,6 +330,7 @@ public final class DocxProcessUtil {
 
     /**
      * omml转换成mml
+     *
      * @param omml
      * @return
      */
@@ -377,6 +365,7 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化转换后的html(html字符串)
+     *
      * @param htmlStr
      * @return
      */
@@ -426,6 +415,7 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化转换后的html(html临时文件)
+     *
      * @param htmlPath
      * @return
      */
@@ -465,6 +455,7 @@ public final class DocxProcessUtil {
 
     /**
      * 转换mathml为png图片
+     *
      * @param mathMlStr
      * @return
      */
@@ -493,6 +484,7 @@ public final class DocxProcessUtil {
 
     /**
      * 通过图片路径获取base64码
+     *
      * @param imgFilePath
      * @return
      */
@@ -516,6 +508,7 @@ public final class DocxProcessUtil {
 
     /**
      * 通过图片文件获取base64码
+     *
      * @param imgFile
      * @return
      */
@@ -537,6 +530,7 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化段落wordml
+     *
      * @param pWordMl
      * @return
      * @throws Exception
@@ -556,6 +550,7 @@ public final class DocxProcessUtil {
 
     /**
      * 过滤试题单元标题
+     *
      * @param p
      * @param quesUnit
      * @return
@@ -584,13 +579,13 @@ public final class DocxProcessUtil {
                                 tmpText = tmpText.replaceFirst("\\d{1,}\\.", "");
                                 text.setValue(tmpText);
                             } else {
-                                if(index == 0){
+                                if (index == 1) {
                                     tmpText = tmpText.replaceFirst("\\d{1,}", "");
-                                }else if(index == 1){
+                                } else if (index == 2) {
                                     tmpText = tmpText.replaceFirst("\\.", "");
                                 }
                                 text.setValue(tmpText);
-                                if (index == 1) {
+                                if (index == 2) {
                                     break;
                                 }
                             }
@@ -601,27 +596,26 @@ public final class DocxProcessUtil {
                                 tmpText = tmpText.replaceFirst("[A-Z]\\.", "");
                                 text.setValue(tmpText);
                             } else {
-                                if(index == 0){
+                                if (index == 1) {
                                     tmpText = tmpText.replaceFirst("[A-Z]", "");
-                                }else if(index == 1){
+                                } else if (index == 2) {
                                     tmpText = tmpText.replaceFirst("\\.", "");
                                 }
                                 text.setValue(tmpText);
-                                if (index == 1) {
+                                if (index == 2) {
                                     break;
                                 }
                             }
 
                         } else if (quesUnit == QuesUnit.QUES_ANSWER) {
                             // 过滤答案标题
-                            if (index < 3) {
-                                tmpText = tmpText.replaceFirst("\\[|\\]", "").replaceFirst("答案", "");
+                            if (index <= 4) {
+                                tmpText = tmpText.replaceFirst("\\[", "").replaceFirst("\\]", "").replaceFirst("答案", "")
+                                        .replaceFirst("[:|:]", "");
+                                text.setValue(tmpText);
                             } else {
-                                tmpText = tmpText.replaceFirst("[:|:]", "");
-                            }
-                            text.setValue(tmpText);
-                            if (index == 3)
                                 break;
+                            }
                         }
                     }
                 }
@@ -632,6 +626,7 @@ public final class DocxProcessUtil {
 
     /**
      * 导出word
+     *
      * @param dataMap
      * @param fileName
      */
@@ -665,6 +660,7 @@ public final class DocxProcessUtil {
 
     /**
      * 导出试卷
+     *
      * @param dataMap
      * @param fileName
      */
@@ -674,6 +670,7 @@ public final class DocxProcessUtil {
 
     /**
      * 导出答案
+     *
      * @param dataMap
      * @param fileName
      */
@@ -683,6 +680,7 @@ public final class DocxProcessUtil {
 
     /**
      * 处理导出word中的图片
+     *
      * @param fileName
      * @param wordMLPackages
      * @throws Exception
@@ -722,6 +720,7 @@ public final class DocxProcessUtil {
 
     /**
      * 获取word二进制数据(空文档,只有样式和资源)
+     *
      * @param wordMLPackage
      * @return
      * @throws Exception
@@ -741,6 +740,7 @@ public final class DocxProcessUtil {
 
     /**
      * 通过二进制流获取word文档包
+     *
      * @param bytes
      * @return
      */
@@ -759,6 +759,7 @@ public final class DocxProcessUtil {
 
     /**
      * 初始化word文档图片资源路径,防止导出试卷时资源ID冲突
+     *
      * @param wordMLPackage
      */
     public static void initPkgImage(WordprocessingMLPackage wordMLPackage) {
@@ -790,21 +791,23 @@ public final class DocxProcessUtil {
 
     /**
      * 获取RldNum
+     *
      * @return
      */
     public static String getRldNum() {
         return REL_ID_HEADER + CommonUtils.getCurNum();
     }
 
-    public static void processDownload(String fileName,HttpServletResponse response) throws Exception {
+    public static void processDownload(String fileName, HttpServletResponse response) throws Exception {
         String filePath = TEMP_FILE_EXP + fileName + DOCX_SUFFIX;
         InputStream inputStream = new FileInputStream(filePath);
         OutputStream outputStream = response.getOutputStream();
         // 设置强制下载不打开
         response.setContentType("application/octet-stream;charset=utf-8");
         // 设置文件名
-        response.addHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("UTF-8"),"iso-8859-1") + DOCX_SUFFIX);
-        IOUtils.copyLarge(inputStream,outputStream);
+        response.addHeader("Content-Disposition",
+                "attachment;fileName=" + new String(fileName.getBytes("UTF-8"), "iso-8859-1") + DOCX_SUFFIX);
+        IOUtils.copyLarge(inputStream, outputStream);
     }
 
 }

+ 103 - 85
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -1,24 +1,6 @@
 package com.qmth.cqb.paper.service;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-import org.docx4j.wml.P;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
-
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 import com.google.gson.Gson;
 import com.qmth.cqb.base.dao.CourseRepo;
 import com.qmth.cqb.paper.dao.PaperDetailRepo;
@@ -37,8 +19,21 @@ import com.qmth.cqb.utils.enums.PaperStatus;
 import com.qmth.cqb.utils.enums.PaperType;
 import com.qmth.cqb.utils.enums.QuesUnit;
 import com.qmth.cqb.utils.word.DocxProcessUtil;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+import org.docx4j.wml.P;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
-import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
 
 @Service
 public class ImportPaperService {
@@ -63,14 +58,13 @@ public class ImportPaperService {
 
     @Autowired
     PaperService paperService;
-    
 
     @Autowired
     CourseRepo courseRepo;
 
     /**
      * 获取上传文件
-     * 
+     *
      * @param file
      * @return
      */
@@ -91,7 +85,7 @@ public class ImportPaperService {
 
     /**
      * 导入试卷
-     * 
+     *
      * @param file
      * @return
      */
@@ -106,7 +100,7 @@ public class ImportPaperService {
 
     /**
      * 保存导入试卷信息
-     * 
+     *
      * @param paper
      * @param paperDetails
      * @param paperDetailUnits
@@ -141,7 +135,7 @@ public class ImportPaperService {
 
     /**
      * 处理导入试卷
-     * 
+     *
      * @param file
      */
     public String processImportPaper(String paperName, File file) {
@@ -207,8 +201,8 @@ public class ImportPaperService {
                     // 设置大题类
                     initQuesHeader(paper, paperDetail, paperDetails, ++mainQuesNum, importPaperCheck);
 
-                } else if (pText.matches("^\\d{1,}\\.[\\s\\S]*")
-                        || (isNested(importPaperCheck) && !pText.startsWith("["))) {
+                } else if (pText.matches("^\\d{1,}\\.[\\s\\S]*") || (isNested(importPaperCheck) && !pText
+                        .startsWith("["))) {
                     // 处理试题
 
                     // 创建小题类和试题类
@@ -274,7 +268,7 @@ public class ImportPaperService {
 
     /**
      * 初始化试卷信息
-     * 
+     *
      * @param paper
      * @param paperName
      */
@@ -287,7 +281,7 @@ public class ImportPaperService {
 
     /**
      * 初始化大题头信息
-     * 
+     *
      * @param paper
      * @param paperDetail
      * @param paperDetails
@@ -315,7 +309,7 @@ public class ImportPaperService {
 
     /**
      * 初始化试卷明细和试题
-     * 
+     *
      * @param paperDetail
      * @param paperDetailUnit
      * @param question
@@ -337,7 +331,7 @@ public class ImportPaperService {
 
     /**
      * 校验试题头标识
-     * 
+     *
      * @param importPaperCheck
      * @return
      */
@@ -376,7 +370,7 @@ public class ImportPaperService {
 
     /**
      * 处理大题头信息
-     * 
+     *
      * @param pList
      * @param index
      * @param importPaperCheck
@@ -419,7 +413,7 @@ public class ImportPaperService {
 
     /**
      * 处理题干信息
-     * 
+     *
      * @param pList
      * @param index
      * @param question
@@ -430,38 +424,42 @@ public class ImportPaperService {
     public void processQuesBody(List pList, int index, Question question, ImportPaperCheck importPaperCheck,
             WordprocessingMLPackage wordMLPackage) throws Exception {
         // 定义题干wordml和html
-        String quesBodyWordMl = "";
-        String quesBodyHtml = "";
+        StringBuilder quesBodyWordMl = new StringBuilder();
+        StringBuilder quesBodyHtml = new StringBuilder();
         int i = 0;
 
         for (i = index; i < pList.size(); i++) {
             P pBody = (P) pList.get(i);
             String tmpText = DocxProcessUtil.getPText(pBody);
 
-            // 判断是否为题干
             if (StringUtils.isEmpty(tmpText)) {
+                // 跳过空白段落
                 continue;
-            } else if (tmpText.matches("^\\d{1,}\\.[\\s\\S]*")
-                    || (!tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*") && !tmpText.startsWith("["))) {
+            } else if (tmpText.matches("^\\d{1,}\\.[\\s\\S]*")) {
+                // 题干第一段
                 // 过滤题干标题
                 pBody = DocxProcessUtil.formatP(pBody, QuesUnit.QUES_BODY);
-
                 String tmpWordMl = DocxProcessUtil.getPWordMl(pBody);
-                String tmpHtml = DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage);
-                quesBodyWordMl += DocxProcessUtil.formatPWordMl(tmpWordMl);
-                quesBodyHtml += tmpHtml;
-            } else {
+                quesBodyWordMl.append(DocxProcessUtil.formatPWordMl(tmpWordMl));
+                quesBodyHtml.append(DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage));
+            } else if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*") || tmpText.startsWith("[")) {
+                // 检测到选项或其他特殊段落直接退出
                 break;
+            } else {
+                // 题干普通段落
+                String tmpWordMl = DocxProcessUtil.getPWordMl(pBody);
+                quesBodyWordMl.append(DocxProcessUtil.formatPWordMl(tmpWordMl));
+                quesBodyHtml.append(DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage));
             }
         }
         importPaperCheck.setIndex(i);
-        question.setQuesBody(quesBodyHtml);
-        question.setQuesBodyWord(quesBodyWordMl);
+        question.setQuesBody(quesBodyHtml.toString());
+        question.setQuesBodyWord(quesBodyWordMl.toString());
     }
 
     /**
      * 处理题目选项
-     * 
+     *
      * @param pList
      * @param index
      * @param subQuesNum
@@ -475,12 +473,14 @@ public class ImportPaperService {
             ImportPaperCheck importPaperCheck, WordprocessingMLPackage wordMLPackage) throws Exception {
 
         // 定义试题选项wordml和html
-        String quesOptionWordMl = "";
-        String quesOptionHtml = "";
+        //String quesOptionWordMl = "";
+        //String quesOptionHtml = "";
         // 定义选项集合
         List<QuesOption> quesOptions = new ArrayList<QuesOption>();
         // 定义选项数量
         int optionCount = 0;
+        // 当前所处的选项
+        QuesOption current = null;
 
         int i = 0;
 
@@ -489,21 +489,30 @@ public class ImportPaperService {
             String tmpText = DocxProcessUtil.getPText(pOption);
 
             if (StringUtils.isEmpty(tmpText)) {
+                // 跳过空白段落
                 continue;
-            } else if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {// 判断是否为选项
-                // 过滤选项标题
-                pOption = DocxProcessUtil.formatP(pOption, QuesUnit.QUES_OPTION);
-                quesOptionWordMl = DocxProcessUtil.getPWordMl(pOption);
-                quesOptionHtml = DocxProcessUtil.docx2Html(quesOptionWordMl, wordMLPackage);
+            } else if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {
+                // 检测到选项开始段落
                 // 创建试题选项
-                QuesOption quesOption = new QuesOption();
-                quesOption.setOptionBody(quesOptionHtml);
-                quesOption.setOptionBodyWord(DocxProcessUtil.formatPWordMl(quesOptionWordMl));
-                quesOption.setNumber(tmpText.substring(0, 1));
-                quesOptions.add(quesOption);
+                current = new QuesOption();
+                current.setNumber(tmpText.substring(0, 1));
+                current.setOptionBody("");
+                current.setOptionBodyWord("");
+                quesOptions.add(current);
                 optionCount++;
-            } else {
+                // 过滤选项标题
+                pOption = DocxProcessUtil.formatP(pOption, QuesUnit.QUES_OPTION);
+                String tmpWordMl = DocxProcessUtil.getPWordMl(pOption);
+                current.setOptionBody(current.getOptionBody() + DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage));
+                current.setOptionBodyWord(current.getOptionBodyWord() + DocxProcessUtil.formatPWordMl(tmpWordMl));
+            } else if (tmpText.startsWith("[")) {
+                // 非选项的其他内容直接退出
                 break;
+            } else if (current != null) {
+                // 选项的其他段落
+                String tmpWordMl = DocxProcessUtil.getPWordMl(pOption);
+                current.setOptionBody(current.getOptionBody() + DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage));
+                current.setOptionBodyWord(current.getOptionBodyWord() + DocxProcessUtil.formatPWordMl(tmpWordMl));
             }
         }
         importPaperCheck.setIndex(i);
@@ -518,7 +527,7 @@ public class ImportPaperService {
 
     /**
      * 处理小题尾信息
-     * 
+     *
      * @param pList
      * @param index
      * @param subQuesNum
@@ -530,39 +539,51 @@ public class ImportPaperService {
             PaperDetailUnit paperDetailUnit, ImportPaperCheck importPaperCheck, WordprocessingMLPackage wordMLPackage,
             boolean isNested) throws Exception {
 
-        String quesAnwserWordMl = "";
-        String quesAnwserHtml = "";
+        StringBuilder answerWordML = new StringBuilder("");
+        StringBuilder answerHTML = new StringBuilder("");
         String quesScore = "";
-        Map<String, String> quesParams = new HashMap<String, String>();
+        //Map<String, String> quesParams = new HashMap<String, String>();
         int i = 0;
+        // 是否刚刚检测到答案内容
+        boolean answerStart = false;
 
         for (i = index; i < pList.size(); i++) {
             P pAnswer = (P) pList.get(i);
             String tmpText = DocxProcessUtil.getPText(pAnswer);
             if (StringUtils.isEmpty(tmpText)) {
+                // 跳过空白段落
                 continue;
             } else if (tmpText.startsWith("[答案]")) {
+                // 检测到答案开始段落
                 pAnswer = DocxProcessUtil.formatP(pAnswer, QuesUnit.QUES_ANSWER);
-                quesAnwserWordMl = DocxProcessUtil.getPWordMl(pAnswer);
-                quesAnwserHtml = DocxProcessUtil.docx2Html(quesAnwserWordMl, wordMLPackage);
-
+                String tmpWordMl = DocxProcessUtil.getPWordMl(pAnswer);
+                answerWordML.append(DocxProcessUtil.formatPWordMl(tmpWordMl));
+                answerHTML.append(DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage));
+                answerStart = true;
             } else if (tmpText.startsWith("[小题分数]")) {
+                // 检测到分数开始段落
                 quesScore = tmpText.replaceAll("\\[小题分数\\]", "").replaceAll("[:|:]", "").trim();
-            } else {
+                answerStart = false;
+            } else if (tmpText.startsWith("[") || tmpText.matches("^\\d{1,}\\.[\\s\\S]*")) {
+                // 检测到其他特殊段落或下一题直接退出
                 break;
+            } else if (answerStart) {
+                String tmpWordMl = DocxProcessUtil.getPWordMl(pAnswer);
+                answerWordML.append(DocxProcessUtil.formatPWordMl(tmpWordMl));
+                answerHTML.append(DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage));
             }
         }
         importPaperCheck.setIndex(i);
         // 校验答案
-        if (!StringUtils.isEmpty(quesAnwserHtml)) {
-            question.setQuesAnswer(quesAnwserHtml);
-            question.setQuesAnswerWord(DocxProcessUtil.formatPWordMl(quesAnwserWordMl));
+        if (answerHTML.length() > 0) {
+            question.setQuesAnswer(answerHTML.toString());
+            question.setQuesAnswerWord(answerWordML.toString());
         } else {
             importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.quesName, subQuesNum) + "答案为空或格式不正确\n");
         }
 
         // 设置预设分数
-        if(StringUtils.isNumeric(quesScore)){
+        if (StringUtils.isNumeric(quesScore)) {
             question.setScore(Double.parseDouble(quesScore));
         }
         // 一般大题明细需要设置分数
@@ -573,7 +594,7 @@ public class ImportPaperService {
 
     /**
      * 处理套题
-     * 
+     *
      * @param pList
      * @param index
      * @param question
@@ -619,7 +640,7 @@ public class ImportPaperService {
 
                 Question subQues = new Question();
                 subQues.setQuestionType(getQuesStructType(nestedQuesType));
-                if(StringUtils.isNumeric(importPaperCheck.getQuesScore())){
+                if (StringUtils.isNumeric(importPaperCheck.getQuesScore())) {
                     subQues.setScore(Double.parseDouble(importPaperCheck.getQuesScore()));
                 }
 
@@ -658,7 +679,7 @@ public class ImportPaperService {
 
     /**
      * 获取试题类型
-     * 
+     *
      * @param quesType
      * @return
      */
@@ -668,7 +689,7 @@ public class ImportPaperService {
 
     /**
      * 获取试题类型
-     * 
+     *
      * @param quesType
      * @param quesName
      * @return
@@ -680,7 +701,7 @@ public class ImportPaperService {
 
     /**
      * 获取试题结构类型
-     * 
+     *
      * @param quesType
      * @return
      */
@@ -690,7 +711,7 @@ public class ImportPaperService {
 
     /**
      * 获取当前试题大题小题号
-     * 
+     *
      * @param quesType
      * @param subQuesNum
      * @return
@@ -701,7 +722,7 @@ public class ImportPaperService {
 
     /**
      * 判断是否为套题
-     * 
+     *
      * @param importPaperCheck
      * @return
      */
@@ -715,7 +736,7 @@ public class ImportPaperService {
 
     /**
      * 获取课程代码
-     * 
+     *
      * @param importPaperCheck
      * @return
      */
@@ -730,7 +751,7 @@ public class ImportPaperService {
 
     /**
      * 获取课程名称
-     * 
+     *
      * @param importPaperCheck
      * @return
      */
@@ -745,7 +766,7 @@ public class ImportPaperService {
 
     /**
      * 设置wordMLPackage对象二进制数据
-     * 
+     *
      * @param question
      * @param wordMLPackage
      * @throws Exception
@@ -754,13 +775,10 @@ public class ImportPaperService {
         question.setQuesPkg(DocxProcessUtil.getPkgByte(wordMLPackage));
     }
 
-    
-    
     /**
      * 构造一张空白的导入类型试卷
-     * 
+     *
      * @param courseNo
-     * @param courseName
      * @param paperName
      * @return
      */