检查Office(Word/Excel)文档是否需要密码时,可以通过POI是否能正常读取文档的内容的方法,进行判断。
需要密码的是,会发生如下异常:
引入依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.0-jre</version> </dependency>
ReadExcelByPoi.java 读取Excel工具类
package com.kinggrid.surread.utils; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @author bianmaren * @Description: * @mail 441889070@qq.com * @date 2020-12-11 */ @Slf4j public class ReadExcelByPoi { /** * 读取Excel数据内容 * * @return Map 包含单元格数据内容的Map对象 * @author zengwendong */ public static Map<Integer, Map<Integer,Object>> readExcelContent(String filepath) throws Exception{ Workbook wb = null; Sheet sheet; Row row; if(filepath == null){ return null; } String ext = filepath.substring(filepath.lastIndexOf(".")); try { InputStream is = new FileInputStream(filepath); if(".xls".equals(ext)){ wb = new HSSFWorkbook(is); }else if(".xlsx".equals(ext)){ wb = new XSSFWorkbook(is); }else{ wb=null; } } catch (FileNotFoundException e) { log.error("FileNotFoundException", e); } catch (IOException e) { log.error("IOException", e); } if( wb ==null){ throw new Exception("Workbook对象为空!"); } Map<Integer, Map<Integer,Object>> content = new HashMap<Integer, Map<Integer,Object>>(); sheet = wb.getSheetAt(0); // 得到总行数 int rowNum = sheet.getLastRowNum(); row = sheet.getRow(0); int colNum = row.getPhysicalNumberOfCells(); // 正文内容应该从第二行开始,第一行为表头的标题 for (int i = 1; i <= rowNum; i++) { row = sheet.getRow(i); int j = 0; Map<Integer,Object> cellValue = new HashMap<>(); while (j < colNum) { Object obj = getCellFormatValue(row.getCell(j)); cellValue.put(j, obj); j++; } content.put(i, cellValue); } return content; } /** * * 根据Cell类型设置数据 * * @param cell * @return * @author zengwendong */ private static Object getCellFormatValue(Cell cell) { Object cellvalue = ""; if (cell != null) { // 判断当前Cell的Type switch (cell.getCellType()) { // 如果当前Cell的Type为NUMERIC case NUMERIC: case FORMULA: { // 判断当前的cell是否为Date if (DateUtil.isCellDateFormatted(cell)) { // 如果是Date类型则,转化为Data格式 // data格式是带时分秒的:2013-7-10 0:00:00 // cellvalue = cell.getDateCellValue().toLocaleString(); // data格式是不带带时分秒的:2013-7-10 Date date = cell.getDateCellValue(); cellvalue = date; } else {// 如果是纯数字 // 取得当前Cell的数值 cellvalue = String.valueOf(cell.getNumericCellValue()); } break; } // 如果当前Cell的Type为STRING case STRING: // 取得当前的Cell字符串 cellvalue = cell.getRichStringCellValue().getString(); break; default:// 默认的Cell值 } } return cellvalue; } }
ReadWordByPoi.java 读取Word工具类
package com.kinggrid.surread.utils; import com.google.common.base.CharMatcher; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.utils.Lists; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; /** * @author bianmaren * @Description: * @mail 441889070@qq.com * @date 2020-12-11 */ @Slf4j public class ReadWordByPoi { public static <T> List<String> readWordFile(String path) { List<String> contextList = Lists.newArrayList(); InputStream stream = null; try { stream = new FileInputStream(new File(path)); if (path.endsWith(".doc")) { HWPFDocument document = new HWPFDocument(stream); WordExtractor extractor = new WordExtractor(document); String[] contextArray = extractor.getParagraphText(); Arrays.asList(contextArray).forEach(context -> contextList.add(CharMatcher.whitespace().removeFrom(context))); extractor.close(); document.close(); } else if (path.endsWith(".docx")) { XWPFDocument document = new XWPFDocument(stream).getXWPFDocument(); List<XWPFParagraph> paragraphList = document.getParagraphs(); paragraphList.forEach(paragraph -> contextList.add(CharMatcher.whitespace().removeFrom(paragraph.getParagraphText()))); document.close(); } else { log.debug("此文件{}不是word文件", path); } } catch (IOException e) { e.printStackTrace(); } finally { if (null != stream) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); log.debug("读取word文件失败"); } } } return contextList; } }
执行校验校验
try { // 判断是否需要密码 String path = "文档路径"; if(path.endsWith(".doc") || path.endsWith(".docx")){ List<String> readRes = ReadWordByPoi.readWordFile(path); log.info("readRes:{}",readRes); } if(path.endsWith(".xls") || path.endsWith(".xlsx")){ Map<Integer, Map<Integer,Object>> readRes = ReadExcelByPoi.readExcelContent(path); log.info("readRes:{}",readRes); } }catch (Exception e){ log.error("读取OFFICE异常",e); if(e instanceof EncryptedDocumentException){ //TODO 文档需要密码 } //TODO 文档读取异常 }
- 热门文章
- Mysql 8.0+开启远程访问
- Vue3+Ts 组合API调用子组件方法
- JAVA生成微信小程序分享海报
- 基于 Vue 实现魔方矩阵排列效果
- JAVA开发微信特约商户进件/提交申请单
- 检查Office(Word/Excel)文档是否需要密码-通...
- Nginx 跨域配置支持
- 微信/v3/merchant/media/upload 网络图片上...
- 简述分布式CAP理论
- Iterator迭代器设计模式
- 我的标签
- JAVA<7>
- Js<4>
- 设计模式<4>
- TS<2>
- nginx<2>
- 微信服务商<2>
- 微信小程序<1>
- Vue<1>
- Vue3<1>
- IPv6<1>
- Apache POI<1>
- Mysql<1>
- rocketmq<1>
- 分布式数据库<1>
- polygon<1>
- 地图<1>
- CAP<1>
- jQuery<1>
- Git<1>
- curl<1>
- 分布式系统<1>
- 设计<0>
- Redis<0>
- HikariCP<0>
- 数据库连接池<0>
- 多线程<0>
- 友情链接
- 江西云戈信息技术