Browse Source

增加试题保存时html转word

宋悦 8 năm trước cách đây
mục cha
commit
11d3defe79

+ 16 - 0
cqb-comm-utils/pom.xml

@@ -117,6 +117,22 @@
             </exclusions>
         </dependency>
 
+        <dependency>
+            <groupId>org.docx4j</groupId>
+            <artifactId>docx4j-ImportXHTML</artifactId>
+            <version>3.3.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>

+ 33 - 0
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java

@@ -17,6 +17,7 @@ import org.docx4j.Docx4J;
 import org.docx4j.TraversalUtil;
 import org.docx4j.XmlUtils;
 import org.docx4j.convert.in.FlatOpcXmlImporter;
+import org.docx4j.convert.in.xhtml.XHTMLImporterImpl;
 import org.docx4j.convert.out.HTMLSettings;
 import org.docx4j.convert.out.common.preprocess.PartialDeepCopy;
 import org.docx4j.dml.CTBlip;
@@ -799,6 +800,12 @@ public final class DocxProcessUtil {
         return REL_ID_HEADER + CommonUtils.getCurNum();
     }
 
+    /**
+     * 下载word文件
+     * @param fileName
+     * @param 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);
@@ -811,4 +818,30 @@ public final class DocxProcessUtil {
         IOUtils.copyLarge(inputStream, outputStream);
     }
 
+    /**
+     * html转word
+     * @param html
+     * @return
+     * @throws Exception
+     */
+    public static String html2Docx(WordprocessingMLPackage wordMLPackage,String html){
+        initPkgImage(wordMLPackage);
+        XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
+        String wordMl = "";
+        try {
+            wordMLPackage.getMainDocumentPart().getContent().addAll(
+                    XHTMLImporter.convert( html, null) );
+            // 获取word文档中所有段落
+            List<Object> pList = getAllElementFromObject(wordMLPackage.getMainDocumentPart(), P.class);
+            for(Object p:pList){
+                wordMl += XmlUtils.marshaltoString(p);
+            }
+//            wordMl = formatPWordMl(wordMl);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return wordMl;
+    }
+
+
 }

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

@@ -132,7 +132,7 @@ public class ImportPaperService {
         }
 
         if (questions.size() > 0) {
-            quesService.saveQuesList(questions);
+            quesService.saveImportQuesList(questions);
         }
 
         if (paperDetailUnits.size() > 0) {

+ 1 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java

@@ -435,6 +435,7 @@ public class PaperService {
      * @return
      */
     public Paper insertQuestionToPaper(String paperId, String paperDetailId, Question question) {
+        quesService.updateQuesWord(question);
         question = quesRepo.save(question);
         Paper paper = paperRepo.findOne(paperId);
         PaperDetail pd = paperDetailRepo.findOne(paperDetailId);

+ 79 - 0
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuesService.java

@@ -5,7 +5,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 
+import com.qmth.cqb.utils.word.DocxProcessUtil;
+import com.sun.javadoc.Doc;
+import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
 import org.springframework.data.domain.Page;
@@ -115,13 +119,49 @@ public class QuesService {
             question.setCreateTime(now);
             question.setUpdateTime(now);
             updateSubId(question);
+            updateQuesWord(question);
             return quesRepo.save(question);
         } else {
             updateMainInfo(saveQues, question);
+            updateQuesWord(saveQues);
             return quesRepo.save(saveQues);
         }
     }
 
+    /**
+     * 保存导入试题
+     * @param question
+     * @return
+     */
+    public Question saveImportQues(Question question){
+        String now = CommonUtils.getCurDateTime();
+        Question saveQues = null;
+        if (StringUtils.isNotEmpty(question.getId())) {
+            saveQues = quesRepo.findOne(question.getId());
+        }
+        if (saveQues == null) {
+            question.setCreateTime(now);
+            question.setUpdateTime(now);
+            updateSubId(question);
+            return quesRepo.save(question);
+        } else {
+            updateMainInfo(saveQues, question);
+            return quesRepo.save(saveQues);
+        }
+    }
+
+    /**
+     * 批量保存导入试题
+     * @param list
+     */
+    public void saveImportQuesList(List<Question> list) {
+        if (list != null) {
+            for (Question question : list) {
+                saveImportQues(question);
+            }
+        }
+    }
+
     /**
      * 批量保存试题
      *
@@ -210,4 +250,43 @@ public class QuesService {
         }
     }
 
+    /**
+     * 保存后更新word
+     * @param question
+     */
+    public void updateQuesWord(Question question){
+        WordprocessingMLPackage wordMLPackage = null;
+        try {
+            wordMLPackage = WordprocessingMLPackage.createPackage();
+            updateQuesWordUnit(wordMLPackage,question);
+            List<Question> subQuesList = question.getSubQuestions();
+            if (subQuesList != null && subQuesList.size() > 0) {
+                for(Question subQues:subQuesList){
+                    updateQuesWordUnit(wordMLPackage,subQues);
+                }
+            }
+            question.setQuesPkg(DocxProcessUtil.getPkgByte(wordMLPackage));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    public void updateQuesWordUnit(WordprocessingMLPackage wordMLPackage,
+                                   Question question)throws Exception{
+        String quesBody = StringEscapeUtils.unescapeHtml4(question.getQuesBody());
+        String quesAnswer = StringEscapeUtils.unescapeHtml4(question.getQuesAnswer());
+        question.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,quesBody));
+        DocxProcessUtil.initTmpPackage(wordMLPackage);
+        question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,quesAnswer));
+        DocxProcessUtil.initTmpPackage(wordMLPackage);
+        List<QuesOption> quesOptions = question.getQuesOptions();
+        if(quesOptions != null && quesOptions.size() > 0){
+            for(QuesOption quesOption:quesOptions){
+                quesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,
+                        StringEscapeUtils.unescapeHtml4(quesOption.getOptionBody())));
+                DocxProcessUtil.initTmpPackage(wordMLPackage);
+            }
+        }
+    }
+
 }