Docx4J知识积累.docx

上传人:b****6 文档编号:6979902 上传时间:2023-01-14 格式:DOCX 页数:27 大小:351.13KB
下载 相关 举报
Docx4J知识积累.docx_第1页
第1页 / 共27页
Docx4J知识积累.docx_第2页
第2页 / 共27页
Docx4J知识积累.docx_第3页
第3页 / 共27页
Docx4J知识积累.docx_第4页
第4页 / 共27页
Docx4J知识积累.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

Docx4J知识积累.docx

《Docx4J知识积累.docx》由会员分享,可在线阅读,更多相关《Docx4J知识积累.docx(27页珍藏版)》请在冰豆网上搜索。

Docx4J知识积累.docx

Docx4J知识积累

Docx4J概述:

Docx4j是Java操作office2007+中的Word、Excel、PPT的开源项目,其主要针对WordXML同时也可以处理Excel和PPT,比POI要强大很多.

Docx4J基于开源协议ASLv2。

 ASL是一个广泛适用于社区开源软件并被开源业界所认可的协议,该协议更有益于商业化产品的开发和再发行。

遵循ASL发行的代码和其它许可协议可以整合成为一个闭源的商业产品,然后被其它开发人员再次发行。

这不像开源许可协议。

"类GPL许可协议"(有些像GPL),通常情况下用于确保其它类似开发成员再发行已经被发布并修改的代码及其衍生代码的开源和可发布性。

Docx4J能做什么:

1.打开已存在docx(从文件系统、SMB/CIFS、使用VFS的WebDAV),pptx,xlsx

2.创建新的docx、pptx、xlsx

3.编程式地操作上面打开的文档

Docx4J特殊的功能支持:

1.模版替换;CustomXML绑定

2.生产/消费Word2007的xmlPackage(pkg)格式

3.作为docx保存docx到文件系统(zipped)或者保存到JCR(unzipped)

4.应用转换,包括常见过滤器

5.作为HTML或者PDF导出

6.比较文档、段落或者sdt(容控件)之间的差异

7.字体支持(字体替换及使用任何文档中嵌入的字体)

一些有用的:

Docx4J:

.docx4java.org/trac/docx4j

Samplecodes:

docx4j,pptx4j,xlsx4j,

生成docx文件(第一部分),

生成docx文件(第二部分),

使用docx4j编程式地创建复杂的Word(.docx)文档,

向Docx4j生成的word文档添加图片和布局--第一部分,

向Docx4j生成的word文档中添加布局--第二部分

docx4j--使用Java处理word2007(.docx)文档

Docx4J的使用

一打开文件/模板

Docx4J中,在存中操作的word文档是“WordprocessingMLPackage”类型的对象(本文以下简称包)。

在编辑一个word文档前,开发者需要选择:

创建一个新的空白包,并逐一将需要的容填充进去,或者打开一个已有的文档,并在里面添加/替换新的容。

前者思路比较简单,比较适合简单文档的创建。

但由于添加每条新容时,都需要手动进行设置其各项参数(比如表格的行宽、列宽、边框等),且添加修改复杂控件(公式、页眉页脚)的过程都比较繁琐,所以在创建格式复杂的文档时不是很建议。

后者需要事先制作一个模板文档,添加不同的占位符和各种模板信息,在准备上比前者复杂。

但也具有很多优点:

可以简化细节参数的调整(不需要手动调整表格、段落的具体细节参数)从而将精力集中到文档容上;复杂的文档部分(如公式、复选框等)可以直接从模板中读取,只需要在其基础上修改文字等容部分,而避开了繁琐的创建操作等。

在创建格式复杂的文档时,这个方法相比前者可以精简大量代码。

(本文之后将主要基于该方法进行说明)

二保存文件

当结束对包的编辑时,开发者可以选择多种方式进行保存。

三常用类型

Docx4J支持所有的docx容格式,其中比较常见的有如下几种:

1.Text:

基本的文字容

2.R:

文字格式信息

3.P:

段落,可以单独使用,也可以添加到单元格(Tc)等作为容

以下代码创建了新文本,并将其填到指定的单元格中

1.    /** 

2.     * 功能描述:

填充单元格容 

3.     * param tc          单元格对象 

4.     * param data        容 

5.     * param fontFamily  字体 

6.     * param fontSize    字号 

7.     * param isBlod      是否加粗 

8.     * param jcEnumeration 对齐方式 

9.     * author myclover 

10.     */  

