博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
word文档处理成富文本生成sql语句导入mysql
阅读量:6307 次
发布时间:2019-06-22

本文共 9891 字,大约阅读时间需要 32 分钟。

hot3.png

问题:需要将大量的已存在的word文档导入到web项目里在网站展示,不可能通过编辑录入的方式处理,通过程序实现。

解决思路:通过读取word文档处理成html,再获取html富文本内容,拼接成sql,导入数据库。

要点

1:读取word文件夹会递归读取,只要文件夹下有word文档即可,程序中有过滤word文档的代码,可根据需要修改;
2、可同时处理word2003和word2007+版本的word文档;
3、读取word2007生成的html文档内中文是unicode编码的,放到数据库或浏览器直接打开,不影响页面显示;
4、对word文档中图片做了处理,存储到单独的文件夹,导入mysql或其它数据库后,正确显示图片,要注意路径处理;
5、只处理word2007文档可不生成html直接获取富文本内容,但2003版本不可以,因此统一将doc文档都生成html页面再用java读取html文档获取body元素下的富文本内容。

不足之处,欢迎交流和指正。

可能用到的pom如下:

org.apache.poi
poi
3.15
org.apache.poi
poi-scratchpad
3.15
fr.opensagres.xdocreport
fr.opensagres.xdocreport.document
2.0.1
fr.opensagres.xdocreport
org.apache.poi.xwpf.converter.xhtml
1.0.6
fr.opensagres.xdocreport
org.apache.poi.xwpf.converter.core
1.0.6
fr.opensagres.xdocreport
org.apache.poi.xwpf.converter.pdf
1.0.6

完整的java代码如下:

