java讀取word並解析


java POI3.8處理word模板,文字 圖片 表格

將word模板里面的特殊標簽換成 文字,圖片,
以下是處理的代碼
特殊標簽最好的復制粘貼到word模板里面 ,因為手動敲入可能有點小的差別都導致這個標簽不是一小塊(chunk)
這樣會無法識別,文字樣式設置的時候也最好選擇特殊標簽整體進行設置,盡量不要多選(例如標簽后面跟上一個空格)

這里的替換包含了文字樣式的替換,圖片的替換

-------------------------------------------------------------------------------------------------------------------------------------
package com.util.export;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.VerticalAlign;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;



public class WordCompileReport {
 

       
        public static void searchAndReplace(String srcPath, String destPath,
                Map map,Map mapImage) {
            try {
                XWPFDocument document = new XWPFDocument(
                        POIXMLDocument.openPackage(srcPath));
                
                //替換表格占位符
                checkTables(document,map);
                //替換段落占位符
                checkParagraphs(document,map);
                //在末尾添加文字
                addParagraphToWord(document,"這里添加文字",30,0,"#EB9074",true);
                //替換圖片
                replaceTextToImage(document,mapImage,200,200);
                
                
                
                
                
                FileOutputStream outStream = null;
                outStream = new FileOutputStream(destPath);
                document.write(outStream);
                outStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        
        
        
        public static void checkTables(XWPFDocument document,
                Map map) {
            Iterator it = document.getTablesIterator();
            while (it.hasNext()) {
                XWPFTable table = (XWPFTable) it.next();
                int rcount = table.getNumberOfRows();
                for (int i = 0; i < rcount; i++) {
                    XWPFTableRow row = table.getRow(i);
                    List cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        List listCell;
                        for (Entry e : map.entrySet()) {
                            listCell = cell.getParagraphs();
                            List cellRun;
                            Map mapAttr = new HashMap();
                            for (int j = 0; j < listCell.size(); j++) {
                                if (listCell.get(j).getText().indexOf(e.getKey()) != -1) {
                                    cellRun = listCell.get(j).getRuns();
                                    for (int c = 0; c < cellRun.size(); c++) {
                                        if (cellRun.get(c).getText(0).equals(e.getKey())) {
                                            mapAttr = getWordXWPFRunStyle(cellRun.get(c));
                                            listCell.get(j).removeRun(c);
                                            XWPFRun newRun = listCell.get(j).insertNewRun(c);
                                            setWordXWPFRunStyle(newRun, mapAttr,e.getValue(), false);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        
        
        
        public static void checkParagraphs(XWPFDocument document,Map map){
            List listRun;
            Map mapAttr = new HashMap();
            List listParagraphs = document.getParagraphs();
            for (int sa = 0; sa < listParagraphs.size(); sa++) {
                for (Entry e : map.entrySet()) {
                    if (listParagraphs.get(sa).getText().indexOf(e.getKey()) != -1) {
                        listRun = listParagraphs.get(sa).getRuns();
                        for (int p = 0; p < listRun.size(); p++) {
                            if (listRun.get(p).toString().equals(e.getKey())) {
                                //得到占位符的文本格式
                                XWPFRun runOld = listParagraphs.get(sa).getRuns().get(p);
                                mapAttr=getWordXWPFRunStyle(runOld); //封裝該占位符文本樣式到map
                                listParagraphs.get(sa).removeRun(p);//移除占位符
                                //創建設置對應占位符的文本
                                XWPFRun runNew = listParagraphs.get(sa).insertNewRun(p);
                                setWordXWPFRunStyle(runNew,mapAttr,e.getValue(),true);
                            }
                        }
                    }
                }
            }
        }
        
        
        public static Map getWordXWPFRunStyle(XWPFRun runOld){
            Map mapAttr = new HashMap();
            mapAttr.put("Color", runOld.getColor());
            if(-1==runOld.getFontSize()){
                mapAttr.put("FontSize", 12);
            }else{
                mapAttr.put("FontSize", runOld.getFontSize());
            }
            mapAttr.put("Subscript", runOld.getSubscript());
            mapAttr.put("Underline", runOld.getUnderline());
            mapAttr.put("FontFamily",runOld.getFontFamily());
            return mapAttr;
        }
        
        
        
        public static XWPFRun setWordXWPFRunStyle(XWPFRun runNew,Map mapAttr,String text,boolean flag){
            runNew.setColor((String) mapAttr.get("Color"));
            if("-1".equals(mapAttr.get("FontSize").toString())){//處理小四字號讀取為-1的問題
                runNew.setFontSize(12);
            }else{
                runNew.setFontSize((Integer) mapAttr.get("FontSize"));
            }
            runNew.setBold(flag);
            runNew.setUnderline((UnderlinePatterns) mapAttr.get("Underline"));
            runNew.setText(text);
            runNew.setSubscript((VerticalAlign) mapAttr.get("Subscript"));
            runNew.setFontFamily((String) mapAttr.get("FontFamily"));
            return runNew;
        }
        
        
        public static void updatePicture(XWPFDocument document,int id, int width, int height) {
            if(id==0){
                id = document.getAllPictures().size()-1;
            }
            final int EMU = 9525;
            width *= EMU;
            height *= EMU;
            String blipId = document.getAllPictures().get(id).getPackageRelationship()
                    .getId();
            CTInline inline = document.createParagraph().createRun().getCTR()
                    .addNewDrawing().addNewInline();
            
            String picXml = ""
                    + ""
                    + "   "
                    + "      "
                    + "         " + "           
                    + id
                    + "\" name=\"Generated\"/>"
                    + "            "
                    + "         "
                    + "         "
                    + "           
                    + blipId
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                    + "            "
                    + "               "
                    + "            "
                    + "         "
                    + "         "
                    + "            "
                    + "               "
                    + "              
                    + width
                    + "\" cy=\""
                    + height
                    + "\"/>"
                    + "            "
                    + "            "
                    + "               "
                    + "            "
                    + "         "
                    + "      "
                    + "   " + "";
            // CTGraphicalObjectData graphicData =
            inline.addNewGraphic().addNewGraphicData();
            XmlToken xmlToken = null;
            try {
                xmlToken = XmlToken.Factory.parse(picXml);
            } catch (XmlException xe) {
                xe.printStackTrace();
            }
            inline.set(xmlToken);
            // graphicData.set(xmlToken);
            inline.setDistT(0);
            inline.setDistB(0);
            inline.setDistL(0);
            inline.setDistR(0);
            CTPositiveSize2D extent = inline.addNewExtent();
            extent.setCx(width);
            extent.setCy(height);
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();
            docPr.setId(id);
            docPr.setName("IMG_" + id);
            docPr.setDescr("IMG_" + id);
        }
        
        
        public static void addPictureToWord(XWPFDocument document,String imagePath,int imageType,int width,int height){
            if(0==imageType){
                imageType=XWPFDocument.PICTURE_TYPE_JPEG;
            }
            try {
                String ind = document.addPictureData(new FileInputStream(imagePath), imageType);
            } catch (InvalidFormatException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            updatePicture(document,document.getAllPictures().size()-1,400,400);
        }
        
        
        public static void addParagraphToWord(XWPFDocument document,String text,int fontSize,int alignment,String RGBColor,boolean isBold){
            XWPFParagraph paragraph = document.createParagraph();
            if(1==alignment){
                paragraph.setAlignment(ParagraphAlignment.CENTER);
            }else if(2==alignment){
                paragraph.setAlignment(ParagraphAlignment.CENTER);
            }else if(3==alignment){
                paragraph.setAlignment(ParagraphAlignment.RIGHT);
            }else{
                paragraph.setIndentationLeft(alignment);
            }
            XWPFRun runOne = paragraph.createRun();
            runOne.setText(text);
            runOne.setBold(isBold);
            runOne.setFontSize(fontSize);
            if(RGBColor.startsWith("#")){
                runOne.setColor(RGBColor.substring(1));
            }else{
                runOne.setColor(RGBColor);
            }
        }
        
        
        public static void addRunToParagraph(XWPFParagraph paragraph,String text,int fontSize,String RGBColor,boolean isBold,boolean isWrap){
            XWPFRun runText = paragraph.createRun();
//            runText.setStrike(true);  //刪除線
            runText.setBold(isBold);
            runText.setColor(RGBColor);
            runText.setFontSize(fontSize);
            runText.setText(text);
            if(isWrap)runText.addBreak();
        }
        
        
        public static void replaceTextToImage(XWPFDocument document,Map mapImage,int width,int height){
                List listRun;
                List listParagraphs = document.getParagraphs();
                for (int sa = 0; sa < listParagraphs.size(); sa++) {
                    for (Entry e : mapImage.entrySet()) {
                        if (listParagraphs.get(sa).getText().indexOf(e.getKey()) != -1) {
                            listRun = listParagraphs.get(sa).getRuns();
                            for (int p = 0; p < listRun.size(); p++) {
                                if (listRun.get(p).toString().equals(e.getKey())) {
                                    listParagraphs.get(sa).removeRun(p);//移除占位符
                                    //獲得當前CTInline
                                    CTInline inline = listParagraphs.get(sa).createRun().getCTR().addNewDrawing().addNewInline();
                                    try {
                                        insertPicture(document,e.getValue(),inline,width,height);
                                    } catch (InvalidFormatException e1) {
                                        e1.printStackTrace();
                                    } catch (FileNotFoundException e1) {
                                        e1.printStackTrace();
                                    }
                                }
                            }
                        }
                    }
                }
        }
        
        
        public static void insertPicture(XWPFDocument document,String filePath,CTInline inline,int width, int height) throws InvalidFormatException, FileNotFoundException{
                String ind = document.addPictureData(new FileInputStream(filePath), 5);
                int id = document.getAllPictures().size()-1;
                final int EMU = 9525;
                width *= EMU;
                height *= EMU;
                String blipId = document.getAllPictures().get(id).getPackageRelationship()
                        .getId();
                String picXml = ""
                        + ""
                        + "   "
                        + "      "
                        + "         " + "           
                        + id
                        + "\" name=\"Generated\"/>"
                        + "            "
                        + "         "
                        + "         "
                        + "           
                        + blipId
                        + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                        + "            "
                        + "               "
                        + "            "
                        + "         "
                        + "         "
                        + "            "
                        + "               "
                        + "              
                        + width
                        + "\" cy=\""
                        + height
                        + "\"/>"
                        + "            "
                        + "            "
                        + "               "
                        + "            "
                        + "         "
                        + "      "
                        + "   " + "";
                inline.addNewGraphic().addNewGraphicData();
                XmlToken xmlToken = null;
                try {
                    xmlToken = XmlToken.Factory.parse(picXml);
                } catch (XmlException xe) {
                    xe.printStackTrace();
                }
                inline.set(xmlToken);
                inline.setDistT(0);
                inline.setDistB(0);
                inline.setDistL(0);
                inline.setDistR(0);
                CTPositiveSize2D extent = inline.addNewExtent();
                extent.setCx(width);
                extent.setCy(height);
                CTNonVisualDrawingProps docPr = inline.addNewDocPr();
                docPr.setId(id);
                docPr.setName("IMG_" + id);
                docPr.setDescr("IMG_" + id);
        }
        
        public static void main(String[] args) {
            HashMap map = new HashMap();
            HashMap mapImage = new HashMap();
            map.put("${name}$", "02");
            map.put("${userIDs}$", "5201314");
            mapImage.put("${image1}$", "F:\\A.jpg");
            mapImage.put("${image2}$", "F:\\B.jpg");
            String srcPath = "c:\\zhenli\\cc.docx";
            String destPath = "c:\\zhenli\\輸出模版.docx";
            searchAndReplace(srcPath, destPath, map,mapImage);
        }
}


免責聲明!

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



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