日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

前言

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

Apache POI是Apache軟件基金會(huì)的開源項(xiàng)目,POI提供API給Java程序?qū)icrosoft Office格式檔案讀和寫的功能。 .NET的開發(fā)人員則可以利用NPOI (POI for .NET) 來(lái)存取 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);}// 過(guò)濾多余的表格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)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品成久久久久| 欧美极品中文字幕| 日本午夜免费一区二区| 欧产日产国产精品视频| 麻豆国产在线| 久久久久久一区二区| 欧美日韩精品一区二区三区视频 | 欧美日韩一二| 久久天堂av| 亚洲h色精品| 亚洲最新av| 精品久久在线| 午夜一级久久| 久久永久免费| 在线视频亚洲| 久久久久亚洲精品中文字幕| 国产一区日韩欧美| 久久只有精品| 免费国产亚洲视频| 精品一区二区三区四区五区| 久久成人国产| 成人羞羞视频播放网站| 日韩超碰人人爽人人做人人添| 亚洲国产欧美日本视频| 国产中文欧美日韩在线| 国产一区二区三区网| 亚洲午夜久久久久久尤物| 日本国产亚洲| 久久久久国产| 日韩精品免费视频人成| 99精品电影| 国产精品久久| 91久久中文| 九九九精品视频| 石原莉奈在线亚洲二区| 黑森林国产精品av| 国产欧美一区二区三区国产幕精品 | 国产一区二区高清| 国产精品一区二区av交换| 欧美一区久久久| 国产精品一区二区av交换| 欧美精品一区二区久久| 欧美a级一区二区| 美日韩精品视频| 激情综合自拍| 97精品一区| 欧美a一区二区| 国产一区 二区| 亚洲精品综合| 免费人成黄页网站在线一区二区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲男女av一区二区| 日本а中文在线天堂| 国产精品亚洲欧美| 国产剧情一区| 国产毛片精品| 欧美日韩夜夜| 青青草91视频| 亚洲精品日本| 久久不射网站| 日韩在线一区二区| 乱人伦精品视频在线观看| 六月婷婷一区| 日韩一区精品字幕| 日韩中文字幕91| 在线观看一区| 欧美亚洲二区| 国产日韩高清一区二区三区在线| 四虎精品一区二区免费| 一区二区亚洲视频| 日本不卡一二三区黄网| 日本亚洲三级在线| 日韩av一区二区三区四区| 亚洲色图网站| 欧美视频精品全部免费观看| 日韩国产91| 久久福利在线| 在线看片福利| 婷婷色综合网| 日韩专区一卡二卡| 欧美欧美黄在线二区| 久热精品在线| 欧美日韩色图| 久久精品国产999大香线蕉| 国产白浆在线免费观看| 欧美另类专区| 91麻豆精品激情在线观看最新| 久久不卡国产精品一区二区| 欧美xxxx性| 999国产精品视频| 日韩一区免费| 综合日韩av| 日韩在线麻豆| av资源中文在线天堂| 国产婷婷精品| 精品国产亚洲日本| 中文字幕av一区二区三区四区| 欧美aⅴ一区二区三区视频| 欧美日韩在线网站| 国产视频一区二| 欧美精品日日操| 国产调教精品| 中文一区在线| 国产精品欧美大片| 久久国产直播| 国产劲爆久久| 亚洲理论在线| 欧美午夜精彩| 国产成人精品一区二区三区免费| 免费在线视频一区| 久久精品高清| 在线看片国产福利你懂的| 欧美一区免费| 蜜桃一区二区三区在线观看| 群体交乱之放荡娇妻一区二区| 国产精品nxnn| 日本欧美韩国一区三区| 蜜臀久久99精品久久久久久9| 精品深夜福利视频| 国产亚洲字幕| 日本欧美一区二区| 亚洲免费毛片| 老鸭窝亚洲一区二区三区| 美女亚洲一区| 91超碰国产精品| 欧美日韩高清| 亚洲欧美久久久| 黄色亚洲大片免费在线观看| 亚洲国产成人精品女人| 国产综合亚洲精品一区二| 色网在线免费观看| 成人国产精品一区二区网站| 欧美a级一区二区| 国产精品调教| 国产欧美一级| 美女久久精品| 日韩黄色大片| 99国产精品免费视频观看| 99久久精品费精品国产| 国产91久久精品一区二区| 国产一区日韩一区| 日韩在线一二三区| 日韩国产在线一| 免费在线亚洲欧美| av在线最新| 日韩午夜精品| 国产日韩欧美一区二区三区在线观看 | 一区免费在线| 亚洲专区一区| 免费在线观看精品| 69堂精品视频在线播放| 麻豆久久一区| 久久精品国产大片免费观看| 亚洲色图综合| 麻豆视频在线观看免费网站黄| 欧美日韩在线网站| 天堂精品久久久久| 福利在线一区| 亚洲精品视频一二三区| 国产一区二区三区亚洲综合| 亚洲精品1区| 亚洲免费毛片| 国产一区二区色噜噜| 亚洲a级精品| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 91精品国产91久久久久久黑人| 日本 国产 欧美色综合| 国产精品一级在线观看| 欧美日韩在线观看视频小说| 日韩欧美中文字幕电影| 久久精品国产www456c0m| 国产精品欧美在线观看| 在线视频精品| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 在线观看精品| 日韩av资源网| 五月精品视频| 欧美天堂视频| 国产欧美一区二区三区国产幕精品 | 丝瓜av网站精品一区二区| 久久久久久自在自线| 国产精品久久| 亚洲欧美日本国产| 亚洲国产日韩欧美在线| 日韩在线观看一区| 国产精品第十页| 日韩专区视频网站| 99精品国产一区二区三区| 免费日韩成人| 欧美中文高清| 日韩手机在线| 亚洲精品自拍| 亚洲乱码一区| 日本一区中文字幕| 男女性色大片免费观看一区二区| 亚洲精品一区二区在线看| 欧美~级网站不卡| 激情视频一区二区三区| 精品一区毛片| 欧美精选一区二区三区|