POI Word 模板 文字 圖片 替換

實驗環境:POI3.7+Word2007

Word模板:

 

替換後效果:

 

代碼:

1、入口文件

Java代碼  收藏代碼
  1. public class Test {  
  2.       
  3.     public static void main(String[] args) throws Exception {  
  4.           
  5.         Map<String, Object> param = new HashMap<String, Object>();  
  6.         param.put("${name}""huangqiqing");  
  7.         param.put("${zhuanye}""信息管理與信息系統");  
  8.         param.put("${sex}""男");  
  9.         param.put("${school_name}""山東財經大學");  
  10.         param.put("${date}"new Date().toString());  
  11.           
  12.         Map<String,Object> header = new HashMap<String, Object>();  
  13.         header.put("width"100);  
  14.         header.put("height"150);  
  15.         header.put("type""jpg");  
  16.         header.put("content", WordUtil.inputStream2ByteArray(new FileInputStream("c:\\new.jpg"), true));  
  17.         param.put("${header}",header);  
  18.           
  19.         Map<String,Object> twocode = new HashMap<String, Object>();  
  20.         twocode.put("width"100);  
  21.         twocode.put("height"100);  
  22.         twocode.put("type""png");  
  23.         twocode.put("content", ZxingEncoderHandler.getTwoCodeByteArray("測試二維碼,huangqiqing"100,100));  
  24.         param.put("${twocode}",twocode);  
  25.           
  26.         CustomXWPFDocument doc = WordUtil.generateWord(param, "c:\\1.docx");  
  27.         FileOutputStream fopts = new FileOutputStream("c:/2.docx");  
  28.         doc.write(fopts);  
  29.         fopts.close();  
  30.     }  
  31. }  

 

2、封裝的工具類WordUtil.java