package test;import org.apache.commons.lang.StringUtils;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.converter.WordToHtmlConverter;import org.apache.poi.hwpf.usermodel.Picture;import org.apache.poi.xwpf.converter.core.FileImageExtractor;import org.apache.poi.xwpf.converter.core.FileURIResolver;import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.junit.Test;import org.w3c.dom.Document;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import java.io.*;import java.util.*;import java.util.regex.Matcher;import java.util.regex.Pattern;/* * @Desc word转化为html * @Author ls 2019/3/19 0019 11:21 */public class Word2Html {    @Test    public void handleWordToSql() {        String path = "F:\\word文档\\";        List
fileNames = new ArrayList<>(); Map
contentsMap = new HashMap<>(); getAllFileName(path, fileNames);// fileNames.forEach(System.out::println);// System.out.println(fileNames.size()); Map
map = handleFileName(fileNames); String imagePath = "F:\\images\\"; String htmlPath = "F:\\html\\"; map.forEach((k, v) -> { String content = ""; String articleName = k.substring(0, k.lastIndexOf(".")); String htmlName = articleName + ".html"; if (k.contains(".doc") && !k.contains(".docx")) { try { content = word2003ToHtml(imagePath + generateImageName() + "\\", v, htmlPath + htmlName); } catch (TransformerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } else if (k.contains(".docx")) { try { content = word2007ToHtml(imagePath + generateImageName() + "\\", v, htmlPath + htmlName); } catch (IOException e) { e.printStackTrace(); } } else { System.out.println("word文档格式不正确->" + k); } if (StringUtils.isNotBlank(content)) { contentsMap.put(articleName, content); } }); System.out.println("文章总条数: " + contentsMap.size());// contents.forEach(System.out::println); handleInsertSql(contentsMap); } /** * 处理sql * * @param contentsMap * @return */ public String handleInsertSql(Map
contentsMap) { StringBuffer sb = new StringBuffer(); int id = 161; for (String k : contentsMap.keySet()) { sb.append("INSERT INTO `article` VALUES (" + id + ", '2019-03-19 14:24:56', '2019-03-19 10:53:56', '0', '网络文章', \"" + contentsMap.get(k).replace("\"", "\\\'") + "\", '0', '', '', null, null, null, '" + k + "', '1', null, '0', null)"); sb.append(" ;"); sb.append("\r\n"); id++; } String data = sb.toString(); data = data.replace("F:\\images\\", "/images/"); writeFile(new StringBuffer(data));// System.out.println(data); return data; } /** * 路径处理为map key-> word文件名 value-> 全路径 * * @param list * @return */ public Map
handleFileName(List
list) { if (list.size() == 0) { System.out.println("没有需要处理的文件!"); } // 过滤非word文档路径 for (int i = 0; i < list.size(); i++) { String str = list.get(i); if (str.contains(".doc") || str.contains(".docx")) { } else { list.remove(str); i--; } } Map
map = new HashMap<>(); for (String path : list) { if (StringUtils.isNotBlank(path)) { String[] arr = path.split("\\\\"); for (String value : arr) { if (value.contains(".doc") || value.contains(".docx")) { // 文件名 全路径 map.put(value, path); } } } } return map; } /** * 获取所有文件夹及文件 * * @param path * @param listFileName */ public void getAllFileName(String path, List
listFileName) { File file = new File(path); File[] files = file.listFiles(); String[] names = file.list(); if (names != null) { String[] completNames = new String[names.length]; for (int i = 0; i < names.length; i++) {// if(path.contains(".doc") || path.contains(".docx")) completNames[i] = path + names[i]; } listFileName.addAll(Arrays.asList(completNames)); } for (File a : files) { if (a.isDirectory()) { //如果文件夹下有子文件夹,获取子文件夹下的所有文件全路径。 getAllFileName(a.getAbsolutePath() + "\\", listFileName); } } } /** * word2003转换 * * @param imgPath * @param fileName * @param outPutFile */ public String word2003ToHtml(String imgPath, String fileName, String outPutFile) throws TransformerException, IOException, ParserConfigurationException { HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(fileName)); WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter( DocumentBuilderFactory.newInstance().newDocumentBuilder() .newDocument()); wordToHtmlConverter.setPicturesManager((content, pictureType, suggestedName, widthInches, heightInches) -> suggestedName); wordToHtmlConverter.processDocument(wordDocument); //save pictures List pics = wordDocument.getPicturesTable().getAllPictures(); if (pics != null) { for (int i = 0; i < pics.size(); i++) { Picture pic = (Picture) pics.get(i); System.out.println(); try { pic.writeImageContent(new FileOutputStream(imgPath + pic.suggestFullFileName())); } catch (FileNotFoundException e) { e.printStackTrace(); } } } Document htmlDocument = wordToHtmlConverter.getDocument(); ByteArrayOutputStream out = new ByteArrayOutputStream(); DOMSource domSource = new DOMSource(htmlDocument); StreamResult streamResult = new StreamResult(out); TransformerFactory tf = TransformerFactory.newInstance(); Transformer serializer = tf.newTransformer(); serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); serializer.setOutputProperty(OutputKeys.INDENT, "yes"); serializer.setOutputProperty(OutputKeys.METHOD, "html"); serializer.transform(domSource, streamResult); out.close(); writeFile(new String(out.toByteArray()), outPutFile); String body = readHtml(new File((outPutFile)));// System.out.println(out.toString()); body = replaceBreak(body);// System.out.println(body); return body; } /** * word2007转html * * @throws IOException */ public String word2007ToHtml(String imgPath, String fileName, String htmlName) throws IOException { File f = new File(fileName); String content = ""; if (!f.exists()) { System.out.println("Sorry File does not Exists!"); } else { if (f.getName().endsWith(".docx") || f.getName().endsWith(".docx")) { // 1) 加载word文档生成 XWPFDocument对象 InputStream in = new FileInputStream(f); if (in.available() == 0) { return content; } XWPFDocument document = new XWPFDocument(in); // 2) 解析 XHTML配置 (这里设置IURIResolver来设置图片存放的目录) File imageFolderFile = new File(imgPath); XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imageFolderFile)); options.setExtractor(new FileImageExtractor(imageFolderFile)); options.setIgnoreStylesIfUnused(false); options.setFragment(true); // 3) 将 XWPFDocument转换成XHTML OutputStream out = new FileOutputStream(new File(htmlName)); XHTMLConverter.getInstance().convert(document, out, options); //也可以使用字符数组流获取解析的内容 ByteArrayOutputStream baos = new ByteArrayOutputStream(); XHTMLConverter.getInstance().convert(document, baos, options); if (baos.size() == 0) { return content; } content = baos.toString(); // 输出转化后的文本 // System.out.println(content); baos.close(); } else { System.out.println("Enter only MS Office 2007+ files"); } } return content; } /** * 解析html文件 获得body内容 * * @param file * @return */ public String readHtml(File file) { String body = ""; try { FileInputStream iStream = new FileInputStream(file); Reader reader = new InputStreamReader(iStream); BufferedReader htmlReader = new BufferedReader(reader); String line; boolean found = false; while (!found && (line = htmlReader.readLine()) != null) { if (line.toLowerCase().indexOf("
的前面可能存在空格 found = true; } } found = false; while (!found && (line = htmlReader.readLine()) != null) { if (line.toLowerCase().indexOf("
元素,则分行进行替代 String[] splitLines = line.split("

运行handleWordToSql测试方法即可!

效果图:

原word文档

处理后的html

对应的html图片文件夹

生成的sql

转载于:https://my.oschina.net/u/2301293/blog/3024592

你可能感兴趣的文章
针对Kubernetes软件栈有状态服务设计的思考
查看>>
你的可用性达标了吗?云端业务性能高可用的深度实践
查看>>
linux yum清缓存脚本
查看>>
基于epoll封装的事件回调miniserver
查看>>
天猫高管全面解读大快消2018新零售打法
查看>>
idea springboot热部署无效问题
查看>>
第八章 进程间通信
查看>>
HttpSession接口中的方法(Jsp中的session类的用法)
查看>>
「镁客早报」AI可预测心脏病人死亡时间;机器人开始在美国送外卖
查看>>
MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
查看>>
物联网全面升级,十年内推动工业进入智能化新阶段
查看>>
spring-通过ListFactory注入List
查看>>
一种基于SDR实现的被动GSM嗅探
查看>>
阿里云ECS每天一件事D1:配置SSH
查看>>
SQL Server 性能调优(性能基线)
查看>>
uva 10801 - Lift Hopping(最短路Dijkstra)
查看>>
[Java Web]servlet/filter/listener/interceptor区别与联系
查看>>
POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
查看>>
从零开始学MVC3——创建项目
查看>>
CentOS 7 巨大变动之 firewalld 取代 iptables
查看>>