国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java如何利用poi解析doc和docx中的數(shù)據(jù)

瀏覽:2日期:2022-08-14 16:37:35

前言

這個(gè)功能是工作中遇到的一個(gè)需求,需要把上傳的word中的內(nèi)容解析出來,其中包含段落字符串解析,和表格中的數(shù)據(jù)解析出來,需要支持doc和docx格式的數(shù)據(jù)

Apache POI是Apache軟件基金會(huì)的開源項(xiàng)目,POI提供API給Java程序?qū)icrosoft Office格式檔案讀和寫的功能。 .NET的開發(fā)人員則可以利用NPOI (POI for .NET) 來存取 Microsoft Office文檔的功能。

方法如下:

1、增加maven中的包

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency><!--POI包 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency>

2、解析doc中的數(shù)據(jù)

獲取文件,把MultipartFile對(duì)象的數(shù)據(jù)轉(zhuǎn)成本地file

File file = new File(FileUtils.getUserDirectoryPath() + '/' + multipartFile.getOriginalFilename());FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);

String fileName = file.getName().toLowerCase();FileInputStream in = new FileInputStream(file);if (fileName.endsWith('.doc')) { // 處理doc格式 即office2003版本 handlerDoc(in);}if (fileName.endsWith('.docx')) { handlerDocx(in);}

解析doc格式中的段落和第一個(gè)表格數(shù)據(jù)

/** * doc 格式解析 * * @param in * @throws IOException */ private void handlerDoc(FileInputStream in) throws IOException {POIFSFileSystem pfs = new POIFSFileSystem(in);HWPFDocument hwpf = new HWPFDocument(pfs);//得到文檔的讀取范圍Range range = hwpf.getRange();for (int i = 0; i < range.numParagraphs(); i++) { //段落 Paragraph p = range.getParagraph(i); //段落文本 String paragraphText = p.text().replace('r', ''); log.info('paragraphText = {}', paragraphText ); if (paragraphText.contains(VALUE_YLYC)) {analyze = false; }}TableIterator it = new TableIterator(range);// 迭代文檔中的表格// 如果有多個(gè)表格只讀取需要的一個(gè) set是設(shè)置需要讀取的第幾個(gè)表格,total是文件中表格的總數(shù)int set = 1, total = 1;int num = set;for (int i = 0; i < set - 1; i++) { it.hasNext(); it.next();}while (it.hasNext()) { Map<String, List<String>> tabelText = DocUtils.getTabelDocText((Table) it.next()); log.info('tabelText = {}', tabelText);}// 過濾多余的表格while (num < total) { it.hasNext(); it.next(); num += 1;} }

3、解析docx中數(shù)據(jù)

解析docx格式中的段落和第一個(gè)表格數(shù)據(jù)

/** * docx 格式解析 * * @param in * @throws IOException */ private void handlerDocx(FileInputStream in) throws IOException {XWPFDocument xwpf = new XWPFDocument(in);// 獲取word中的所有段落與表格List<IBodyElement> elements = xwpf.getBodyElements();// 解析表格后續(xù)不解析for (IBodyElement element : elements) { // 段落 if (element instanceof XWPFParagraph) {String paragraphText = DocUtils.getParagraphText((XWPFParagraph) element);log.info('paragraphText = {}', paragraphText); } else if (element instanceof XWPFTable) {// 表格 Map<String, List<String>> tabelText = DocUtils.getTabelText((XWPFTable) element);log.info('tabelText = {}', tabelText); } else {log.info('其他內(nèi)容'); }} }

工具類

package com.hundsun.fais.innerreport.utils;import org.apache.poi.hwpf.usermodel.Paragraph;import org.apache.poi.hwpf.usermodel.Table;import org.apache.poi.hwpf.usermodel.TableCell;import org.apache.poi.hwpf.usermodel.TableRow;import org.apache.poi.xwpf.usermodel.*;import java.util.*;/** * @author lvbaolin * @date 2021/4/2 10:39 */public class DocUtils { /** * docx 格式獲取表格內(nèi)容 * * @param table */ public static Map<String, List<String>> getTabelText(XWPFTable table) {Map<String, List<String>> result = new LinkedHashMap<>();List<XWPFTableRow> rows = table.getRows();for (XWPFTableRow row : rows) { String key = null; List<String> list = new ArrayList<>(16); int i = 0; List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) {// 簡(jiǎn)單獲取內(nèi)容(簡(jiǎn)單方式是不能獲取字體對(duì)齊方式的)StringBuffer sb = new StringBuffer();// 一個(gè)單元格可以理解為一個(gè)word文檔,單元格里也可以加段落與表格List<XWPFParagraph> paragraphs = cell.getParagraphs();for (XWPFParagraph paragraph : paragraphs) { sb.append(DocUtils.getParagraphText(paragraph));}if (i == 0) { key = sb.toString();} else { String value = sb.toString(); list.add(value == null || Objects.deepEquals(value, '') ? null : value.replace(',', ''));}i++; } result.put(key, list);}return result; } /** * docx 獲取段落字符串 * 獲取段落內(nèi)容 * * @param paragraph */ public static String getParagraphText(XWPFParagraph paragraph) {StringBuffer runText = new StringBuffer();// 獲取段落中所有內(nèi)容List<XWPFRun> runs = paragraph.getRuns();if (runs.size() == 0) { return runText.toString();}for (XWPFRun run : runs) { runText.append(run.text());}return runText.toString(); } /** * doc 格式的字段解析表格 * @param tb * @return */ public static Map<String, List<String>> getTabelDocText(Table tb) {Map<String, List<String>> result = new HashMap<>(16);//迭代行,默認(rèn)從0開始,可以依據(jù)需要設(shè)置i的值,改變起始行數(shù),也可設(shè)置讀取到那行,只需修改循環(huán)的判斷條件即可for (int i = 0; i < tb.numRows(); i++) { List<String> list = new ArrayList<>(16); int x = 0; TableRow tr = tb.getRow(i); String key = null; //迭代列,默認(rèn)從0開始 for (int j = 0; j < tr.numCells(); j++) {//取得單元格TableCell td = tr.getCell(j);StringBuffer sb = new StringBuffer();//取得單元格的內(nèi)容for (int k = 0; k < td.numParagraphs(); k++) { Paragraph paragraph = td.getParagraph(k); String s = paragraph.text(); //去除后面的特殊符號(hào) if (null != s && !''.equals(s)) {s = s.substring(0, s.length() - 1); } sb.append(s);}if (x == 0) { key = sb.toString();} else { String value = sb.toString(); list.add(value == null || Objects.deepEquals(value, '') ? null : value.replace(',', ''));}x++; } result.put(key, list);}return result; }}

總結(jié)

到此這篇關(guān)于java如何利用poi解析doc和docx中數(shù)據(jù)的文章就介紹到這了,更多相關(guān)java poi解析doc數(shù)據(jù)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 亚洲精品欧美精品 | 三级韩国一区久久二区综合 | 午夜精品久久久久久99热7777 | 欧美69视频| 精品国产日韩亚洲一区在线 | 免费观看性欧美一级 | 日本香蕉一区二区三区 | 成年人免费视频观看 | 久久精品国产一区二区三区不卡 | 99视频在线播放 | 久操精品视频 | 亚洲成年男人的天堂网 | 91精品一区二区三区在线观看 | 一级视频在线 | 狼伊千合综网中文 | 性做久久久久久 | 最新毛片久热97免费精品视频 | 1024色淫免费视频 | 久久精品在线观看 | 国产一区二区免费播放 | 日本成a人伦片 | 久草久在线 | 久久99精品久久久久久 | 男人的天堂黄色 | 欧美日产国产亚洲综合图区一 | 久久极品视频 | 深夜做爰性大片很黄很色视频 | 97久久精品国产精品青草 | japanese色系国产在线高清 | 中文字幕在线视频观看 | 成年人网站免费在线观看 | 国产精品久久久久久久久久久不卡 | 亚洲天堂免费观看 | 华人色 | 91丨九色丨首页在线观看 | 色播亚洲精品网站 亚洲第一 | 男女免费观看在线爽爽爽视频 | 亚洲视频在线免费看 | 久久最新免费视频 | www.av视频在线观看 | 欧美一级毛片在线 |