Java代碼  收藏代碼
  1. package test1;  
  2.   
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.util.Iterator;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9. import java.util.Map.Entry;  
  10. import org.apache.poi.POIXMLDocument;  
  11. import org.apache.poi.openxml4j.opc.OPCPackage;  
  12. import org.apache.poi.xwpf.usermodel.XWPFParagraph;  
  13. import org.apache.poi.xwpf.usermodel.XWPFRun;  
  14. import org.apache.poi.xwpf.usermodel.XWPFTable;  
  15. import org.apache.poi.xwpf.usermodel.XWPFTableCell;  
  16. import org.apache.poi.xwpf.usermodel.XWPFTableRow;  
  17.   
  18. /** 
  19.  * 適用於word 2007 
  20.  * poi 版本 3.7 
  21.  */  
  22. public class WordUtil {  
  23.   
  24.     /** 
  25.      * 根據指定的參數值、模板,生成 word 文檔 
  26.      * @param param 需要替換的變量 
  27.      * @param template 模板 
  28.      */  
  29.     public static CustomXWPFDocument generateWord(Map<String, Object> param, String template) {  
  30.         CustomXWPFDocument doc = null;  
  31.         try {  
  32.             OPCPackage pack = POIXMLDocument.openPackage(template);  
  33.             doc = new CustomXWPFDocument(pack);  
  34.             if (param != null && param.size() > 0) {  
  35.                   
  36.                 //處理段落  
  37.                 List<XWPFParagraph> paragraphList = doc.getParagraphs();  
  38.                 processParagraphs(paragraphList, param, doc);  
  39.                   
  40.                 //處理表格  
  41.                 Iterator<XWPFTable> it = doc.getTablesIterator();  
  42.                 while (it.hasNext()) {  
  43.                     XWPFTable table = it.next();  
  44.                     List<XWPFTableRow> rows = table.getRows();  
  45.                     for (XWPFTableRow row : rows) {  
  46.                         List<XWPFTableCell> cells = row.getTableCells();  
  47.                         for (XWPFTableCell cell : cells) {  
  48.                             List<XWPFParagraph> paragraphListTable =  cell.getParagraphs();  
  49.                             processParagraphs(paragraphListTable, param, doc);  
  50.                         }  
  51.                     }  
  52.                 }  
  53.             }  
  54.         } catch (Exception e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.         return doc;  
  58.     }  
  59.     /** 
  60.      * 處理段落 
  61.      * @param paragraphList 
  62.      */  
  63.     public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String, Object> param,CustomXWPFDocument doc){  
  64.         if(paragraphList != null && paragraphList.size() > 0){  
  65.             for(XWPFParagraph paragraph:paragraphList){  
  66.                 List<XWPFRun> runs = paragraph.getRuns();  
  67.                 for (XWPFRun run : runs) {  
  68.                     String text = run.getText(0);  
  69.                     if(text != null){  
  70.                         boolean isSetText = false;  
  71.                         for (Entry<String, Object> entry : param.entrySet()) {  
  72.                             String key = entry.getKey();  
  73.                             if(text.indexOf(key) != -1){  
  74.                                 isSetText = true;  
  75.                                 Object value = entry.getValue();  
  76.                                 if (value instanceof String) {//文本替換  
  77.                                     text = text.replace(key, value.toString());  
  78.                                 } else if (value instanceof Map) {//圖片替換  
  79.                                     text = text.replace(key, "");  
  80.                                     Map pic = (Map)value;  
  81.                                     int width = Integer.parseInt(pic.get("width").toString());  
  82.                                     int height = Integer.parseInt(pic.get("height").toString());  
  83.                                     int picType = getPictureType(pic.get("type").toString());  
  84.                                     byte[] byteArray = (byte[]) pic.get("content");  
  85.                                     ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);  
  86.                                     try {  
  87.                                         int ind = doc.addPicture(byteInputStream,picType);  
  88.                                         doc.createPicture(ind, width , height,paragraph);  
  89.                                     } catch (Exception e) {  
  90.                                         e.printStackTrace();  
  91.                                     }  
  92.                                 }  
  93.                             }  
  94.                         }  
  95.                         if(isSetText){  
  96.                             run.setText(text,0);  
  97.                         }  
  98.                     }  
  99.                 }  
  100.             }  
  101.         }  
  102.     }  
  103.     /** 
  104.      * 根據圖片類型,取得對應的圖片類型代碼 
  105.      * @param picType 
  106.      * @return int 
  107.      */  
  108.     private static int getPictureType(String picType){  
  109.         int res = CustomXWPFDocument.PICTURE_TYPE_PICT;  
  110.         if(picType != null){  
  111.             if(picType.equalsIgnoreCase("png")){  
  112.                 res = CustomXWPFDocument.PICTURE_TYPE_PNG;  
  113.             }else if(picType.equalsIgnoreCase("dib")){  
  114.                 res = CustomXWPFDocument.PICTURE_TYPE_DIB;  
  115.             }else if(picType.equalsIgnoreCase("emf")){  
  116.                 res = CustomXWPFDocument.PICTURE_TYPE_EMF;  
  117.             }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){  
  118.                 res = CustomXWPFDocument.PICTURE_TYPE_JPEG;  
  119.             }else if(picType.equalsIgnoreCase("wmf")){  
  120.                 res = CustomXWPFDocument.PICTURE_TYPE_WMF;  
  121.             }  
  122.         }  
  123.         return res;  
  124.     }  
  125.     /** 
  126.      * 將輸入流中的數據寫入字節數組 
  127.      * @param in 
  128.      * @return 
  129.      */  
  130.     public static byte[] inputStream2ByteArray(InputStream in,boolean isClose){  
  131.         byte[] byteArray = null;  
  132.         try {  
  133.             int total = in.available();  
  134.             byteArray = new byte[total];  
  135.             in.read(byteArray);  
  136.         } catch (IOException e) {  
  137.             e.printStackTrace();  
  138.         }finally{  
  139.             if(isClose){  
  140.                 try {  
  141.                     in.close();  
  142.                 } catch (Exception e2) {  
  143.                     System.out.println("關閉流失敗");  
  144.                 }  
  145.             }  
  146.         }  
  147.         return byteArray;  
  148.     }  
  149. }  

 