11.    private static void fillCellData(Tc tc , String data , String fontFamily , String fontSize , boolean isBlod , JcEnumeration jcEnumeration){  

12.        ObjectFactory factory = Context.getWmlObjectFactory();  

13.        org.docx4j.wml.P p = (P) XmlUtils.unwrap(tc.getContent().get(0));  

14.        //设置表格容的对齐方式  

15.        setCellContentStyle(p , jcEnumeration);  

16.        org.docx4j.wml.Text t = factory.createText();  

17.        t.setValue(data);  

18.        org.docx4j.wml.R run = factory.createR();  

19.        //设置表格容字体样式  

20.        run.setRPr(getRPr(fontFamily, fontSize, isBlod));  

21.        TcPr tcpr = tc.getTcPr();  

22.        if(tcpr == null){  

23.            tcpr = factory.createTcPr();  

24.        }  

25.        //设置容垂直居中  

26.        CTVerticalJc valign = factory.createCTVerticalJc();  

27.        valign.setVal(STVerticalJc.CENTER);  

28.        tcpr.setVAlign(valign);  

29.        run.getContent().add(t);  

30.        p.getContent().add(run);  

31.    }  

32.      

33.    /** 

34.     * 功能描述:

填充单元格容,小五号,宋体,容居中 

35.     * param tc     单元格对象 

36.     * param data   数据 

37.     * param isBlod 是否加粗 

38.     * author myclover 

39.     */  

40.    public static void fillCellData(Tc tc , String data , boolean isBlod ){  

41.        fillCellData(tc, data, "宋体", "18", isBlod, JcEnumeration.CENTER);  

42.    }  

4.Tbl:

表格,每个表格含有一行或多行(Tr),每行有一个或者多个单元格(Tc)

Tc是表格用于存储信息的基本单位

以下代码创建了一个“rows行、cols列、行宽为widths“的空表格

