亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Word試卷文檔模型化解析存儲到數據庫

2019-11-14 23:07:23
字體:
來源:轉載
供稿:網友
Word試卷文檔模型化解析存儲到數據庫

最近在搞一套在線的考試系統,有許多人反映試題的新增比較麻煩(需要逐個輸入),于是呼就整個了試卷批量導入了

poi實現word轉html

模型化解析html

html轉Map數組

Map數組(數組的操作處理不做說明)

1.導jar包。

2.word試卷導入模板

鏈接: http://pan.baidu.com/s/1gdlfsoV 密碼: i4QQ

3.代碼實現

  1 package com.web.onlinexam.util;  2   3 import java.io.BufferedWriter;    4 import java.io.File;    5 import java.io.FileInputStream;    6 import java.io.FileNotFoundException;    7 import java.io.FileOutputStream;    8 import java.io.IOException;    9 import java.io.OutputStream;   10 import java.io.OutputStreamWriter;   11 import java.io.PRintWriter; 12 import java.util.ArrayList; 13 import java.util.Date; 14 import java.util.HashMap; 15 import java.util.LinkedList; 16 import java.util.List; 17 import java.util.Map; 18 import java.util.regex.Matcher; 19 import java.util.regex.Pattern; 20  21 import org.apache.commons.lang.StringUtils; 22 import org.apache.poi.hwpf.HWPFDocument;   23 import org.apache.poi.hwpf.model.PicturesTable;   24 import org.apache.poi.hwpf.usermodel.CharacterRun;   25 import org.apache.poi.hwpf.usermodel.Picture;   26 import org.apache.poi.hwpf.usermodel.Range;   27 import org.apache.poi.hwpf.usermodel.Paragraph;      28 import org.apache.poi.hwpf.usermodel.Table;      29 import org.apache.poi.hwpf.usermodel.TableCell;      30 import org.apache.poi.hwpf.usermodel.TableIterator;      31 import org.apache.poi.hwpf.usermodel.TableRow;   32  33 import com.common.util.DateFormatUtil; 34 import com.common.util.FileUploadPathConfig; 35  36 /** 37  * 38  39  * @Description:Word試卷文檔模型化解析 40  41  * @author libt 42  * @ClassName: WordToHtml 43  * @copyright 睿峰科技 44  * @version V1.0 45  * 46  */ 47 public class WordToHtml { 48  49     /** 50      * 回車符ASCII碼 51      */ 52     private static final short ENTER_ASCII = 13; 53  54     /** 55      * 空格符ASCII碼 56      */ 57     private static final short SPACE_ASCII = 32; 58  59     /** 60      * 水平制表符ASCII碼 61      */ 62     private static final short TABULATION_ASCII = 9; 63  64     public static String htmlText = ""; 65     public static String htmlTextTbl = ""; 66     public static int counter=0; 67     public static int beginPosi=0; 68     public static int endPosi=0; 69     public static int beginArray[]; 70     public static int endArray[]; 71     public static String htmlTextArray[]; 72     public static boolean tblExist=false; 73  74     public static final String inputFile="C://Users//java//Downloads//111222.doc"; 75     public static final String htmlFile="E:/abc.html"; 76  77     public static void main(String argv[]) 78     {         79         try { 80             getWordAndStyle(inputFile); 81         } catch (Exception e) { 82             e.printStackTrace(); 83         } 84     } 85  86     /** 87      * word文檔圖片存儲路徑 88      * @return 89      */ 90     public static String wordImageFilePath(){ 91  92         return  FileUploadPathConfig.FILE_UPLOAD_BASE+"upload/wordImage/"+ DateFormatUtil.formatDate(new Date()); 93     } 94  95     /** 96      *  word文檔圖片Web訪問路徑 97      * @return 98      */ 99     public static String wordImgeWebPath(){100 101         return  "D:/var/e_learning/upload/wordImage/"+ DateFormatUtil.formatDate(new Date())+"/";102     }103 104     /**105      * 讀取每個文字樣式106      * 107      * @param fileName108      * @throws Exception109      */110 111 112     public static void getWordAndStyle(String fileName) throws Exception {113         FileInputStream in = new FileInputStream(new File(fileName));114         HWPFDocument doc = new HWPFDocument(in);115 116         Range rangetbl = doc.getRange();//得到文檔的讀取范圍   117         TableIterator it = new TableIterator(rangetbl); 118         int num=100;         119 120         beginArray=new int[num];121         endArray=new int[num];122         htmlTextArray=new String[num];123 124         // 取得文檔中字符的總數125         int length = doc.characterLength();126         // 創建圖片容器127         PicturesTable pTable = doc.getPicturesTable();128 129         htmlText = "<html><head><title>" + doc.getSummaryInformation().getTitle() + "</title></head><body>";130         // 創建臨時字符串,好加以判斷一串字符是否存在相同格式131 132         if(it.hasNext())133         {134             readTable(it,rangetbl);135         }136 137         int cur=0;138 139         String tempString = "";140         for (int i = 0; i < length - 1; i++) {141             // 整篇文章的字符通過一個個字符的來判斷,range為得到文檔的范圍142             Range range = new Range(i, i + 1, doc);143 144             CharacterRun cr = range.getCharacterRun(0); 145             146             if(tblExist)147             {148                 if(i==beginArray[cur])149                 {         150                     htmlText+=tempString+htmlTextArray[cur];151                     tempString="";152                     i=endArray[cur]-1;153                     cur++;154                     continue;155                 }156             }157             if (pTable.haspicture(cr)) {158                 htmlText +=  tempString ;                159                 // 讀寫圖片                160                 readPicture(pTable, cr);161                 tempString = "";                162             } 163             else {164 165                 Range range2 = new Range(i + 1, i + 2, doc);166                 // 第二個字符167                 CharacterRun cr2 = range2.getCharacterRun(0);168                 char c = cr.text().charAt(0);169 170                 // 判斷是否為空格符171                 if (c == SPACE_ASCII)172                     tempString += "&nbsp;";173                 // 判斷是否為水平制表符174                 else if (c == TABULATION_ASCII)175                     tempString += "&nbsp;&nbsp;&nbsp;&nbsp;";176                 // 比較前后2個字符是否具有相同的格式177                 boolean flag = compareCharStyle(cr, cr2);178                 if (flag&&c !=ENTER_ASCII)179                     tempString += cr.text();180                 else {181                     String fontStyle = "<span style='font-family:" + cr.getFontName() + ";font-size:" + cr.getFontSize() / 2182                     + "pt;color:"+getHexColor(cr.getIco24())+";";183 184                     if (cr.isBold())185                         fontStyle += "font-weight:bold;";186                     if (cr.isItalic())187                         fontStyle += "font-style:italic;";188 189                     htmlText += fontStyle + "' >" + tempString + cr.text();190                     htmlText +="</span>";191                     tempString = "";192                 }193                 // 判斷是否為回車符194                 if (c == ENTER_ASCII)195                     htmlText += "<br/>";196 197             }198         }199 200         htmlText += tempString+"</body></html>";201         //生成html文件202         writeFile(htmlText);203         System.out.println("------------WordToHtml轉換成功----------------");204         //word試卷數據模型化205         analysisHtmlString(htmlText);206         System.out.println("------------WordToHtml模型化成功----------------");207     }208 209     /**210      * 讀寫文檔中的表格211      * 212      * @param pTable213      * @param cr214      * @throws Exception215      */216     public static void readTable(TableIterator it, Range rangetbl) throws Exception {217 218         htmlTextTbl="";219         //迭代文檔中的表格  220 221         counter=-1;222         while (it.hasNext()) 223         { 224             tblExist=true;225             htmlTextTbl="";226             Table tb = (Table) it.next();    227             beginPosi=tb.getStartOffset() ;228             endPosi=tb.getEndOffset();229 230             //System.out.println("............"+beginPosi+"...."+endPosi);231             counter=counter+1;232             //迭代行,默認從0開始233             beginArray[counter]=beginPosi;234             endArray[counter]=endPosi;235 236             htmlTextTbl+="<table border>";237             for (int i = 0; i < tb.numRows(); i++) {      238                 TableRow tr = tb.getRow(i);   239 240                 htmlTextTbl+="<tr>";241                 //迭代列,默認從0開始   242                 for (int j = 0; j < tr.numCells(); j++) {      243                     TableCell td = tr.getCell(j);//取得單元格244                     int cellWidth=td.getWidth();245 246                     //取得單元格的內容   247                     for(int k=0;k<td.numParagraphs();k++){      248                         Paragraph para =td.getParagraph(k);      249                         String s = para.text().toString().trim();   250                         if(s=="")251                         {252                             s=" ";253                         }254                         htmlTextTbl += "<td width="+cellWidth+ ">"+s+"</td>";255                     }       256                 }      257             }   258             htmlTextTbl+="</table>" ;    259             htmlTextArray[counter]=htmlTextTbl;260 261         } //end while 262     }    263 264     /**265      * 讀寫文檔中的圖片266      * 267      * @param pTable268      * @param cr269      * @throws Exception270      */271     public static void readPicture(PicturesTable pTable, CharacterRun cr) throws Exception {272         // 提取圖片273         Picture pic = pTable.extractPicture(cr, false);274         // 返回POI建議的圖片文件名275         String afileName = pic.suggestFullFileName();276 277         File file = new File(wordImageFilePath());278         System.out.println(file.mkdirs());279         OutputStream out = new FileOutputStream(new File( wordImageFilePath()+ File.separator + afileName));280         pic.writeImageContent(out);281         htmlText += "<img src='"+wordImgeWebPath()+ afileName282         + "' mce_src='"+wordImgeWebPath()+ afileName + "' />";283     }284 285 286     public static boolean compareCharStyle(CharacterRun cr1, CharacterRun cr2) 287     {288         boolean flag = false;289         if (cr1.isBold() == cr2.isBold() && cr1.isItalic() == cr2.isItalic() && cr1.getFontName().equals(cr2.getFontName()) 290                 && cr1.getFontSize() == cr2.getFontSize()&& cr1.getColor() == cr2.getColor()) 291         {292             flag = true;293         }294         return flag;295     }296 297     /*** 字體顏色模塊start ********/298     public static int red(int c) {  299         return c & 0XFF;  300     }  301 302     public static int green(int c) {  303         return (c >> 8) & 0XFF;  304     }  305 306     public static int blue(int c) {  307         return (c >> 16) & 0XFF;  308     }  309 310     public static int rgb(int c) {  311         return (red(c) << 16) | (green(c) << 8) | blue(c);  312     }  313 314     public static String rgbToSix(String rgb) {  315         int length = 6 - rgb.length();  316         String str = "";  317         while (length > 0) {  318             str += "0";  319             length--;  320         }  321         return str + rgb;  322     }  323 324 325     public static String getHexColor(int color) {  326         color = color == -1 ? 0 : color;  327         int rgb = rgb(color);  328         return "#" + rgbToSix(Integer.toHexString(rgb));  329     }  330     /** 字體顏色模塊end ******/331 332     /**333      * 寫文件334      * 335      * @param s336      */337     public static void writeFile(String s) {338         FileOutputStream fos = null;339         BufferedWriter bw = null;340         PrintWriter writer = null;341         try {342             File file = new File(htmlFile);343             fos = new FileOutputStream(file);344             bw = new BufferedWriter(new OutputStreamWriter(fos));345             bw.write(s);346             bw.close();347             fos.close();348             //編碼轉換349             writer = new PrintWriter(file, "GB2312");350             writer.write(s);351             writer.flush();352             writer.close();353         } catch (FileNotFoundException fnfe) {354             fnfe.printStackTrace();355         } catch (IOException ioe) {356             ioe.printStackTrace();357         }358 359     }360 361     /**362      * 分析html363      * @param s364      */365     public static void analysisHtmlString(String s){366 367         String q[] = s.split("<br/>");368 369         LinkedList<String> list = new LinkedList<String>();370 371         //清除空字符372         for (int i = 0; i < q.length; i++) {373             if(StringUtils.isNotBlank(q[i].toString().replaceAll("</?[^>]+>","").trim())){374 375                 list.add(q[i].toString().trim());376             }377         }378         String[] result = {};379         String ws[]=list.toArray(result);380         int singleScore = 0;381         int multipleScore = 0;382         int fillingScore = 0;383         int judgeScore = 0;384         int askScore = 0;385         int singleNum = 0;386         int multipleNum = 0;387         int fillingNum = 0;388         int judgeNum = 0;389         int askNum = 0;390         /***********試卷基礎數據賦值*********************/391         for (int i = 0; i < ws.length; i++) {392             String delHtml=ws[i].toString().replaceAll("</?[^>]+>","").trim();//去除html393             if(delHtml.contains("、單選題")){394                 String numScore=numScore(delHtml);395                 singleNum= Integer.parseInt(numScore.split(",")[0]) ;396                 singleScore=Integer.parseInt(numScore.split(",")[1]) ;397             }else if(delHtml.contains("、多擇題")){398                 String numScore=numScore(delHtml);399                 multipleNum= Integer.parseInt(numScore.split(",")[0]) ;400                 multipleScore=Integer.parseInt(numScore.split(",")[1]) ;401             }else if(delHtml.contains("、填空題")){402                 String numScore=numScore(delHtml);403                 fillingNum= Integer.parseInt(numScore.split(",")[0]) ;404                 fillingScore=Integer.parseInt(numScore.split(",")[1]) ;405             }else if(delHtml.contains("、判斷題")){406                 String numScore=numScore(delHtml);407                 judgeNum= Integer.parseInt(numScore.split(",")[0]) ;408                 judgeScore=Integer.parseInt(numScore.split(",")[1]) ;409             }else if(delHtml.contains("、問答題")){410                 String numScore=numScore(delHtml);411                 askNum= Integer.parseInt(numScore.split(",")[0]) ;412                 askScore=Integer.parseInt(numScore.split(",")[1]) ;413             }414 415         }416         /**************word試卷數據模型化****************/417         List<Map<String, Object>> bigTiMaps = new ArrayList<Map<String,Object>>();418         List<Map<String, Object>> smalMaps = new ArrayList<Map<String,Object>>();419         List<Map<String, Object>> sleMaps = new ArrayList<Map<String,Object>>();420         String htmlText="";421         int smalScore=0;422         for (int j = ws.length-1; j>=0; j--) {423             String html= ws[j].toString().trim();//html格式424             String delHtml=ws[j].toString().replaceAll("</?[^>]+>","").trim();//去除html425             if(!isSelecteTitele(delHtml)&&!isTitele(delHtml)&&!isBigTilete(delHtml)){//無426                 if(isTitele(delHtml)){427                     smalScore=itemNum(delHtml);428                 }429                 htmlText=html+htmlText;430             }else if(isSelecteTitele(delHtml)){//選擇題選擇項431                 Map<String, Object> sleMap = new HashMap<String, Object>();//選擇題選擇項432                 sleMap.put("seleteItem", delHtml.substring(0, 1));433                 sleMap.put("seleteQuest", html+htmlText);434                 sleMaps.add(sleMap);435             }else if(isTitele(delHtml)){//小標題436                 Map<String, Object> smalMap = new HashMap<String, Object>();//小標題437                 smalMap.put("smalTilete", html+htmlText);438                 smalMap.put("smalScore", smalScore>0?smalScore+"":itemNum(delHtml)+"");439                 smalMap.put("sleMaps", sleMaps);440                 smalMaps.add(smalMap);441             }else if(isBigTilete(delHtml)){//大標題442                 Map<String, Object> bigTiMap = new HashMap<String, Object>();//大標題443                 bigTiMap.put("bigTilete", delHtml.substring(2, 5));444                 bigTiMap.put("smalMaps", smalMaps);445                 bigTiMaps.add(bigTiMap);446             }    447 448         }449         //System.out.println(bigTiMaps.toString());450     }451 452     //獲取大題-題目數量以及題目總計分數453     public static String numScore(String delHtml){454 455         String regEx="[^0-9+,|,+^0-9]";   456         Pattern p = Pattern.compile(regEx);   457         Matcher m = p.matcher(delHtml);458         String s=m.replaceAll("").trim();459         if(StringUtils.isNotBlank(s)){460             if(s.contains(",")){461                 return s;462             }else if(s.contains(",")){463                 return s.replace(",", ",");464             }else{465                 return "0,0";466             }467         }else{468             return "0,0";469         }470 471     }472     //獲取每小題分數473     public static int itemNum(String delHtml){474         Pattern pattern = Pattern.compile("((.*?))"); //中文括號 475         Matcher matcher = pattern.matcher(delHtml);476         if (matcher.find()&&isNumeric(matcher.group(1))){477             return Integer.parseInt(matcher.group(1));478         }else {479             return 0;480         }481     }482     //判斷Str是否是 數字483     public static boolean isNumeric(String str){ 484         Pattern pattern = Pattern.compile("[0-9]*"); 485         return pattern.matcher(str).matches();    486     } 487     //判斷Str是否存在小標題號488     public static boolean isTitele(String str){489         Pattern pattern = Pattern.compile("^([//d]+[-//、].*)"); 490         return pattern.matcher(str).matches();491     }492     //判斷Str是否是選擇題選擇項493     public static boolean isSelecteTitele(String str){494         Pattern pattern = Pattern.compile("^([a-zA-Z]+[-//:].*)"); 495         return pattern.matcher(str).matches();496     }497     //判斷Str是否是大標題498     public static boolean isBigTilete(String str){499         boolean iso= false ;500         if(str.contains("一、")){501             iso=true;502         }else if(str.contains("二、")){503             iso=true;504         }else if(str.contains("三、")){505             iso=true;506         }else if(str.contains("四、")){507             iso=true;508         }else if(str.contains("五、")){509             iso=true;510         }else if(str.contains("六、")){511             iso=true;512         }else if(str.contains("七、")){513             iso=true;514         }else if(str.contains("八、")){515             iso=true;516         }517         return iso;518     }519 }
so 我們已經完成所有步驟。
文章出自:http://www.49028c.com/libaoting/p/wordToMap.html可自由引用,但請注明來源,謝謝。 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品一本久久男人的天堂| 欧美乱大交xxxxx另类电影| 国产精品第一页在线| 色噜噜狠狠色综合网图区| 日韩在线观看电影| 精品国产一区av| 日韩少妇与小伙激情| 2024亚洲男人天堂| 日韩精品在线视频美女| 亚洲欧洲日产国码av系列天堂| 91精品国产91久久久久久不卡| 国产精品亚洲视频在线观看| 成人h猎奇视频网站| 91久久国产综合久久91精品网站| 久久综合伊人77777尤物| 亚洲淫片在线视频| 欧美日韩国产va另类| 国内精品视频一区| 日韩av综合网站| 亚洲摸下面视频| 欧美国产视频一区二区| 国产一区二区三区直播精品电影| 蜜臀久久99精品久久久无需会员| 国产色视频一区| 亚洲第一天堂av| 亚洲第一免费播放区| 日韩精品视频免费专区在线播放| 97激碰免费视频| 欧洲亚洲在线视频| 亚洲视频777| 中文字幕久久亚洲| 日韩福利伦理影院免费| 成人免费看黄网站| 欧美二区乱c黑人| 91精品免费视频| 欧美电影免费观看高清完整| 国产婷婷成人久久av免费高清| 久久精品国产清自在天天线| 亚洲大胆美女视频| 亚洲精品日韩欧美| 55夜色66夜色国产精品视频| 色偷偷av一区二区三区| 日本国产欧美一区二区三区| zzijzzij亚洲日本成熟少妇| 亚洲成av人影院在线观看| 中文字幕亚洲欧美在线| 欧美韩日一区二区| 亚洲精品videossex少妇| 国产综合香蕉五月婷在线| 一区二区三区视频在线| 日韩av第一页| 91在线视频精品| 国产情人节一区| 欧美有码在线观看视频| 久色乳综合思思在线视频| 国产一区二区三区久久精品| 久久久久久久久网站| 国产女人18毛片水18精品| 亚洲无亚洲人成网站77777| 在线视频中文亚洲| 日韩av在线一区二区| 91人成网站www| 国产精品视频精品视频| 久久激情五月丁香伊人| 91精品成人久久| 成人午夜激情免费视频| 久久夜精品va视频免费观看| 成人欧美一区二区三区在线湿哒哒| 一区二区中文字幕| 精品中文字幕在线2019| 日韩中文字幕视频在线| 在线观看不卡av| 亚洲成av人乱码色午夜| 欧美怡春院一区二区三区| 国内精品久久久久影院优| 国产精品吹潮在线观看| 国产激情久久久| 欧美视频中文字幕在线| 精品亚洲va在线va天堂资源站| 亚洲福利影片在线| 亚洲第一av网| 日韩中文在线视频| 午夜美女久久久久爽久久| 日韩中文字幕在线| 国产97人人超碰caoprom| 欧美高清不卡在线| 欧美人与性动交a欧美精品| 日韩亚洲精品电影| 伊人伊人伊人久久| 欧美亚洲另类激情另类| 国产日韩精品综合网站| 欧美激情一级二级| 久久久在线免费观看| 亚洲国产精品va在看黑人| 中文字幕精品视频| www.xxxx欧美| 国产精品自产拍高潮在线观看| 国产日韩在线亚洲字幕中文| 中文字幕精品一区二区精品| 国产精品久久久久久搜索| 色狠狠av一区二区三区香蕉蜜桃| 色一情一乱一区二区| 欧美理论电影在线播放| 日韩av在线导航| 欧美日韩国产中文字幕| 国产一区二区三区高清在线观看| 久久精品免费播放| 国产精品极品美女粉嫩高清在线| 日韩av大片免费看| 中文字幕欧美精品在线| 97热精品视频官网| 成人有码在线播放| 萌白酱国产一区二区| 欧洲永久精品大片ww免费漫画| 欧美视频在线免费看| 国产日韩视频在线观看| 亚洲国产古装精品网站| 色综合男人天堂| 久久久久中文字幕| 久久久久久亚洲精品不卡| 亚洲一区二区三区sesese| 国产精品美女久久久免费| 一区二区三区日韩在线| 中文字幕在线日韩| 色婷婷亚洲mv天堂mv在影片| 亚洲乱码一区av黑人高潮| 91久久国产婷婷一区二区| 成人精品视频99在线观看免费| 国产精品久久久久久久久久新婚| 欧美成人精品在线视频| 日韩av在线影院| 日韩av电影手机在线观看| 91大神福利视频在线| 欧美高清在线视频观看不卡| 色综合天天狠天天透天天伊人| 98精品在线视频| 91在线无精精品一区二区| 欧美在线影院在线视频| 这里只有精品视频| 宅男66日本亚洲欧美视频| 成人欧美在线视频| 国产精品香蕉av| 亚洲精品乱码久久久久久金桔影视| 少妇精69xxtheporn| 91高潮精品免费porn| 亚洲区中文字幕| 亚洲欧洲一区二区三区久久| 欧美激情一二三| 午夜精品一区二区三区av| 欧美午夜宅男影院在线观看| 精品成人乱色一区二区| 69精品小视频| 亚洲欧美三级伦理| 亚洲国产精品网站| 国语自产精品视频在线看一大j8| 精品欧美激情精品一区| 日日摸夜夜添一区| 久久露脸国产精品| 亚洲最大中文字幕| 69av视频在线播放| 欧美疯狂性受xxxxx另类| 欧美性xxxx在线播放| 91超碰caoporn97人人| 亚洲成人亚洲激情|