3、重寫的類 CustomXWPFDocument

Java代碼  收藏代碼
  1. package test1;    
  2.     
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import org.apache.poi.openxml4j.opc.OPCPackage;  
  6. import org.apache.poi.xwpf.usermodel.XWPFDocument;  
  7. import org.apache.poi.xwpf.usermodel.XWPFParagraph;  
  8. import org.apache.xmlbeans.XmlException;  
  9. import org.apache.xmlbeans.XmlToken;  
  10. import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;  
  11. import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;  
  12. import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;  
  13.     
  14. /** 
  15.  * 自定義 XWPFDocument,並重寫 createPicture()方法 
  16.  */  
  17. public class CustomXWPFDocument extends XWPFDocument {    
  18.     public CustomXWPFDocument(InputStream in) throws IOException {    
  19.         super(in);    
  20.     }    
  21.     
  22.     public CustomXWPFDocument() {    
  23.         super();    
  24.     }    
  25.     
  26.     public CustomXWPFDocument(OPCPackage pkg) throws IOException {    
  27.         super(pkg);    
  28.     }    
  29.     
  30.     /** 
  31.      * @param id 
  32.      * @param width 寬 
  33.      * @param height 高 
  34.      * @param paragraph  段落 
  35.      */  
  36.     public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {    
  37.         final int EMU = 9525;    
  38.         width *= EMU;    
  39.         height *= EMU;    
  40.         String blipId = getAllPictures().get(id).getPackageRelationship().getId();    
  41.         CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();    
  42.         String picXml = ""    
  43.                 + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"    
  44.                 + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
  45.                 + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
  46.                 + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""    
  47.                 + id    
  48.                 + "\" name=\"Generated\"/>"    
  49.                 + "            <pic:cNvPicPr/>"    
  50.                 + "         </pic:nvPicPr>"    
  51.                 + "         <pic:blipFill>"    
  52.                 + "            <a:blip r:embed=\""    
  53.                 + blipId    
  54.                 + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"    
  55.                 + "            <a:stretch>"    
  56.                 + "               <a:fillRect/>"    
  57.                 + "            </a:stretch>"    
  58.                 + "         </pic:blipFill>"    
  59.                 + "         <pic:spPr>"    
  60.                 + "            <a:xfrm>"    
  61.                 + "               <a:off x=\"0\" y=\"0\"/>"    
  62.                 + "               <a:ext cx=\""    
  63.                 + width    
  64.                 + "\" cy=\""    
  65.                 + height    
  66.                 + "\"/>"    
  67.                 + "            </a:xfrm>"    
  68.                 + "            <a:prstGeom prst=\"rect\">"    
  69.                 + "               <a:avLst/>"    
  70.                 + "            </a:prstGeom>"    
  71.                 + "         </pic:spPr>"    
  72.                 + "      </pic:pic>"    
  73.                 + "   </a:graphicData>" + "</a:graphic>";    
  74.     
  75.         inline.addNewGraphic().addNewGraphicData();    
  76.         XmlToken xmlToken = null;    
  77.         try {    
  78.             xmlToken = XmlToken.Factory.parse(picXml);    
  79.         } catch (XmlException xe) {    
  80.             xe.printStackTrace();    
  81.         }    
  82.         inline.set(xmlToken);   
  83.           
  84.         inline.setDistT(0);      
  85.         inline.setDistB(0);      
  86.         inline.setDistL(0);      
  87.         inline.setDistR(0);      
  88.           
  89.         CTPositiveSize2D extent = inline.addNewExtent();    
  90.         extent.setCx(width);    
  91.         extent.setCy(height);    
  92.           
  93.         CTNonVisualDrawingProps docPr = inline.addNewDocPr();      
  94.         docPr.setId(id);      
  95.         docPr.setName("圖片" + id);      
  96.         docPr.setDescr("測試");   
  97.     }    
  98. }    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章