將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)){ //Excel 2003 wb = new HSSFWorkbook(in); }else if(file.getName().endsWith(EXCEL_XLSX)){ // Excel 2007/2010 wb = new XSSFWorkbook(in); } return wb; } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM