超级顽固的流方式读取doc,docx乱码问题
因为工作中需要一个把doc或者docx的office文档内容,需要读取出来,并且也没展示功能。代码中第一考虑可能就是通过读取流方式,结果写了以后,各种乱码,百科的解决方案也是千奇百怪,第一点:可能是文档编码格式和项目编码格式不一致,需要重新再读取流时候,重新定义流的编码格式;第二点:可能是框架层面直接调用解析方式,但是框架封装没有声明编码格式;第三点:就是在转成流在重建字符串时候,需要声明编码格式。总之,就是编码格式不一致导致。
当然问题不止这么简单,如果是其他格式的话,可以通过编码格式解决,但是这是office的文档格式,出奇的难受,愣是编码不通过。
所以需要换一个思路进行文档解析,从中获取需要的内容。
最后的确定法方案,通过POI方式,进行office文档解析。
第一步 mavne项目中需要引入的jar包
<!--docx文件下载问题-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
需要注意事项是,高版本的POI包,有些不兼容情况,对于下面这个commons-io包一定要引入,要不然会报错POI中某个类找寻不到问题。
第二步 新建一个doc解析类
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream; /**
* @author admin
* @date 2019/12/4 16:23
*/
public class WordDownload { /**
* @Description: POI 读取 word
* @create: 2019-07-27 9:48
* @update logs
* @throws Exception
*/
public static String readWord(String filePath) throws Exception{ File file = new File(filePath);
if(file.length()==0) return ""; // 需要操作原因是可能会空文件问题,如果不做处理,在下面读取中会报错
StringBuffer sb = new StringBuffer();
String buffer = "";
try {
if (filePath.endsWith(".doc")) {
InputStream is = new FileInputStream(file);
WordExtractor ex = new WordExtractor(is);
buffer = ex.getText();
if(buffer.length() > 0){
//使用回车换行符分割字符串
String [] arry = buffer.split("\\r\\n");
for (String string : arry) {
sb.append(string.trim());
}
}
} else if (filePath.endsWith(".docx")) {
OPCPackage opcPackage = POIXMLDocument.openPackage(filePath);
POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
buffer = extractor.getText();
if(buffer.length() > 0){
//使用换行符分割字符串
String [] arry = buffer.split("\\n");
for (String string : arry) {
sb.append(string.trim());
}
}
} else {
return null;
}
return sb.toString();
} catch (Exception e) {
System.out.print("error---->"+filePath);
e.printStackTrace();
return null;
}
} }
超级顽固的流方式读取doc,docx乱码问题的更多相关文章
- java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载
从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 1,张三,28 2,李四,35 3,张三,28 4,王五,35 5,张三,28 6,李四,35 7,赵六,28 ...
- java读取txt/pdf/xls/xlsx/doc/docx/ppt/pptx
环境准备txt利用common-iopdf利用pdfbox剩下的用POI关于POI,读取xls没啥特别的,主要是读取doc和ppt,需要下载poi源代码,然后将poi-src-3.7-20101029 ...
- Python:读取 .doc、.docx 两种 Word 文件简述及“Word 未能引发事件”错误
概述 Python 中可以读取 word 文件的库有 python-docx 和 pywin32. 下表比较了各自的优缺点. 优点 缺点 python-docx 跨平台 只能处理 .docx 格式 ...
- 用java读取多种文件格式的文件(pdf,pptx,ppt,doc,docx..)
本文通过开源pdfbox和poi进行处理多种文件格式的文本读入 1.需要的jar的maven坐标: <dependency> <groupId>org.apache.pdfbo ...
- java使用poi读取doc和docx文件(maven自动导入依赖包)
java使用poi读取doc和docx文件(maven自动导入依赖包) 于是在网上搜寻了一阵之后才发现原来doc文档和excel一样不能用普通的io流的方法来读取,而是也需要用poi,于是进行了一番尝 ...
- Python-docx 读取word.docx内容
第一次写博客,也不知道要写点儿什么好,所以就把我在学习Python的过程中遇到的问题记录下来,以便之后查看,本人小白,写的不好,如有错误,还请大家批评指正! 中文编码问题总是让人头疼,想要用Pytho ...
- pdf及word文档的读取 pyPDF2,docx
#!python3 #-*- coding:utf8 -*- #PyPDF2可能会打不开某些pdf文档,也不能提取图片,图表或者其他媒介从PDF文件中.但是它能提取文本从PDF中,转化为字符. imp ...
- java读取utf8配置文件乱码
email.properties文件如果以ISO-8859-1编码,那么以下的java代码读取中文不会乱码,因为eclipse下中文都被翻译成/u... //in Conf.javaPropertie ...
- Qt 读取txt文件乱码的解决办法
Qt 读取txt文本乱码问题 2015-05-20 15:46 方法一:使用QString的fromLocal8Bit()函数 复制代码 QFile txtfile(filePath); ...
随机推荐
- 剑指offer自学系列(四)
题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把 ...
- Express - 采用bcryptjs进行密码加密
1.安装bcryptjs模块 npm install bcryptjs --save 2.在需要加密的模块中引入bcryptjs库 require('bcryptjs'); 实战 : /** ...
- GDI+应用2
在上一篇里已经向大家介绍了如何使用GDI+绘制简单的图像,这一片继续向大家介绍其它一些绘图知识.1.首先我们来看下上一片中我们使用过的Pen.Pen的属性主要有: Color(颜色),DashCap( ...
- spring源码 AutowireCapableBeanFactory接口
对于想要拥有自动装配能力,并且想把这种能力暴露给外部引用的BeanFactory类需要实现此接口.正常情况下,不要使用此接口应该更倾向于使用BeanFactory或者ListableBeanFacto ...
- C#如何编写短信接口,以及接口的调用,包括C#.net访问web,并处理返回值的简例。
在系统的开发中我们经常会用到接口,下面给大家介绍一种短信接口的编写与调用. 我们常调用接口来完成一些信息的通知或者发送验证码,那么这些操作是如何完成的呢?来看一下详细的介绍吧! 首先呢,我们需要有一个 ...
- Mysql :分支结构—if函数
一分支结构 1.if函数 功能:实现简单的双分支 语法: IF (表达式1,表达式2,表达式3) 执行顺序 如果表达式1成立 则if函数返回表达式2的值,否则返回表达式3的值 应用: 任何地方
- PageHelper使用
之前我们整合过SSM框架,可以查询数据库数据,项目中一般不会全部查询所有数据,为了美观和性能,都是采用分页形式查询数据 一:pom.xml导入pagehelper.jar <!-- https: ...
- 高次同余方程 $BSGS$
第一篇\(Blog\)... 还是决定把\(luogu\)上的那篇搬过来了. BSGS,又名北上广深 它可以用来求\(a^x \equiv b (mod \ n)\)这个同余方程的一个解,其中\(a, ...
- 分页助手PageHelper学习
PageHelper是mybatis的通用分页插件,通过mybatis的拦截器实现分页功能,拦截sql查询请求,添加分页语句, 最终实现分页查询功能.在 springboot上集成pagehelper ...
- Django回顾之_03_Model属性及后端配置
1. Django ORM O(objects):类和对象. R(Relation):关系,关系数据库中的表格. M(Mapping):映射. Django ORM框架的功能: a) 建立模型类和表之 ...