注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

Java结合docx4j生成docx文件(第一部分)  

2012-12-06 18:47:12|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

docx4j 是一个解压的docx一个“一揽子”库,并解析WordprocessingML XML创建一个内存中的代表性 Java 。 最新版本的 docx4j 也支援PowerPoint pptx文件。 
它是在概念上类似于微软的OpenXML SDK,它是对的。NET。
docx4j 严重依赖 JAXB,XML绑定的Java JCP标准。 你能想到的 docx4j 作为一个JAXB的实施除其他():
打开包装公约,WordprocessingML(docx)的,开放的XML部分

Presentation ML (pptx) part of OpenXML 

该库是为了圆100%保真度之行docx文件,支持所有2007 WordML中。 

平时项目中经常碰到报表的生成,在此简单描述下使用java结合docx4j技术,生成docx文件的一些基本方法,仅供参考,代码如下: 

Java代码 
  1. import java.awt.image.BufferedImage;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.math.BigInteger;  
  6. import java.text.SimpleDateFormat;  
  7. import java.util.Date;  
  8. import java.util.List;  
  9.   
  10. import javax.imageio.ImageIO;  
  11. import javax.xml.bind.JAXBException;  
  12.   
  13. import org.docx4j.XmlUtils;  
  14. import org.docx4j.dml.wordprocessingDrawing.Inline;  
  15. import org.docx4j.jaxb.Context;  
  16. import org.docx4j.model.structure.SectionWrapper;  
  17. import org.docx4j.model.table.TblFactory;  
  18. import org.docx4j.openpackaging.exceptions.InvalidFormatException;  
  19. import org.docx4j.openpackaging.packages.WordprocessingMLPackage;  
  20. import org.docx4j.openpackaging.parts.Part;  
  21. import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;  
  22. import org.docx4j.openpackaging.parts.WordprocessingML.DocumentSettingsPart;  
  23. import org.docx4j.openpackaging.parts.WordprocessingML.FooterPart;  
  24. import org.docx4j.openpackaging.parts.relationships.Namespaces;  
  25. import org.docx4j.relationships.Relationship;  
  26. import org.docx4j.wml.BooleanDefaultTrue;  
  27. import org.docx4j.wml.CTBorder;  
  28. import org.docx4j.wml.CTDocProtect;  
  29. import org.docx4j.wml.CTSettings;  
  30. import org.docx4j.wml.CTTblLayoutType;  
  31. import org.docx4j.wml.CTVerticalJc;  
  32. import org.docx4j.wml.FooterReference;  
  33. import org.docx4j.wml.Ftr;  
  34. import org.docx4j.wml.HdrFtrRef;  
  35. import org.docx4j.wml.Jc;  
  36. import org.docx4j.wml.JcEnumeration;  
  37. import org.docx4j.wml.ObjectFactory;  
  38. import org.docx4j.wml.P;  
  39. import org.docx4j.wml.PPr;  
  40. import org.docx4j.wml.RPr;  
  41. import org.docx4j.wml.STAlgClass;  
  42. import org.docx4j.wml.STAlgType;  
  43. import org.docx4j.wml.STBorder;  
  44. import org.docx4j.wml.STCryptProv;  
  45. import org.docx4j.wml.STDocProtect;  
  46. import org.docx4j.wml.STHint;  
  47. import org.docx4j.wml.STTblLayoutType;  
  48. import org.docx4j.wml.STVerticalJc;  
  49. import org.docx4j.wml.SectPr;  
  50. import org.docx4j.wml.Tbl;  
  51. import org.docx4j.wml.TblGrid;  
  52. import org.docx4j.wml.TblGridCol;  
  53. import org.docx4j.wml.TblPr;  
  54. import org.docx4j.wml.TblWidth;  
  55. import org.docx4j.wml.Tc;  
  56. import org.docx4j.wml.TcPr;  
  57. import org.docx4j.wml.Tr;  
  58. import org.docx4j.wml.TrPr;  
  59. import org.docx4j.wml.SectPr.PgMar;  
  60. import org.docx4j.wml.TcPrInner.HMerge;  
  61. import org.docx4j.wml.TcPrInner.TcBorders;  
  62. import org.docx4j.wml.TcPrInner.VMerge;  
  63. import org.krysalis.barcode4j.impl.code39.Code39Bean;  
  64. import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;  
  65.   
  66. /** 
  67.  * 功能描述:报表的工具类 
  68.  * @author myclover 
  69.  * 
  70.  */  
  71. @SuppressWarnings("all")  
  72. public class Docx4jUtils {  
  73.       
  74.     /** 
  75.      * 功能描述:创建文档处理包对象 
  76.      * @return  返回值:返回文档处理包对象 
  77.      * @throws Exception 
  78.      * @author myclover 
  79.      */  
  80.     public static WordprocessingMLPackage createWordprocessingMLPackage() throws Exception{  
  81.         return WordprocessingMLPackage.createPackage();  
  82.     }  
  83.       
  84.     /** 
  85.      * 功能描述:获取文档的可用宽度 
  86.      * @param wordPackage 文档处理包对象 
  87.      * @return            返回值:返回值文档的可用宽度 
  88.      * @throws Exception 
  89.      * @author myclover 
  90.      */  
  91.     private static int getWritableWidth(WordprocessingMLPackage wordPackage)throws Exception{  
  92.         return wordPackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips();  
  93.     }  
  94.       
  95.     /** 
  96.      * 功能描述:创建文档表格,上下双边框,左右不封口 
  97.      * @param rows    行数 
  98.      * @param cols    列数 
  99.      * @param widths  每列的宽度 
  100.      * @return   返回值:返回表格对象 
  101.      * @author myclover 
  102.      */  
  103.     public static Tbl createTable(int rows, int cols, int[] widths) {  
  104.         ObjectFactory factory = Context.getWmlObjectFactory();  
  105.         Tbl tbl = factory.createTbl();  
  106.         // w:tblPr  
  107.         StringBuffer tblSb = new StringBuffer();  
  108.         tblSb.append("<w:tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION).append(">");  
  109.         tblSb.append("<w:tblStyle w:val=\"TableGrid\"/>");  
  110.         tblSb.append("<w:tblW w:w=\"0\" w:type=\"auto\"/>");  
  111.         //上边框双线  
  112.         tblSb.append("<w:tblBorders><w:top w:val=\"double\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>");  
  113.         //左边无边框  
  114.         tblSb.append("<w:left w:val=\"none\" w:sz=\"0\" w:space=\"0\" w:color=\"auto\"/>");  
  115.         //下边框双线  
  116.         tblSb.append("<w:bottom w:val=\"double\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>");  
  117.         //右边无边框  
  118.         tblSb.append("<w:right w:val=\"none\" w:sz=\"0\" w:space=\"0\" w:color=\"auto\"/>");  
  119.         tblSb.append("</w:tblBorders>");  
  120.         tblSb.append("<w:tblLook w:val=\"04A0\"/>");  
  121.         tblSb.append("</w:tblPr>");  
  122.         TblPr tblPr = null;  
  123.         try {  
  124.             tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString());  
  125.         } catch (JAXBException e) {  
  126.             e.printStackTrace();  
  127.         }  
  128.         tbl.setTblPr(tblPr);  
  129.         if (tblPr != null) {  
  130.             Jc jc = factory.createJc();  
  131.             //单元格居中对齐  
  132.             jc.setVal(JcEnumeration.CENTER);  
  133.             tblPr.setJc(jc);  
  134.             CTTblLayoutType tbll = factory.createCTTblLayoutType();  
  135.             // 固定列宽  
  136.             tbll.setType(STTblLayoutType.FIXED);  
  137.             tblPr.setTblLayout(tbll);  
  138.         }  
  139.         // <w:tblGrid><w:gridCol w:w="4788"/>  
  140.         TblGrid tblGrid = factory.createTblGrid();  
  141.         tbl.setTblGrid(tblGrid);  
  142.         // Add required <w:gridCol w:w="4788"/>  
  143.         for (int i = 1; i <= cols; i++) {  
  144.             TblGridCol gridCol = factory.createTblGridCol();  
  145.             gridCol.setW(BigInteger.valueOf(widths[i - 1]));  
  146.             tblGrid.getGridCol().add(gridCol);  
  147.         }  
  148.         // Now the rows  
  149.         for (int j = 1; j <= rows; j++) {  
  150.             Tr tr = factory.createTr();  
  151.             tbl.getContent().add(tr);  
  152.             // The cells  
  153.             for (int i = 1; i <= cols; i++) {  
  154.                 Tc tc = factory.createTc();  
  155.                 tr.getContent().add(tc);  
  156.                 TcPr tcPr = factory.createTcPr();  
  157.                 tc.setTcPr(tcPr);  
  158.                 // <w:tcW w:w="4788" w:type="dxa"/>  
  159.                 TblWidth cellWidth = factory.createTblWidth();  
  160.                 tcPr.setTcW(cellWidth);  
  161.                 cellWidth.setType("dxa");  
  162.                 cellWidth.setW(BigInteger.valueOf(widths[i - 1]));  
  163.                 tc.getContent().add(factory.createP());  
  164.             }  
  165.   
  166.         }  
  167.         return tbl;  
  168.     }  
  169.       
  170.     /** 
  171.      * 功能描述:创建文档表格,全部表格边框都为1 
  172.      * @param rows    行数 
  173.      * @param cols    列数 
  174.      * @param widths  每列的宽度 
  175.      * @return   返回值:返回表格对象 
  176.      * @author myclover 
  177.      */  
  178.     public static Tbl createBorderTable(int rows, int cols, int[] widths) {  
  179.         ObjectFactory factory = Context.getWmlObjectFactory();  
  180.         Tbl tbl = factory.createTbl();  
  181.         // w:tblPr  
  182.         StringBuffer tblSb = new StringBuffer();  
  183.         tblSb.append("<w:tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION).append(">");  
  184.         tblSb.append("<w:tblStyle w:val=\"TableGrid\"/>");  
  185.         tblSb.append("<w:tblW w:w=\"0\" w:type=\"auto\"/>");  
  186.         tblSb.append("<w:tblBorders><w:top w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>");  
  187.         tblSb.append("<w:left w:val=\"single\" w:sz=\"0\" w:space=\"0\" w:color=\"auto\"/>");  
  188.         tblSb.append("<w:bottom w:val=\"single\" w:sz=\"4\" w:space=\"0\" w:color=\"auto\"/>");  
  189.         tblSb.append("<w:right w:val=\"single\" w:sz=\"0\" w:space=\"0\" w:color=\"auto\"/>");  
  190.         tblSb.append("</w:tblBorders>");  
  191.         tblSb.append("<w:tblLook w:val=\"04A0\"/>");  
  192.         tblSb.append("</w:tblPr>");  
  193.         TblPr tblPr = null;  
  194.         try {  
  195.             tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString());  
  196.         } catch (JAXBException e) {  
  197.             e.printStackTrace();  
  198.         }  
  199.         tbl.setTblPr(tblPr);  
  200.         if (tblPr != null) {  
  201.             Jc jc = factory.createJc();  
  202.             //单元格居中对齐  
  203.             jc.setVal(JcEnumeration.CENTER);  
  204.             tblPr.setJc(jc);  
  205.             CTTblLayoutType tbll = factory.createCTTblLayoutType();  
  206.             // 固定列宽  
  207.             tbll.setType(STTblLayoutType.FIXED);  
  208.             tblPr.setTblLayout(tbll);  
  209.         }  
  210.         // <w:tblGrid><w:gridCol w:w="4788"/>  
  211.         TblGrid tblGrid = factory.createTblGrid();  
  212.         tbl.setTblGrid(tblGrid);  
  213.         // Add required <w:gridCol w:w="4788"/>  
  214.         for (int i = 1; i <= cols; i++) {  
  215.             TblGridCol gridCol = factory.createTblGridCol();  
  216.             gridCol.setW(BigInteger.valueOf(widths[i - 1]));  
  217.             tblGrid.getGridCol().add(gridCol);  
  218.         }  
  219.         // Now the rows  
  220.         for (int j = 1; j <= rows; j++) {  
  221.             Tr tr = factory.createTr();  
  222.             tbl.getContent().add(tr);  
  223.             // The cells  
  224.             for (int i = 1; i <= cols; i++) {  
  225.                 Tc tc = factory.createTc();  
  226.                 tr.getContent().add(tc);  
  227.                 TcPr tcPr = factory.createTcPr();  
  228.                 tc.setTcPr(tcPr);  
  229.                 // <w:tcW w:w="4788" w:type="dxa"/>  
  230.                 TblWidth cellWidth = factory.createTblWidth();  
  231.                 tcPr.setTcW(cellWidth);  
  232.                 cellWidth.setType("dxa");  
  233.                 cellWidth.setW(BigInteger.valueOf(widths[i - 1]));  
  234.                 tc.getContent().add(factory.createP());  
  235.             }  
  236.               
  237.         }  
  238.         return tbl;  
  239.     }  
  240.       
  241.     /** 
  242.      * 功能描述:创建文档表格,上下双边框,左右不封口 
  243.      * @param wordPackage  文档处理包对象 
  244.      * @param rows         表格行数 
  245.      * @param cols         表格列数 
  246.      * @param tableWidth   表格的宽度 
  247.      * @param style        表格的样式 
  248.      * @param jcEnumerationVal 表格的对齐方式 
  249.      * @return             返回值:返回表格对象 
  250.      * @throws Exception 
  251.      * @author myclover 
  252.      */  
  253.     private static Tbl createTable(WordprocessingMLPackage wordPackage , int rows , int cols , String tableWidth , String style , JcEnumeration jcEnumerationVal)throws Exception{  
  254.         int writableWidthTwips = getWritableWidth(wordPackage);  
  255.         if(cols == 0){  
  256.             cols = 1;  
  257.         }  
  258.         int cellWidth = new Double(Math.floor( (writableWidthTwips/cols ))).intValue();  
  259.         int[] widths = new int[cols];  
  260.         for(int i = 0 ; i < cols ; i++){  
  261.             widths[i] = cellWidth;  
  262.         }  
  263.         return createTable(rows, cols, widths);  
  264.     }  
  265.       
  266.     /** 
  267.      * 功能描述:创建文档表格,表格的默认宽度为:表格样式:dxa,对齐方式:居中 
  268.      * @param wordPackage 文档处理包对象 
  269.      * @param rows        表格行数 
  270.      * @param cols        表格列数 
  271.      * @param tableWidth  表格宽度 
  272.      * @return            返回值:返回表格对象 
  273.      * @throws Exception 
  274.      * @author myclover 
  275.      */  
  276.     public static Tbl createTable(WordprocessingMLPackage wordPackage , int rows , int cols , String tableWidth) throws Exception{  
  277.         return createTable(wordPackage, rows, cols, tableWidth , "dxa", JcEnumeration.CENTER);  
  278.     }  
  279.       
  280.     /** 
  281.      * 功能描述:创建文档表格,表格的默认宽度为:9328,表格样式:dxa,对齐方式:居中 
  282.      * @param wordPackage 文档处理包对象 
  283.      * @param rows        表格行数 
  284.      * @param cols        表格列数 
  285.      * @return            返回值:返回表格对象 
  286.      * @throws Exception 
  287.      * @author myclover 
  288.      */  
  289.     public static Tbl createTable(WordprocessingMLPackage wordPackage , int rows , int cols) throws Exception{  
  290.         return createTable(wordPackage, rows, cols, "9328""dxa", JcEnumeration.CENTER);  
  291.     }  
  292.       
  293.     /** 
  294.      * 功能描述:往文档对象中添加相应的内容 
  295.      * @param wordPackage  文档处理包对象 
  296.      * @param info         需要添加的信息 
  297.      * @param unmarshal    是否有样式,表格对象默认不用 
  298.      * @throws Exception 
  299.      * @author myclover 
  300.      */  
  301.     private static void addObject(WordprocessingMLPackage wordPackage , Object info , boolean unmarshal)throws Exception{  
  302.         if(unmarshal){  
  303.             wordPackage.getMainDocumentPart().addObject(org.docx4j.XmlUtils.unmarshalString(String.valueOf(info)));  
  304.         }else{  
  305.             wordPackage.getMainDocumentPart().addObject(info);  
  306.         }  
  307.     }  
  308.       
  309.     /** 
  310.      * 功能描述:往文档中添加内容 
  311.      * @param wordPackage  文档处理包对象 
  312.      * @param info         文档内容 
  313.      * @throws Exception 
  314.      * @author myclover 
  315.      */  
  316.     public static void addObject(WordprocessingMLPackage wordPackage , Object info)throws Exception{  
  317.         addObject(wordPackage, info, true);  
  318.     }  
  319.       
  320.     /** 
  321.      * 功能描述:往文档中添加表格 
  322.      * @param wordPackage  文档处理包对象 
  323.      * @param tbl          表格 
  324.      * @throws Exception 
  325.      * @author myclover 
  326.      */  
  327.     public static void addObjectForTbl(WordprocessingMLPackage wordPackage , Tbl tbl)throws Exception{  
  328.         addObject(wordPackage, tbl, false);  
  329.     }  
  330.       
  331.     /** 
  332.      * 功能描述:保存文档信息 
  333.      * @param wordPackage  文档处理包对象 
  334.      * @param fileName     完整的输出文件名称,包括路径 
  335.      * @throws Exception 
  336.      * @author myclover 
  337.      */  
  338.     public static void saveWordPackage(WordprocessingMLPackage wordPackage , String fileName)throws Exception{  
  339.         saveWordPackage(wordPackage, new File(fileName));  
  340.     }  
  341.       
  342.     /** 
  343.      * 功能描述:保存文档信息 
  344.      * @param wordPackage  文档处理包对象 
  345.      * @param file         文件 
  346.      * @throws Exception 
  347.      * @author myclover 
  348.      */  
  349.     public static void saveWordPackage(WordprocessingMLPackage wordPackage , File file)throws Exception{  
  350.         wordPackage.save(file);  
  351.     }  
  352.       
  353.     /** 
  354.      * 功能描述:设置页边距 
  355.      * @param wordPackage 文档处理包对象 
  356.      * @param top    上边距 
  357.      * @param bottom 下边距 
  358.      * @param left   左边距 
  359.      * @param right  右边距 
  360.      * @author myclover 
  361.      */  
  362.     public static void setMarginSpace(WordprocessingMLPackage wordPackage , String top , String bottom , String left , String right ){  
  363.         ObjectFactory factory = Context.getWmlObjectFactory();  
  364.         PgMar pg = factory.createSectPrPgMar();  
  365.         pg.setTop(new BigInteger(top));  
  366.         pg.setBottom(new BigInteger(bottom));  
  367.         pg.setLeft(new BigInteger(left));  
  368.         pg.setRight(new BigInteger(right));  
  369.         wordPackage.getDocumentModel().getSections().get(0).getSectPr().setPgMar(pg);  
  370.     }  
  371.       
  372.     /** 
  373.      * 功能描述:设置页边距,上下边距都为1440,2.54厘米 
  374.      * @param wordPackage 文档处理包对象 
  375.      * @param left   左边距 
  376.      * @param right  右边距 
  377.      * @author myclover 
  378.      */  
  379.     public static void setMarginSpace(WordprocessingMLPackage wordPackage , String left , String right ){  
  380.         setMarginSpace(wordPackage, "1440""1440", left, right);  
  381.     }  
  382.       
  383.     /** 
  384.      * 功能描述:设置页边距,上下边距都为1440,2.54厘米,左右边距都为1797,3.17厘米 
  385.      * @param wordPackage 文档处理包对象 
  386.      * @author myclover 
  387.      */  
  388.     public static void setMarginSpace(WordprocessingMLPackage wordPackage){  
  389.         setMarginSpace(wordPackage, "1440""1440""1797""1797");  
  390.     }  
  391.       
  392.     /** 
  393.      * 功能描述:设置字体的样式 
  394.      * @param fontFamily      字体类型 
  395.      * @param colorVal        字体颜色 
  396.      * @param hpsMeasureSize  字号大小 
  397.      * @param sTHint          字体格式 
  398.      * @param isBlod          是否加粗 
  399.      * @return                返回值:返回字体样式对象 
  400.      * @throws Exception 
  401.      * @author myclover 
  402.      */  
  403.     private static RPr getRPr(String fontFamily , String colorVal , String hpsMeasureSize , STHint sTHint , boolean isBlod){  
  404.         ObjectFactory factory = Context.getWmlObjectFactory();  
  405.         RPr rPr = factory.createRPr();  
  406.           
  407.         org.docx4j.wml.RFonts rf = new org.docx4j.wml.RFonts();  
  408.         rf.setHint(sTHint);  
  409.         rf.setAscii(fontFamily);  
  410.         rf.setHAnsi(fontFamily);  
  411.         rPr.setRFonts(rf);  
  412.           
  413.         BooleanDefaultTrue bdt = Context.getWmlObjectFactory().createBooleanDefaultTrue();  
  414.         rPr.setBCs(bdt);  
  415.         if(isBlod){  
  416.             rPr.setB(bdt);  
  417.         }  
  418.         org.docx4j.wml.Color color = new org.docx4j.wml.Color();  
  419.         color.setVal(colorVal);  
  420.         rPr.setColor(color);  
  421.   
  422.         org.docx4j.wml.HpsMeasure sz = new org.docx4j.wml.HpsMeasure();  
  423.         sz.setVal(new BigInteger(hpsMeasureSize));  
  424.         rPr.setSz(sz);  
  425.         rPr.setSzCs(sz);  
  426.           
  427.         return rPr;  
  428.     }  


  评论这张
 
阅读(3768)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016