-
java使用poi读取doc和docx文件
2016-07-22 10:53:02这几天在学习java io流的东西,有一个网友看到博客后问了一个问题,就是说他的doc文档为什么用我所说的方法死活就是乱码。 我一开始以为是他方法问题,结果自己试了之后发现和他的结果一样也是乱码。 于是...这几天在学习java io流的东西,有一个网友看到博客后问了一个问题,就是说他的doc文档为什么用我所说的方法死活就是乱码。
我一开始以为是他方法问题,结果自己试了之后发现和他的结果一样也是乱码。
于是在网上搜寻了一阵之后才发现原来doc文档和excel一样不能用普通的io流的方法来读取,而是也需要用poi,于是进行了一番尝试后,终于以正确的编码格式读取了这个doc文件。
在网上搜索的过程中发现doc和docx的读取方法是不一样的,于是顺带也学了一下docx文件的简单读取。
一、导包:
doc文件的读取,需要导入poi-scratchpad的jar包和相关依赖包:docx文件读取,需要导入poi-ooxml的jar包和相关依赖包:
我用的是maven构建项目,相关的依赖包会自动导入,maven导包配置如下:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.8</version> </dependency>
二、读取文件的代码:
1、doc文件读取简单示例:public static void readAndWriterTest3() throws IOException { File file = new File("C:\\Users\\tuzongxun123\\Desktop\\aa.doc"); String str = ""; try { FileInputStream fis = new FileInputStream(file); HWPFDocument doc = new HWPFDocument(fis); String doc1 = doc.getDocumentText(); System.out.println(doc1); StringBuilder doc2 = doc.getText(); System.out.println(doc2); Range rang = doc.getRange(); String doc3 = rang.text(); System.out.println(doc3); fis.close(); } catch (Exception e) { e.printStackTrace(); } }
2、docx文件读取简单示例:
public static void readAndWriterTest4() throws IOException { File file = new File("C:\\Users\\tuzongxun123\\Desktop\\aa.docx"); String str = ""; try { FileInputStream fis = new FileInputStream(file); XWPFDocument xdoc = new XWPFDocument(fis); XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc); String doc1 = extractor.getText(); System.out.println(doc1); fis.close(); } catch (Exception e) { e.printStackTrace(); } }
//20171218修改
我并没有在工作中操作过word,这篇博客也只是一时兴起所做,因此写的很简单。
而最近陆续有朋友找我询问相关的问题,其中有好几个都在询问依赖包有哪些,为了避免一再回答这种问题,特将依赖包截图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyC68tDX-1602637866657)(https://blog.tzxcode.cn/images/copyright.png)] -
Swift中文教程DOC版
2014-06-04 17:51:49Apple Swift编程语言入门教程 中文版本文档。主要通过实例讲解基础的语法 -
DocValues
2019-05-19 11:11:57DocValues 在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来的好处主要有两个:(1)节省内存(2...DocValues
在Lucene4.x之后,出现一个重大的特性,就是索引支持DocValues,这对于广大的solr和elasticsearch用户,无疑来说是一个福音,这玩意的出现通过牺牲一定的磁盘空间带来的好处主要有两个:
(1)节省内存
(2)对排序,分组和一些聚合操作时能够大大提升性能(一)什么是DocValues?
什么是DocValues?
DocValues其实是Lucene在构建索引时,会额外建立一个有序的基于document => field value的映射列表;
(二)为什么要用DocValues?
基于lucene的solr和es都是使用经典的倒排索引模式来达到快速检索的目的,简单的说就是建立 搜索词=》 文档id列表 这样的关系映射,
然后在搜索时,通过类似hash算法,来快速定位到一个搜索关键词,然后读取其的文档id集合,这就是倒排索引的核心思想,这样搜索数据是非常高效快速的,当然它也是有缺陷的,假如我们需要对数据做一些聚合操作,比如排序,分组时,lucene内部会遍历提取所有出现在文档集合的排序字段然后再次构建一个最终的排好序的文档集合list,这个步骤的过程全部维持在内存中操作,而且如果排序数据量巨大的话,非常容易就造成solr内存溢出和性能缓慢。基于这个原因,在lucene4.x之后出现了docvalue这个新特性,在构建索引时会对开启docvalues的字段,额外构建一个已经排 好序的文档到字段级别的一个列式存储映射,它减轻了在排序和分组时,对内存的依赖,而且大大提升了这个过程的性能,当然它也会耗费的一定的磁盘空间。
什么时候应该用DocValues?
通过上面的剖析,散仙相信大家已经对DocValues有一个初步的了解了,至于它的应用场景,那么也非常明显了,总结起来主要以下几个方面:
1,需要聚合的字段,包括sort,agg,group,facet等
2,需要提供函数查询的字段
3,需要高亮的字段,这个确实能加速,但是散仙并不建议把高亮放在服务端程序做,建议放在前端实现,不容易出错而且总体性能比服务端高
4,需要参与自定义评分的字段,这个稍复杂,大多数人的场景中,不一定能用到,后面会单独写一篇文章介绍。
对于不需要参与上面任何一项的字段,可以选择关闭docvalues,这样可以节省一定的磁盘空间.- DocValues的种类
在lucene的枚举类DocValuesType 中,我们可以看见它声明了六个常量:
1, NONE 不开启docvalue时的状态
2, NUMERIC 单个数值类型的docvalue主要包括(int,long,float,double)
3, BINARY 二进制类型值对应不同的codes最大值可能超过32766字节,
4, SORTED 有序增量字节存储,仅仅存储不同部分的值和偏移量指针,值必须小于等于32766字节
5, SORTED_NUMERIC 存储数值类型的有序数组列表
6, SORTED_SET 可以存储多值域的docvalue值,但返回时,仅仅只能返回多值域的第一个docvalue
通常有四种docvalue存储场景:
A: 字符串或UUID字段+单值 会选择SORTED作为docvalue存储
B: 字符串或UUID字段+多值 会选择SORTED_SET作为docvalue存储
C:数值或日期或枚举字段+单值 会选择NUMERIC 作为docvalue存储
D:数值或日期或枚举字段+多值 会选择SORTED_SET作为docvalue存储
注意,分词字段存储docvalue是没有意义的
(五)如何在Lucene,Solr,ElasticSearch中使用DocValues?
说完了概念方面的东西,下面来点实例的例子,来看下如何给索引加上docsvalue,只要加上docvalues后,排序,分组,聚合的时候
会自动使用docvalue提速,所以我们关注的重点是如何激活docvalue。
1,在原生Lucene中使用DocValues,这个稍麻烦,需要自定义组装,因为lucene是核心算法包,所以封装程度并不是很高,正是
由于这样,理解了lucene之后,再理解solr和elasticsearch是非常easy的。
下面是在lucene中存储docvalue例子,一个是string类型,一个是数值类型,分词类型在这里没有意义,不再提及:Java代码
- //数值存储例子
- FieldType num=new FieldType();
- num.setStored(true);//设置存储
- num.setIndexOptions(IndexOptions.DOCS);//设置索引类型
- num.setNumericType(NumericType.DOUBLE);//数值类型
- num.setDocValuesType(DocValuesType.NUMERIC);//DocValue类型
- Document doc=new Document();
- //添加string字段
- doc.add(new SortedDocValuesField("id",new BytesRef("01011")));
- //添加数值类型的字段 Float,Doule需要额外转成bit位才能存储,Interger和Long则不需要
- doc.add(new DoubleField("price", Double.doubleToRawLongBits(25.258), num));
如何读取:Java代码
- //读取索引文件
- DirectoryReader reader=DirectoryReader.open(FSDirectory.open(Paths.get(indexDir)));
- //如果有多个段需要merge成一个,获取第一个进行测试,本例中仅仅就有一个段
- SortedDocValues str = DocValues.getSorted(reader.leaves().get(0).reader(), "id");
- //数值类型
- NumericDocValues db = DocValues.getNumeric(reader.leaves().get(0).reader(), "price");
- //读取字符串类型的ByteRef然后打印其内容
- System.out.println("id:"+str.get(0).utf8ToString());
- //注意此处,要与类型对应,如果是Float,则需要Float.intBitsToFloat((int)db.get(0))进行位数还原
- System.out.println("price: "+Double.longBitsToDouble(db.get(0)));
- reader.close();
2,在Solr中docvalue默认是全部关闭,比较严谨,大家可酌情开启Java代码
- <fieldname="easy_money"type="double"indexed="true"stored="true"docValues="true" />
3,在ElasticSearch中,默认docvalue全部激活,比较简单暴力,大家可酌情关闭一些不需要使用docvalue的字段,以节省磁盘空间Java代码
- "session_id":{"type":"string","index":"not_analyzed","doc_values":false}
- DocValues的种类
-
spire.doc.free2.7.3添加页眉页脚
2020-08-20 10:48:31import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; public class InsertHeaderAndFooter { public static void main...生成的时候很方便,但是这个页脚字体不知道怎么更改,只能加一些空格来防止字体挤在一起
import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; public class InsertHeaderAndFooter { public static void main(String[] args) { //加载Word文档 Document document = new Document(); document.loadFromFile("C:\\Users\\Administrator\\Desktop\\sample.docx"); //获取第一个section Section section = document.getSections().get(0); //调用insertHeaderAndFooter方法插入页眉页脚到第一个section insertHeaderAndFooter(section); //保存文档 document.saveToFile("output/HeaderAndFooter.docx", FileFormat.Docx); } private static void insertHeaderAndFooter(Section section) { //分别获取section的页眉页脚 HeaderFooter header = section.getHeadersFooters().getHeader(); HeaderFooter footer = section.getHeadersFooters().getFooter(); //添加段落到页眉 Paragraph headerParagraph = header.addParagraph(); //插入图片到页眉的段落 DocPicture headerPicture = headerParagraph.appendPicture("C:\\Users\\Administrator\\Desktop\\Logo.png"); headerPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); headerPicture.setVerticalOrigin(VerticalOrigin.Top_Margin_Area); headerPicture.setVerticalAlignment(ShapeVerticalAlignment.Bottom); //添加文字到页眉的段落 TextRange text = headerParagraph.appendText("Demo of Spire.Doc"); text.getCharacterFormat().setFontName("Arial"); text.getCharacterFormat().setFontSize(10); text.getCharacterFormat().setItalic(true); headerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); //设置文字环绕方式 headerPicture.setTextWrappingStyle(TextWrappingStyle.Behind); //设置页眉段落的底部边线样式 headerParagraph.getFormat().getBorders().getBottom().setBorderType(BorderStyle.Single); headerParagraph.getFormat().getBorders().getBottom().setLineWidth(1f); //添加段落到页脚 Paragraph footerParagraph = footer.addParagraph(); //添加Field_Page和Field_Num_Pages域到页脚段落,用于显示当前页码和总页数 footerParagraph.appendField("page number", FieldType.Field_Page); footerParagraph.appendText(" of "); footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); //设置页脚段落的顶部边线样式 footerParagraph.getFormat().getBorders().getTop().setBorderType(BorderStyle.Single); footerParagraph.getFormat().getBorders().getTop().setLineWidth(1f); } }
-
spire.doc.free2.7.3生成目录后修改目录的字体
2020-08-13 09:22:22在看spire.doc.free官网API文档时,没有找到修改目录字体的方法 只有生成目录的方法,但是生成的是西文字体,我专门去问了他们官网留下的技术人员的QQ,询问到了修改目录字体的使用代码 就是再次加载生成了目录后的文档,...在看spire.doc.free官网API文档时,没有找到修改目录字体的方法
只有生成目录的方法,但是生成的是西文字体,我专门去问了他们官网留下的技术人员的QQ,询问到了修改目录字体的使用代码
就是再次加载生成了目录后的文档,遍历section/body中的元素,进行目录字体的修改,然后再生成一个word文档,功能非常好用,非常感谢技术人员的知道,但是不知道为什么他们不在官网API文档放这个方法,我找了一上午都没找见
com.spire.doc.Document doc1 = new com.spire.doc.Document(pathDoc); doc1.loadFromFile(pathDoc); // //循环遍历section/body 中的元素 for (int s = 0; s < doc1.getSections().getCount(); s++) { Section section = doc1.getSections().get(s); for (int i = 0; i < section.getBody().getChildObjects().getCount(); i++) { DocumentObject obj = section.getBody().getChildObjects().get((i)); FieldCollection field = doc1.getFields(); for (int m = 0; m < field.getCount(); m++) { Field fd = field.get(m); //判断是否含有域 if (obj.getChildObjects().contains(fd)) { Paragraph para = (Paragraph) obj; for (int j = 0; j < para.getChildObjects().getCount(); j++) { DocumentObject cObj = para.getChildObjects().get(j); if (cObj instanceof TextRange) { TextRange tr1 = (TextRange) cObj; //修改textrange 的字体 tr1.getCharacterFormat().setFontName("宋体"); } } } } } } doc1.saveToFile(pathDoc, FileFormat.Docx_2010);
-
ansible-doc
2019-04-17 10:10:52查看模块说明 # ansible-doc module-name ansible-doc file ansible-doc copy ansible-doc get_url ansible-doc yum ansible-doc yum_repository ansible-doc cron -
erlang doc
2013-05-18 19:18:521.http://www.erlang.org/doc/apps/erts/erl_dist_protocol.html Distribution Protocol 2.http://www.erlang.org/doc/man/erl.html erl命令详解 3.... -
spire.doc.free2.7.3生成word目录
2020-08-11 11:47:16在poi3.13生成word文档的主体后,写入本地文件后,写上spire.doc.free2.7.3的生成目录的代码,通过读取已生成的word,加上目录后,然后再生成新的word,也可以直接覆盖生成 //创建文档对象 XWPFDocument document ... -
Spire.doc花式生成doc文件
2019-09-23 17:01:22Spire.doc花式生成word文件 前段时间研究了一个月的java生成word的方法,中间试了itext2、5、7 模板freemaker poi等等第三方的工具,但是终究没有一个能达到我期望的目标的,尤其是itext,占用了我一大半时间搞,... -
PHPDoc 规范
2019-04-22 10:12:41转载自 PHP 注释的艺术 —— phpDoc 规范 PHPDOC PHPDoc 是一个 PHP 版的 Javadoc。它是一种注释 PHP 代码的正式标准。它支持通过类似 phpDocumentor 这样的外部文档生成器生成 API 文档,也可以帮助一些例如 Zend... -
python下怎么读取doc 或者把doc转换成docx
2019-08-02 23:31:00doc = word.Documents.Open(u'E:\\3\\减肥日记-副本.doc') # 目标路径下的文件 doc.SaveAs(u'E:\\code\\hhhhhhhh.docx', 16, False, "", True, "", False, False, False, False) # 转化后路径下的文件 doc.... -
RenderDoc Integration RenderDoc 集成 性能系列7
2019-03-04 17:06:14RenderDoc Integration RenderDoc 集成 本文档主要是对Unity官方手册的个人理解与总结(其实以翻译记录为主:&gt;) 仅作为个人学习使用,不得作为商业用途,欢迎转载,并请注明出处。 文章中涉及到的操作都... -
Renderdoc调试总结
2020-06-20 09:02:10Renderdoc调试总结 https://www.jianshu.com/p/7587dc0a42f4 renderdoc调试总结 http://aicdg.com/renderdoc-hlsl/ λ 1 /renderdoc-hlsl/ ⌘ blogspace λ * Menu utf-8 web .html 1 home 2 my ... -
Doc2Vec
2017-11-26 14:04:30应用的话,这个tutorial非常实用,直接可以用Python跑, 跑完后心里会明白不少:Sentiment Analysis Using Doc2Vec (Doc2Vec,可用用来做情感分析任务) Doc2Vec优点:1. Context层面保留词... -
Lucene DocValues详解
2017-03-07 00:10:39DocValues,人称正向索引,也是大家所认识的面向列存储。即通过文档编号与字段值在索引建立直接映射的关系,并存储。对DocValues我想你并不陌生,但我相信你对它并不算熟悉。接下来,我们将具体来看看它的存储结构、... -
Doc2Vec模型的介绍与gensim中Doc2Vec的使用
2019-09-28 09:00:41文章目录一、Doc2Vec模型1 、PV-DM2 、PV-DBOW二、gensim实现1、gensim实现Doc2Vec(IMDB数据集)2、gensim实现Doc2Vec(中文数据集)三、总结四、程序编写时遇到的错误:gensim包中相关函数说明: 一、Doc2Vec模型... -
renderdoc相关
2020-02-01 15:34:01在移动端上使用很方便,比snapdragon ...RenderDoc 安装使用 首先安装,设置下对应安卓sdk,java sdk,在tools-setting-android中 然后开启手机的允许USB调试的开关,不同手机可能会有些不太一样,我用的一加... -
go doc 命令介绍
2019-02-19 21:46:10一:go doc 命令介绍 作用:打印出程序实体说明文档。后可不跟参数或一个参数或两个参数 格式:go doc 标记 参数 标记和参数可以不填, go doc 在 main 包下,执行 go doc 默认是不打印的,除非加上 -cmd 标记,... -
Doc2Vec实践
2018-05-30 11:35:46最近由于要开发一款项目,就想用doc2vec来实现其中的推荐功能,根据用户输入的问题利用doc2vec返回相似的问题。 以下是整个Demo的实现过程,具体的详细代码请参考我的Git:... -
Lucene8.0新特征 DocValues改进
2018-12-25 13:28:33Lucene8.0新特征预告,继续优化DocValues,提升DocValues随机访问的性能。进一步讨论IndexedDISI的实现细节,以及如何服务DocValues。 -
install logicalDoc
2015-11-11 20:17:44数据库配置 create database logical...GRANT ALL PRIVILEGES ON logicaldoc.* TO logicaldoc@'%' identified by 'fieFN539'; flush privileges; exit; OpenOffice wget http://sourceforge.net/projects/open -
使用RenderDoc记录
2018-07-11 23:44:39https://unitycoder.com/blog/2016/07/23/using-renderdoc-with-unity/“RenderDoc is a stand-alone graphics debuggingtool”GettingStarted– Download standalone https://renderdoc.org/builds– Install it–... -
Elasticsearch学习-Doc与Segment原理
2018-09-29 18:16:59Elasticsearch学习-Doc与Segment原理 0x00 系列文章目录 Elasticsearch学习-关于倒排索引、DocValues、FieldData和全局序号 Elasticsearch学习-搜索调优 Elasticsearch学习-Doc原理 0x01 摘要 本文主要讲... -
renderdoc on android
2019-09-28 22:33:31一个发了renderdoc with unity是在pc平台跑的 没有挂android 这货有点坑啊 花了好几个小时 wiki上的issue基本全看了。。。感觉是版本提交的logs https://github.com/baldurk/renderdoc/wiki/Android-Support ... -
doc 和docx的区别
2019-05-31 14:13:32新建文档的时候右键发现有两个选项:新建doc文档,新建docx文档,突然感到很好奇,这两种文档的区别我好想一直不知道,于是上网查了一下,总结如下: doc是word2007之前的版本,2007以后的改为了docx; docx相比doc... -
Doc2Vector
2018-01-23 11:28:271 算法思想在word2vector中我们...作为一个处理可变长度文本的总结性方法,Quoc Le 和 Tomas Mikolov 提出了 Doc2Vec方法。除了增加一个段落向量以外,这个方法几乎等同于 Word2Vec。和 Word2Vec 一样,该模型也存在 -
基于POI处理word-doc模板文件,并完美实现换行
2019-06-16 12:20:45此核心代码只适用doc文件,代码如下 调用 public static void main(String[] arg)throws Exception { // 模板路径(一定是doc文件) String templatePath = "c:\\Users\\xxx\\Desktop\\template.doc"; // 文件输出... -
go doc的使用
2019-06-04 15:03:13go doc XX 生成文档 godoc -http :6060 输入localhost:6060 即可查看生成的文档 -
Android 读取doc文件
2016-12-07 23:36:37Android 读取doc文件 -
java生成doc文件
2017-10-09 16:11:52java使用freemaker生成doc文件
-
[Android] Android Studio入门 - 1.初识IDE
-
跟我练内测小分队学习礼包
-
CRMEB小程序V4+H5版+PC版打通的电脑端模板源码原版下载.zip
-
R语言快速实现并行处理与共享内存
-
(新)备战2021软考网络工程师培训学习套餐
-
101. 进程间通信 - 消息队列 读/写
-
Android-UI-03-图形绘制-Canvas-drawable案列
-
Edward M. Purcell - Electricity and Magnetism libgen.lc.djvu
-
国际专利分类IPC介绍.ppt
-
【数据分析-随到随学】Hive详解
-
【数据分析-随到随学】Python语法强化与数据处理
-
bootstrap-4.0.0.zip
-
Java 9 逆天的十大新特性
-
ARARSHL.dll
-
3DsMax光线刀光插件:Ghost Trails v3.6.4.0 Max 2018 x64.rar
-
Firefox 47.0.1 渗透便携版.zip
-
结构力学建模(COMSOL)
-
100条经典C语言笔试题目.ppt
-
Kmeans_demo.zip
-
一尺之棰