小弟要将word数据解析出来导入数据库

问题描述

小弟我要将有一定格式的word文档解析出来导入数据库,网上查的方法有POI,JACOB,openoffice,JACOB只能运行在windows下,所以放弃,打算用POI,有木有哪位大神做个类似的?求指教。

解决方案

解决方案二:
word文档?做过EXCEL的,还不错
解决方案三:
excel我用poi还不错,word就纠结了
解决方案四:
推荐openoffice,如果是docx的话poi是扛不住的,另doc中的公式poi是很难搞定的,对于docopenffice解析不错,对docx公式需要自己写代码+openoffice能搞定。。。
解决方案五:
我要读取的word文档是一定的格式,都是文本,根据标题和内容分别存入数据库,poi不能实现吗?
解决方案六:
引用4楼u013114085的回复:

我要读取的word文档是一定的格式,都是文本,根据标题和内容分别存入数据库,poi不能实现吗?

都是文本的放doc应该没问题,poi官方说对docx支持不好,现在不知道是什么情况了,我没试过,我想都是文本的话应该可以
解决方案七:
这个就三层结构,大标题,小标题,和内容,根据这三个内容存入不同的字段,能实现吗?
解决方案八:
现在我用的是poi3.9最新版本,2007应该支持的。
解决方案九:
引用7楼u013114085的回复:

现在我用的是poi3.9最新版本,2007应该支持的。