1.public static Tbl createTable(int rows, int cols, int[] widths) {  

2.        ObjectFactory factory = Context.getWmlObjectFactory();  

3.        Tbl tbl = factory.createTbl();  

4.        // w:

tblPr  

5.        StringBuffer tblSb = new StringBuffer();  

6.        tblSb.append("

tblPr ").append(Namespaces.W_NAMESPACE_DECLARATION).append(">");  

7.        tblSb.append("

tblStyle w:

val=\"TableGrid\"/>");  

8.        tblSb.append("

tblW w:

w=\"0\" w:

type=\"auto\"/>");  

9.        //上边框双线  

10.        tblSb.append("

tblBorders>

top w:

val=\"double\" w:

sz=\"4\" w:

space=\"0\" w:

color=\"auto\"/>");  

11.        //左边无边框  

12.        tblSb.append("

left w:

val=\"none\" w:

sz=\"0\" w:

space=\"0\" w:

color=\"auto\"/>");  

13.        //下边框双线  

14.        tblSb.append("

bottom w:

val=\"double\" w:

sz=\"4\" w:

space=\"0\" w:

color=\"auto\"/>");  

15.        //右边无边框  

16.        tblSb.append("

right w:

val=\"none\" w:

sz=\"0\" w:

space=\"0\" w:

color=\"auto\"/>");  

17.        tblSb.append("

tblBorders>");  

18.        tblSb.append("

tblLook w:

val=\"04A0\"/>");  

19.        tblSb.append("

tblPr>");  

20.        TblPr tblPr = null;  

21.        try {  

22.            tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString());  

23.        } catch (JAXBException e) {  

24.            e.printStackTrace();  

25.        }  

26.        tbl.setTblPr(tblPr);  

27.        if (tblPr !

= null) {  

28.            Jc jc = factory.createJc();  

29.            //单元格居中对齐  

30.            jc.setVal(JcEnumeration.CENTER);  

31.            tblPr.setJc(jc);  

32.            CTTblLayoutType tbll = factory.createCTTblLayoutType();  

33.            // 固定列宽  

34.            tbll.setType(STTblLayoutType.FIXED);  

35.            tblPr.setTblLayout(tbll);  

36.        }  

37.        // 

tblGrid>

gridCol w:

w="4788"/>  

38.        TblGrid tblGrid = factory.createTblGrid();  

39.        tbl.setTblGrid(tblGrid);  

40.        // Add required 

gridCol w:

w="4788"/>  

41.        for (int i = 1; i <= cols; i++) {  

42.            TblGridCol gridCol = factory.createTblGridCol();  

43.            gridCol.setW(BigInteger.valueOf(widths[i - 1]));  

44.            tblGrid.getGridCol().add(gridCol);  

45.        }  

46.        // Now the rows  

47.        for (int j = 1; j <= rows; j++) {  

48.            Tr tr = factory.createTr();  

49.            tbl.getContent().add(tr);  

50.            // The cells  

51.            for (int i = 1; i <= cols; i++) {  

52.                Tc tc = factory.createTc();  

53.                tr.getContent().add(tc);  

54.                TcPr tcPr = factory.createTcPr();  

55.                tc.setTcPr(tcPr);  

56.                // 

tcW w:

w="4788" w:

type="dxa"/>  

57.                TblWidth cellWidth = factory.createTblWidth();  

58.                tcPr.setTcW(cellWidth);  

59.                cellWidth.setType("dxa");  

60.                cellWidth.setW(BigInteger.valueOf(widths[i - 1]));  

61.                tc.getContent().add(factory.createP());  

62.            }  

63.  

64.        }  

65.        return tbl;  

66.    }  

四指定格式创建文档

1.修改文档格式

页边距

67.    /** 

68.     * 功能描述:

设置页边距 

69.     * param wordPackage 文档处理包对象 

70.     * param top    上边距 

71.     * param bottom 下边距 

72.     * param left   左边距 

73.     * param right  右边距 

74.     * author myclover 

75.     */  

76.    public static void setMarginSpace(WordprocessingMLPackage wordPackage , String top , String bottom , String left , String right ){  

77.        ObjectFactory factory = Context.getWmlObjectFactory();  

78.        PgMar pg = factory.createSectPrPgMar();  

79.        pg.setTop(new BigInteger(top));  

80.        pg.setBottom(new BigInteger(bottom));  

81.        pg.setLeft(new BigInteger(left));  

82.        pg.setRight(new BigInteger(right));  

83.        wordPackage.getDocumentModel().getSections().get(0).getSectPr().setPgMar(pg);  

84.    }  

85.      

86.    /** 

87.     * 功能描述:

设置页边距,上下边距都为1440,2.54厘米 

88.     * param wordPackage 文档处理包对象 

89.     * param left   左边距 

90.     * param right  右边距 

91.     * author myclover 

92.     */  

93.    public static void setMarginSpace(WordprocessingMLPackage wordPackage , String left , String right ){  

94.        setMarginSpace(wordPackage, "1440", "1440", left, right);  

95.    }  

96.      

97.    /** 

98.     * 功能描述:

设置页边距,上下边距都为1440,2.54厘米,左右边距都为1797,3.17厘米 

99.     * param wordPackage 文档处理包对象 

100.     * author myclover 

101.     */  

102.    public static void setMarginSpace(WordprocessingMLPackage wordPackage){  

103.        setMarginSpace(wordPackage, "1440", "1440", "1797", "1797");  

104.    }  

文档只读

1.    /** 

2.     * 功能描述:

设置文档是否只读,包括容和样式 

3.     * param wordPackage  文档处理包对象 

4.     * param isReadOnly   是否只读 

5.     * throws Exception 

6.     * author myclover 

7.     */  

8.    public static void setReadOnly(WordprocessingMLPackage wordPackage , boolean isReadOnly)throws Exception{  

9.        byte[] bt = "".getBytes();  

10.        if(isReadOnly){  

11.            bt = "123456".getBytes();  

12.        }  

13.        ObjectFactory factory = Context.getWmlObjectFactory();  

14.        //创建设置文档对象  

15.        DocumentSettingsPart ds = wordPackage.getMainDocumentPart().getDocumentSettingsPart();  

16.        if(ds == null){  

17.            ds = new DocumentSettingsPart();  

18.        }  

19.        CTSettings cs = ds.getJaxbElement();  

20.        if(cs == null){  

21.            cs = factory.createCTSettings();  

22.        }  

23.        //创建文档保护对象  

24.        CTDocProtect cp = cs.getDocumentProtection();  

25.        if(cp == null){  

26.            cp = new CTDocProtect();  

27.        }  

28.        //设置加密方式  

29.        cp.setCryptProviderType(STCryptProv.RSA_AES);  

30.        cp.setCryptAlgorithmClass(STAlgClass.HASH);  

31.        //设置任何用户  

32.        cp.setCryptAlgorithmType(STAlgType.TYPE_ANY);  

33.        cp.setCryptAlgorithmSid(new BigInteger("4"));  

34.        cp.setCryptSpinCount(new BigInteger("50000"));  

35.        //只读  

36.        if(isReadOnly){  

37.            cp.setEdit(STDocProtect.READ_ONLY);  

38.            cp.setHash(bt);  

39.            cp.setSalt(bt);  

40.            //设置容不可编辑  

41.            cp.setEnforcement(true);  

42.            //设置格式不可编辑  

43.            cp.setFormatting(true);  

44.        }else{  

45.            cp.setEdit(STDocProtect.NONE);  

46.            cp.setHash(null);  

47.     

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1