解析word文档,获取相应的数据,并封装成相应的javaBean(二)
来源:互联网 发布:sql设置主键语句 编辑:程序博客网 时间:2024/06/11 16:59
该类主要是用程序来读取word文本,并拿到你想要的内容, 我这里主要是解析一道完整的数学试题, 包括(题目,选项,答案,考点,分析,解答,点评)等内容
package com.ilike.poi;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.model.PicturesTable;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.Range;
import com.ilike.utils.RandomNameUtil;
/**
*
*
* 实现思路:
* 1.先逐字读取整个word文档,并替换里面的图片,回车符,空格符等内容
* 2.将替换后的文本做初次切割,切出含有题目,选项,答案等内容的片段,封装成一个map集合
* 3.将初次切割后的内容片段拿来做二次切割(调用相应的切割方法进行切割),切出自己想要的内容
*
* @author 桑伟东
*
* 注意:这个切割只实现了简单的读写,读取的2的平方这样的数据依旧有问题,但会很快在下一次发表时实现
*/
public class WordToHtml7 {
public static String readFile = "F:\\doc_test\\swdTest1.doc";//要解析的文档public static String outPath = "F:\\temp_image\\";//文档中图片的存储路径public static String ziful = "【";//文档中含有的符号public static String zifur = "】";//文档中含有的符号private static final short ENTER_ASCII = 13;// 回车符private static final short SPACE_ASCII = 32;// 空格private static final short KONGGE_ASCII = 9;// 空格是9(这个空格是我自己调试程序发现的,正规的空格对应的编码应该是32)public static void main(String[] args) throws Exception { //1.替换图片及回车符等 String html = replacePhotoAndEnter(readFile); //2.初次切割 Map<String, String> map = splitItems(html); //3.二次切割 secondSplit(map);}/** * 读取word文本,替换里面的图片以及空格,回车符等 说明:将图片替换成相应的image标签,将空格替换成 ,将回车符替换成</br> * * @param fileName * 需要替换的文件 * @return 替换后的字符串文本 * @throws Exception */public static String replacePhotoAndEnter(String fileName) throws Exception { // 1.创建字节输入流读取要解析的文档 FileInputStream in = new FileInputStream(new File(fileName)); // 2.创建文档对象 HWPFDocument doc = new HWPFDocument(in); // 3.取得文档中字符的总数 int length = doc.characterLength(); // 4.获取PicturesTable对象 PicturesTable pTable = doc.getPicturesTable(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < length; i++) { Range range = new Range(i, i + 1, doc); CharacterRun cr = range.getCharacterRun(0); // System.out.println(cr.text()+"------"+(short)(cr.text().charAt(0))); // 1.判断该字符是否是照片 if (pTable.hasPicture(cr)) { // 是照片 Picture pic = pTable.extractPicture(cr, false); String file = outPath + RandomNameUtil.getRandomName6N() + ".png"; // 创建一个输出流 OutputStream out = new FileOutputStream(file); // 将图片写出去 pic.writeImageContent(out); // 替换图片 String webPath = "<image src='" + file + "'/>"; sb.append(webPath); // 2.判断该字符是否是回车符,如果是就用<br/>替换 } else if (cr.text().charAt(0) == ENTER_ASCII) { sb.append("<br/>"); // 3.判断该字符是否是空格符,如果是用 替换 } else if (cr.text().charAt(0) == SPACE_ASCII) { sb.append(" "); // 4.判断该字符是否是空格符,如果是用 替换(非正规替换) } else if (cr.text().charAt(0) == KONGGE_ASCII) { sb.append(" "); // 5.如果所有的这些都不是,默认为普通文本 } else { sb.append(cr.text()); } } return sb.toString();}/** * 该方法将替换后的文本做初次切割,切割出含有想要内容的粗糙文本(含有不想要的内容), 最后封装成一个map返回 * * @param src * 初次切割的文本 * @return */public static Map<String, String> splitItems(String src) { Map<String, String> map = new HashMap<String, String>(); // 1.获取“【答案】”的位置 Integer answerPoi = src.indexOf("【答案】"); // 2.截取包含测试题的内容,并保存输出 String test = src.substring(0, answerPoi); map.put("test", test); // System.out.println("test:"+test); // 3.获取【考点】的位置 Integer keyPoi = src.indexOf("【考点】"); // 4.截取包含答案的内容,并保存输出 String answer = src.substring(answerPoi, keyPoi); map.put("answer", answer); // System.out.println("answer:"+answer); // 5.获取【分析】的位置 Integer analysePoi = src.indexOf("【分析】"); // 6.截取包含考点的内容,并保存输出 String keys = src.substring(keyPoi, analysePoi); map.put("keys", keys); // System.out.println("keys:"+keys); // 7.获取【解答】的位置 Integer jiedaPoi = src.indexOf("【解答】"); // 8.截取包含分析的内容,并保存输出 String analyse = src.substring(analysePoi, jiedaPoi); map.put("analyse", analyse); // System.out.println("analyse:"+analyse); // 9.获取【点评】的位置 Integer commentPoi = src.indexOf("【点评】"); // 10.截取包含考点的内容,并保存输出 String jieda = src.substring(jiedaPoi, commentPoi); map.put("jieda", jieda); // System.out.println("jieda:"+jieda); // 11.截取包含点评的内容,并保存输出 String comment = src.substring(commentPoi, src.length()); map.put("comment", comment); // System.out.println("comment:"+comment); return map;}/** * 对初次剪切后的各种文本进行二次深加工,切出真正想要的内容 如果要封装成相应的Bean,在这里就可以封装,这个较为简单,不再赘述 * * @param map * 初次切割后的文本 */public static void secondSplit(Map<String, String> map) { for (String item : map.keySet()) { if (item.equals("test")) { // 是题目,调用题目剪切方法进行切割 String test = testSplit(map.get("test")); System.out.println("test:" + test); // 这里面也含有选项,顺带切出选项 String option = optionSplit(map.get("test")); System.out.println("option:" + option); } else if (item.equals("answer")) { // 是答案,调用答案剪切方法进行切割 String answer = answerSplit(map.get("answer")); System.out.println("answer:" + answer); } else if (item.equals("keys")) { // 是考点,调用考点剪切方法进行切割 String keys = keysSplit(map.get("keys")); System.out.println("keys:" + keys); } else if (item.equals("analyse")) { // 是分析,调用分析剪切方法进行切割 String analyse = analyseSplit(map.get("analyse")); System.out.println("analyse:" + analyse); } else if (item.equals("comment")) { // 是点评,调用点评剪切方法进行切割 String comment = commentSplit(map.get("comment")); System.out.println("comment:" + comment); } else if (item.equals("jieda")) { // 是解答,调用解答剪切方法进行切割 String jieda = jiedaSplit(map.get("jieda")); System.out.println("jieda:" + jieda); } else { System.out.println("未知的东东"); } }}/** * 从含有题目的文本剪切出题目 * * @param srcTest * @return */private static String testSplit(String srcTest) { // 1.获取"一.选择题"的位置 Integer pesition1 = srcTest.indexOf("一.选择题"); // 2.获取"A."的位置 Integer pesition2 = srcTest.indexOf("A."); // 3.切出题目 String testtext = srcTest.substring(pesition1, pesition2); // System.out.println("test:"+testtext); // 4.获取第一个和最后一个“<br/>”的位置 testtext = testtext.substring(testtext.indexOf("<br/>") + "<br/>".length(), testtext.lastIndexOf("<br/>")); // System.out.println("test:"+testtext); return testtext;}/** * 从含有选项的文本里切出选项 * * @param srcOption * @return */private static String optionSplit(String srcOption) { // 1.获取"A."的位置 Integer pesition1 = srcOption.indexOf("A."); // 2.获取最后一个“<br/>”的位置 Integer pesition2 = srcOption.lastIndexOf("<br/"); // 3.切出option的内容 String option = srcOption.substring(pesition1, pesition2); // System.out.println("option:"+option); return option;}/** * 从含有答案的文本里切出选项 * * @param srcOption * @return */// answer:【答案】D<br/>private static String answerSplit(String answerSrc) { // 1.获取"【答案】"的位置 Integer pesition1 = answerSrc.indexOf("【答案】"); // 2.获取最后一个“<br/>”的位置 Integer pesition2 = answerSrc.lastIndexOf("<br/"); // 3.切出answer的内容 String answer = answerSrc.substring(pesition1, pesition2); // System.out.println("answer:"+answer); return answer;}/** * 从含有考点的文本里切出选项 * * @param srcOption * @return */// keys:【考点】4C:完全平方公式.菁优网版权所有<br/>private static String keysSplit(String keysSrc) { // 1.获取"【考点】"的位置 Integer pesition1 = keysSrc.indexOf("【考点】"); // 2.获取最后一个“<br/>”的位置 Integer pesition2 = keysSrc.lastIndexOf("<br/"); // 3.切出keys的内容 String keys = keysSrc.substring(pesition1, pesition2); // System.out.println("keys:"+keys); return keys;}/** * 从含有分析的文本里切出选项 * * @param srcOption * @return */// analyse:【分析】首先把a2+b2+c2﹣ab﹣bc﹣ac变为<image// src='F:\temp_image\72d4db.png'/>(2a2+2b2+2c2﹣2ab﹣2bc﹣2ac),然后利用完全平方公式变为三个完全平方式,然后代入已知数据即可求解.<br/>private static String analyseSplit(String analyseSrc) { // 1.获取"【分析】"的位置 Integer pesition1 = analyseSrc.indexOf("【分析】"); // 2.获取最后一个“<br/>”的位置 Integer pesition2 = analyseSrc.lastIndexOf("<br/"); // 3.切出analyse的内容 String analyse = analyseSrc.substring(pesition1, pesition2); // System.out.println("analyse:"+analyse); return analyse;}/** * 从含有解答的文本里切出选项 * * @param srcOption * @return */// jieda:【解答】解:∵a2+b2+c2﹣ab﹣bc﹣ac<br/>=<image// src='F:\temp_image\1c1dde.png'/>(2a2+2b2+2c2﹣2ab﹣2bc﹣2ac)<br/>=<image// src='F:\temp_image\829ed0.png'/>[(a2﹣2ab+b2)+(b2﹣2bc+c2)+ (c2﹣2ac+a2)]<br/>=<image// src='F:\temp_image\e7ded0.png'/>[(a﹣b)2+(b﹣c)2+(c﹣a)2]<br/>而a=2000x+2001,b=2000x+2002,c=2000x+2003,<br/>∴a﹣b=2000x+2002﹣(2000x+2001)=1,<br/>同理 b﹣c=﹣1,c﹣a=2,<br/>∴a2+b2+c2﹣ab﹣bc﹣ac<br/>=<image// src='F:\temp_image\ee910f.png'/>[(a﹣b)2+(b﹣c)2+(c﹣a)2]<br/>=3.<br/>故选D.<br/>private static String jiedaSplit(String jiedaSrc) { // 1.获取"【解答】"的位置 Integer pesition1 = jiedaSrc.indexOf("【解答】"); // 2.获取最后一个“<br/>”的位置 Integer pesition2 = jiedaSrc.lastIndexOf("<br/"); // 3.切出jieda的内容 String jieda = jiedaSrc.substring(pesition1, pesition2); // System.out.println("jieda:"+jieda); return jieda;}/** * 从含有点评的文本里切出选项 * * @param srcOption * @return */// comment:【点评】此题主要考查了利用完全平方公式进行代数式变形,然后求复杂代数式的值,解题的关键是把所求代数式变形,从而大大简化计算过程.题目难度比较大.<br/><br/>private static String commentSplit(String commentSrc) { // 1.获取"【点评】"的位置 Integer pesition1 = commentSrc.indexOf("【点评】"); // 2.获取最后一个“<br/>”的位置 Integer pesition2 = commentSrc.lastIndexOf("<br/"); // 3.切出comment的内容 String comment = commentSrc.substring(pesition1, pesition2); // System.out.println("comment:"+comment); return comment;}
}
- 解析word文档,获取相应的数据,并封装成相应的javaBean(二)
- 解析word文档,获取相应的数据,并封装成相应的javaBean(一)
- Java接收Cordys中webservice接口的返回数据并解析xml获取相应节点数据
- 按权重随机获取相应的数据
- MongoDB group by max 分组查询组内最大的数据,并获取相应的数据
- 获取手机里所有的app并点击相应的图标开启相应的程序
- Java POI --- Java导入excel文档的相应列的数据到数据库的相应字段
- C++读取txt文档内容并截取相应的字符串
- Delphi中的数据添加到Word模板的相应位置
- 使用vb.net获取相应文件夹下相应文件的个数并显示
- JTable相应鼠标事件,并获取被点击相应行的所有值
- js获取radio的值并做相应的跳转
- 获取字符串每个字符并给予相应的赋值
- window获取系统默认浏览器并打开相应的网址
- ios获取当前时间,并对时间的相应处理
- jsp获取随机数并跳转到相应的jsp
- Bmob查询获取不到相应的数据的问题
- 数据插入数据库中获取相应的主键值
- 判断内部命令和外部命令
- Linux ls -l ll ln介绍
- Oracle DBA学习基础篇(一) Oracle体系结构 学习笔记
- js问题
- You need tcl 8.5 or newer in order to run the Redis test
- 解析word文档,获取相应的数据,并封装成相应的javaBean(二)
- 前缀、中缀、后缀表达式
- ASP.NET Core 认证与授权[5]:初识授权
- 欢迎使用CSDN-markdown编辑器
- Python 中文编码
- Integer.parseInt()方法将一个字符串转换成int型
- 小北微信小程序小白系列教程第一篇-- Hello World
- qdaemon not running after system boot AIX 5.2
- [基础常识]迁移ECS云服务器