可以。有两种方式:一种是将word转为html,然后解析html。这样有个好处是可以保留word中的样式,目前我用的就是这种。另一种它应该有提取段落文字的方法,不过应该没有样式,我没有试过,不过感觉应该可以。
解决方案十:
既然楼主这么有诚意,我来贴2段代码:读取word当中的内容packagecom.lk.core.util.commons;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importorg.apache.poi.hwpf.HWPFDocument;importorg.apache.poi.hwpf.usermodel.Picture;importorg.apache.poi.hwpf.usermodel.Range;/***读取word文档的工具类,只支持word2003**@authorzero**/publicclassWordDocUtil{/***文件读取流对象*/privateFileInputStreamfileInputStream=null;/***word文档对象*/privateHWPFDocumentwordDoc=null;/***定义文档中图片的最小大小,因为在读取图片的时候,出现一些非图片的文本框,也被认为是图片被读取出来了*/privatestaticfinalintMIN_PICTURE_CONTEXT=10000;privatevoidsetFileInputStream(FileInputStreamfileInputStream){this.fileInputStream=fileInputStream;}privatevoidsetWordDoc(HWPFDocumentwordDoc){this.wordDoc=wordDoc;}privatevoidinitWordDoc()throwsNullPointerException,IOException{if(fileInputStream==null){thrownewNullPointerException("Fileinputstreamisnull!");}if(wordDoc==null){this.setWordDoc(newHWPFDocument(fileInputStream));}}/***传入word文档路径**@parampath*@throwsFileNotFoundException*/publicWordDocUtil(Stringpath)throwsFileNotFoundException{this.setFileInputStream(newFileInputStream(path));}/***传入文件对象**@paramf*@throwsFileNotFoundException*/publicWordDocUtil(Filef)throwsFileNotFoundException{this.setFileInputStream(newFileInputStream(f));}/***传入文件读取流**@paramis*/publicWordDocUtil(FileInputStreamis){this.setFileInputStream(is);}/***返回word文档中的文字内容,不包含图片等信息**@return*@paramignoreEmpty*是否忽略空内容的行*@throwsIOException*@throwsException*/publicStringgetText(booleanignoreEmpty)throwsNullPointerException,IOException{initWordDoc();intlen=this.getDocParagraphsNum();StringBuffersb=newStringBuffer();StringtmpStr=null;for(inti=0;i<len;i++){tmpStr=this.getParagraphsText(i);if(ignoreEmpty&&!tmpStr.trim().isEmpty()){sb.append(tmpStr);}elseif(!ignoreEmpty){sb.append(tmpStr);}}returnsb.toString();}/***返回文档中的段落数**@throwsIOException*@throwsNullPointerException**@throwsException*/publicintgetDocParagraphsNum()throwsNullPointerException,IOException{initWordDoc();Rangerange=this.wordDoc.getRange();returnrange.numParagraphs();}/***根据段落号获取段落内容,除文档之外的如图片等信息会显示不正确段落号的起始为0**@return*@throwsIOException*@throwsNullPointerException*@throwsException*/publicStringgetParagraphsText(intindex)throwsNullPointerException,IOException{initWordDoc();Rangerange=this.wordDoc.getRange();intlen=range.numParagraphs();if(index>len-1){thrownewIndexOutOfBoundsException("paragraphindexisoutofrange.");}returnrange.getParagraph(index).text().toString();}/***获取文档中的内容,按照段落返回list**@return*@throwsIOException*@throwsNullPointerException*/publicList<String>getDocListText()throwsNullPointerException,IOException{returngetDocListText(null,true);}/***获取文档中的内容,按照段落返回list**@parambeginContext*开始段落的内容,从此段落开始读取数据*@paramneedContext*:是否一定需要返回内容,即如果没有匹配到头,则直接返回文件全内容,保证读取的准确性*@return*@throwsIOException*@throwsNullPointerException*/publicList<String>getDocListText(StringbeginContext,booleanneedContext)throwsNullPointerException,IOException{intlen=getDocParagraphsNum();List<String>context=newArrayList<String>();booleanfindBegin=false;if(beginContext==null){findBegin=true;}for(inti=0;i<len;i++){if(!findBegin&&getParagraphsText(i).trim().equals(beginContext)){findBegin=true;}if(findBegin){context.add(getParagraphsText(i));}}if(context.size()==0&&needContext){for(intj=0;j<len;j++){context.add(getParagraphsText(j));}}returncontext;}/***获取文档中图片的数量**@return*@throwsNullPointerException*@throwsIOException*/publicintgetDocPictureNum()throwsNullPointerException,IOException{initWordDoc();returnthis.wordDoc.getPicturesTable().getAllPictures().size();}/***获取文档中的word图片,写入到fos,图片索引从0开始**@paramfos*@throwsIOException*@throwsNullPointerException*/publicvoidgetDocPicture(FileOutputStreamfos,intindex)throwsNullPointerException,IOException{initWordDoc();List<Picture>pictures=this.wordDoc.getPicturesTable().getAllPictures();if(index>pictures.size()-1){thrownewIndexOutOfBoundsException("pictureindexisoutofrange.");}Picturep=pictures.get(index);p.writeImageContent(fos);fos.close();}/***获取word文档中的图片,可以直接写入流**@throwsIOException*@throwsNullPointerException**/publicbyte[]getDocPicture(intindex)throwsNullPointerException,IOException{initWordDoc();List<Picture>pictures=this.wordDoc.getPicturesTable().getAllPictures();if(index>pictures.size()-1){thrownewIndexOutOfBoundsException("pictureindexisoutofrange.");}Picturep=pictures.get(index);returnp.getContent();}/***获取所有的文档图片,返回context**@throwsIOException*@throwsNullPointerException**/publicList<byte[]>getAllDocPicture()throwsNullPointerException,IOException{initWordDoc();List<Picture>pictures=this.wordDoc.getPicturesTable().getAllPictures();List<byte[]>retList=newArrayList<byte[]>();for(Picturep:pictures){byte[]picContext=p.getContent();if(picContext.length<MIN_PICTURE_CONTEXT){continue;}else{retList.add(picContext);}}//当前出现了图片乱序问题,即读取出来的图片顺序和实际的word里的图片顺序不一致//当前这里默认设置下,第一个图片的size比第二个的大if(retList.size()>=2){if(retList.get(0).length<retList.get(1).length){retList.add(0,retList.get(1));retList.remove(2);}}returnretList;}publicvoidcloseStream(){if(this.fileInputStream!=null){try{this.fileInputStream.close();}catch(IOExceptione){}}}@Overrideprotectedvoidfinalize()throwsThrowable{closeStream();super.finalize();}}

解决方案十一:
转换word为html文件packagecom.lk.core.util.commons;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStreamWriter;importjava.util.ArrayList;importjava.util.List;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importjavax.xml.transform.OutputKeys;importjavax.xml.transform.Transformer;importjavax.xml.transform.TransformerException;importjavax.xml.transform.TransformerFactory;importjavax.xml.transform.dom.DOMSource;importjavax.xml.transform.stream.StreamResult;importorg.apache.commons.io.output.ByteArrayOutputStream;importorg.apache.poi.hwpf.HWPFDocument;importorg.apache.poi.hwpf.converter.PicturesManager;importorg.apache.poi.hwpf.converter.WordToHtmlConverter;importorg.apache.poi.hwpf.usermodel.Picture;importorg.apache.poi.hwpf.usermodel.PictureType;importorg.w3c.dom.Document;/***利用POI插件,将word转换为htmlCopyright(c)2013byzero.*/publicclassWord2HtmlUtil{//从word中提取的图片存放的文件夹名称,该文件夹和html文件同级privatestaticfinalStringIMAGE_FOLDER="wordImage";/***将内容写入文件*/privatestaticvoidwriteFile(Stringcontent,Stringpath){FileOutputStreamfos=null;BufferedWriterbw=null;try{try{fos=newFileOutputStream(newFile(path));bw=newBufferedWriter(newOutputStreamWriter(fos));bw.write(content);}finally{if(bw!=null){bw.close();}if(fos!=null){fos.close();}}}catch(Exceptione){e.printStackTrace();}}/***创建保存word图片的文件夹*/privatestaticvoidcreateOutPutFolder(StringhtmlFolder){Filefolder=newFile(htmlFolder);if(!folder.exists()||!folder.isDirectory()){folder.mkdirs();}FileimageFolder=newFile(folder.getAbsoluteFile()+File.separator+IMAGE_FOLDER);if(!imageFolder.exists()||!imageFolder.isDirectory()){imageFolder.mkdirs();}}/***将word文档转换为html格式*/publicstaticvoidconvert2Html(StringfileName,StringoutPutFile)throwsTransformerException,IOException,ParserConfigurationException{Stringfolder=newFile(outPutFile).getParent();createOutPutFolder(folder);HWPFDocumentwordDocument=newHWPFDocument(newFileInputStream(fileName));WordToHtmlConverterwordToHtmlConverter=newWordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());//用于保存word中的图片的名称finalList<String>picNames=newArrayList<String>();wordToHtmlConverter.setPicturesManager(newPicturesManager(){publicStringsavePicture(byte[]content,PictureTypepictureType,StringsuggestedName,floatwidthInches,floatheightInches){//保存图片名称picNames.add(suggestedName);//图片文件存储的相对路径returnIMAGE_FOLDER+File.separator+suggestedName;}});wordToHtmlConverter.processDocument(wordDocument);List<Picture>pics=wordDocument.getPicturesTable().getAllPictures();if(pics!=null){for(inti=0;i<pics.size();i++){Picturepic=pics.get(i);try{pic.writeImageContent(newFileOutputStream(folder+File.separator+IMAGE_FOLDER+File.separator+pic.suggestFullFileName()));}catch(FileNotFoundExceptione){e.printStackTrace();}}}DocumenthtmlDocument=wordToHtmlConverter.getDocument();ByteArrayOutputStreamout=newByteArrayOutputStream();DOMSourcedomSource=newDOMSource(htmlDocument);StreamResultstreamResult=newStreamResult(out);TransformerFactorytf=TransformerFactory.newInstance();Transformerserializer=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(newString(out.toByteArray()),outPutFile);}}

时间: 2024-10-26 18:55:55

小弟要将word数据解析出来导入数据库的相关文章

ASP.NET下将Excel表格中的数据规则的导入数据库思路分析及实现_实用技巧

今天接到新的需求,要求将Excel表格中的数据显示在页面上. 我个人分析,首先要将Excel中的数据存到数据库中,再进行页面显示,本人菜鸟级别,以前没有做过读取Excel数据,研究了一下(主要是看别人的资料),写一下实现过程,我想写几篇关于Excel的,首先是规则的Excel数据导入,再有就是不规则的Excel数据导入,还有就是根据数据生成Excel. 下面开始:将规则的Excel导入数据库 首先看一下Excel结构,如图:  这是一个简单的.规整的Excel格式,将它导入到数据库中 复制代码

java大批量数据导入数据库

问题描述 java大批量数据导入数据库 有大学130W条数据需要写入数据库,但是一条一条执行sql语句写入速度太慢, 有没有什么好的方法能将这些数据快速写入数据库? 解决方案 先把数据写到文件(比如csv格式),上传到服务器,导入的SQL很简单(注意是服务器上文件路径) BULK INSERT table1 FROM 'D:mydata.csv' WITH( FIELDTERMINATOR = ',', ROWTERMINATOR = 'n' ) 解决方案二: 每种数据库都支持一个把数据文件直接

TXT文件导入数据库问题

问题描述 问题描述:现有一文件,内容比较的多,可能要到1MB以上,所以想用bcp导入到数据库中,但是问题是文件的格式不是规范.如下所示10,100000,大家帮我想想办法吧,100,10010,200000,我怎么才能解决问题,100,10010,300000,我在这里谢谢大家了,100,10010,400000,大虾们,请帮帮我啦,100,100前面3行是正确的格式,但是文件里面可能有错误的数据,比如第4行,理论上第3列是不可能出现逗号的,但是如果是错误数据就有可能出现这样不规则的数据,所以对

[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

原文:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你! 引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在

常见数据导入Excel及Excel数据导入数据库的解决方案

项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下.方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作. 优势

Android随手笔记44之JSON数据解析_Android

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析. 1.JSON数据结构 在JSON中有两种数据结构:对象和数组. 1.1对象 在JSON中,一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"

iOS数据解析UI_14

数据解析:就是按照约定(假象)好的格式提取数据的过程就叫解析:  提供数据方(后台):工作就是把数据按照一定的格式存储起来  提取数据方(前台):工作就是把数据按照一定的格式读取出来  主流的格式:XML格式  /   JSON格式  ,此两种格式无论前台还是后台都必须熟悉    XML以标签的形式存在,标签由开始标签和结束标签,这一对标签就做节点:  没有父节点的节点叫做根节点,没有子节点的节点就做叶子节点,而我们要使用的数据都在叶子节点中存储:  XML解析的两种工作原理:  1.SAX  

excel导入sql sever-求完整的JSP页面上传excel 将数据导入数据库的代码

问题描述 求完整的JSP页面上传excel 将数据导入数据库的代码 找的的代码都会各种报错 上传的jsp页面的action要指向哪个文件? 解决方案 这篇文章主要介绍了JSP上传excel及excel插入至数据库的方法,涉及JSP文件上传及针对excel的读取.写入数据库等操作技巧,需要的朋友可以参考下 本文实例讲述了JSP上传excel及excel插入至数据库的方法.分享给大家供大家参考.具体如下: 此导入excel是与pojo绑定的,(缺点)excle表头必须是pojo的字段值 1. htm

iOS - XML 数据解析

前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Markup Language)是可扩展标记语言的缩写,其中的标记(markup)是关键部分.可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可分类的信息.创建的文件或文档实例由元素(标记)和内容构成.当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档.元素的描述