1. 程式人生 > 其它 >將word中的標題和正文按照大綱等級匯入到excel中

將word中的標題和正文按照大綱等級匯入到excel中

遇到一個小需求,公司寫好了N個系統的設計方案(資料量比較大,不太適合收到複製貼上這樣搞),懂的都懂啊,N個系統的設計方案寫在一個word文件中,現在要求將word文件將這N個系統設計方案中的標題以及描述提取出來,放到Excel中,方便進行分配任務。

如下圖:

變成如下圖

這樣的話,就能更好地給開發人員分配任務。最終轉換完成後是三千多行。程式碼如下:需要注意的是,標紅的要根據自己的需求進行修改,主要包括word的路徑以及excel的路徑等,前提是建立一個excel表格用來接收資料。

使用以下程式碼的前提:一個word文件用來讀取,一個excel文件用來輸出!!!

package org.com.poi;

import org.apache.commons.codec.binary.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.
*; import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Author * @Description 將word的內容進行格式化處理輸出到Excel中 加強優化版 * @Date 2021-10-08 22:30 **/ public class PoiTest002 { private static Map<String,Map<String,Object>> orderMap =new HashMap<String, Map<String,Object>>();
private static final String EXCEL_XLS = "xls"; private static final String EXCEL_XLSX = "xlsx"; public static void main(String[] args) {
     //以下標紅的根據自己本地環境進行設定 String wordPath
= "E:\\DawaFiles\\a.docx"; String excelPath = "E:\\DawaFiles\\a.xls"; String startStr = "專案管理系統"; String endStr = "應用支撐系統設計"
; getWordOutExcel(wordPath,excelPath,startStr,endStr); } /** * @Author * @Description 獲取word內容進行格式化並輸出到Excel * @Date 2021-10-08 22:28 **/ public static void getWordOutExcel(String wordPath,String excelPath,String startStr,String endStr){ InputStream is = null; XWPFDocument doc=null; OutputStream out=null; try { is = new FileInputStream(wordPath); doc = new XWPFDocument(is); List<XWPFParagraph> paras=doc.getParagraphs(); //獲取段落 String projectName = ""; String finalXlsxPath = excelPath; //寫出到excel File finalXlsxFile = new File(finalXlsxPath); Workbook workBook = getWorkbok(finalXlsxFile); Sheet sheet = workBook.getSheetAt(0); //sheet 對應一個工作頁 Row rowStart = sheet.createRow(0); //設定標題 setExcelTitile(rowStart); //設定excel標題 int num = 0; boolean start = false; //開啟標識 for (XWPFParagraph para : paras){ String titleLvl = getTitleLvl(doc,para);//獲取段落級別 String text = para.getParagraphText(); if (StringUtils.equals(startStr,text)){ //當讀取內容為開始字串時 將開啟標識設定為true 開始將資料寫出excel start = true; } if (StringUtils.equals(endStr,text)){ //當讀取內容為結束字串時 停止將資料寫出excel,並跳出迴圈 break; } if (!start){ //判斷開啟標識是否為true 不為true不再繼續執行 直接進行下一次迴圈 continue; } num ++; Row row = sheet.createRow(num); //建立新的一行 if (isTest(titleLvl)){ //當大綱等級為正文時 將描述內容放到上一行的第7列中 num -= 1; //將已經加1的num變數減1 從而達到將描述內容放到上一行中 row = sheet.getRow(num); } setTitleAndText(titleLvl,projectName,text,row); //列印輸出 這裡注意了啊 從這行列印就能看出來你想要提取內容的大綱等級 !!!! System.out.println(titleLvl+"===="+text); //按照等級和內容進行輸出列印,可以通過這個列印輸出調整正文以及標題等級的判斷 } //建立檔案輸出流,準備輸出電子表格:這個必須有,否則你在sheet上做的任何操作都不會有效 out = new FileOutputStream(finalXlsxPath); workBook.write(out); out.close(); } catch (Exception e) { e.printStackTrace(); } finally{ try { if(null!=out){ out.close(); } if(null!=is){ is.close(); } }catch (IOException e) { e.printStackTrace(); } } } /** * @Author * @Description 設定標題和內容 * @Date 2021-10-09 10:44 **/ public static void setTitleAndText(String titleLvl,String projectName,String text,Row row){ if ("2".equals(titleLvl)){ //如果等級為2 將專案名稱儲存下來 這一塊需要注意 檢查你想要的最高大綱等級是幾,我這需要獲取的最高大綱等級為2 projectName = text; Cell ling = row.createCell(0); //按照大綱等級,依次將資料對應該列進行填充 ling.setCellValue(projectName); }else if("3".equals(titleLvl)){ Cell first = row.createCell(1); //按照大綱等級,依次將資料對應該列進行填充 first.setCellValue(text); }else if ("4".equals(titleLvl)){ Cell first = row.createCell(2); //按照大綱等級,依次將資料對應該列進行填充 first.setCellValue(text); }else if ("5".equals(titleLvl)){ Cell first = row.createCell(3); first.setCellValue(text); }else if ("6".equals(titleLvl)){ Cell first = row.createCell(4); first.setCellValue(text); }else if ("7".equals(titleLvl)){ Cell first = row.createCell(5); first.setCellValue(text); }else if ("8".equals(titleLvl)){ Cell first = row.createCell(6); first.setCellValue(text); }else if (isTest(titleLvl)){ //判斷是否為正文 Cell cell = row.getCell(7); //進行判斷,獲取當前行當前列是否已經有值 if (cell != null && cell.getStringCellValue() != null){ //如果當前列已存在,並且也存在值 String stringCellValue = cell.getStringCellValue(); //獲取已經存在的值 stringCellValue += text; //將新值進行追加 cell.setCellValue(stringCellValue); //進行賦值 }else{ //如果當前行當前列不存在 Cell first = row.createCell(7); //新建該列 first.setCellValue(text); //進行賦值 } } } /** * @Author * @Description 設定Excel標題 * @Date 2021-10-09 10:39 **/ public static void setExcelTitile(Row row){ //選單級別儘量設定多一點 防止文件中級別過高 String [] titleStr = {"專案名稱","模組名稱","二級選單","三級選單","四級選單","五級選單","六級選單","功能描述"}; for (int k = 0; k < titleStr.length; k++) { //在一行內迴圈 Cell cell = row.createCell(k); cell.setCellValue(titleStr[k]); } } /** * Word中的大綱級別,可以通過getPPr().getOutlineLvl()直接提取,但需要注意,Word中段落級別,通過如下三種方式定義: * 1、直接對段落進行定義; * 2、對段落的樣式進行定義; * 3、對段落樣式的基礎樣式進行定義。 * 因此,在通過“getPPr().getOutlineLvl()”提取時,需要依次在如上三處讀取。 * @param doc * @param para * @return */ private static String getTitleLvl(XWPFDocument doc, XWPFParagraph para) { String titleLvl = ""; try { //判斷該段落是否設定了大綱級別 if (para.getCTP().getPPr().getOutlineLvl() != null) { return String.valueOf(para.getCTP().getPPr().getOutlineLvl().getVal()); } //判斷該段落的樣式是否設定了大綱級別 if (doc.getStyles().getStyle(para.getStyle()).getCTStyle().getPPr().getOutlineLvl() != null) { return String.valueOf(doc.getStyles().getStyle(para.getStyle()).getCTStyle().getPPr().getOutlineLvl().getVal()); } //判斷該段落的樣式的基礎樣式是否設定了大綱級別 if (doc.getStyles().getStyle(doc.getStyles().getStyle(para.getStyle()).getCTStyle().getBasedOn().getVal()) .getCTStyle().getPPr().getOutlineLvl() != null) { String styleName = doc.getStyles().getStyle(para.getStyle()).getCTStyle().getBasedOn().getVal(); return String.valueOf(doc.getStyles().getStyle(styleName).getCTStyle().getPPr().getOutlineLvl().getVal()); } if(para.getStyleID()!=null){ return para.getStyleID(); } } catch (Exception e) { //這一塊的異常建議別開啟 很多空指標 上邊的方法不想處理了 有興趣的可以試著處理一下 //e.printStackTrace(); //註釋不影響程式的 } return titleLvl; } /** * @Author 喬成強 * @Description 判斷是否為正文,每個文件的正文大綱等級可能不一樣, * 所以根據自己的文件進行調整,以下只是我個人的文件正文大綱等級, * 需要自己根據輸出以及excel結果進行調整 * @Date 2021-10-08 21:25 **/ public static boolean isTest(String titleLvl){
   //以下內容根據自己本地需求進行修改
if ("68".equals(titleLvl) || titleLvl == "" || titleLvl.equals("1309") || titleLvl.equals("1338") || titleLvl.equals("141") || titleLvl.equals("19") || titleLvl.equals("319") || titleLvl.equals("1308")){ return true; }else{ return false; } } /** * 判斷Excel的版本,獲取Workbook * @return * @throws IOException */ public static Workbook getWorkbok(File file) throws IOException{ Workbook wb = null; FileInputStream in = new FileInputStream(file); if(file.getName().endsWith(EXCEL_XLS)){ //Excel2003 wb = new HSSFWorkbook(in); }else if(file.getName().endsWith(EXCEL_XLSX)){ // Excel 2007/2010 wb = new XSSFWorkbook(in); } return wb; } }