文档章节

SharePoint下利用DocX组件导出Word

 木宛城主
发布于 2015/03/02 19:39
字数 1666
阅读 6
收藏 0

平常开发时,或多或少都需要和Word打交道,特变是编辑、导出Word。

利用DocX,开源的读写Word组件,可以快速帮助我们进行对Word的操作。

DocX官方网站:http://docx.codeplex.com/

DocX主要功能

  • 在文档中(Word)插入,删除或者替换文本,支持所有的标准文本格式,如字体{Family,Size,Color},出体,斜体、下划线、高亮等。
  • 提供段落属性,你可以设置其对其方向,如从左到右,居中对齐等。
  • DocX同样支持对图片的操作、超链接、表格、页首、页眉等。
  • 最重要的一点DocX支持自定义文档属性(Custom Properties)

最近要对一个SharePoint项目进行修改,客户希望对上报的文档审批结束后(如下图),可以导出Word,方便打印。对于OA系统而言,这是很重要的功能,客户催着急,所以需要快速开发。

创建文档属性

DocX支持Load一个事先预定好的模版,通过对模版的修改即可创建出新的DocX类型对象,直接调用DocX.SaveAs方法即可对其进行保存到指定路径,当然你也可以保存到一个内存流中。具体的强大功能,可以参考DocX提供Example,写的非常详细。

废话少说,我们开始吧。Word2010(07不确定,没用过)以上版本支持文档属性(Document Propery),文档属性对开发者来讲是一个非常重要的功能,你可以扩展Word文档的属性,我以Word 2013为例,打开Word 2013,单击左上角的文件,在新弹出的页面,选择属性à高级属性,如下所示:

接着,新建文档属性,注意取一个合适的名称,别与已存在的属性重名,对于上图介绍的投诉审批,你可以新建以下文档属性:

 

 

当创建完毕后,插入文档属性:切换到插入Tab,找到文档部件,单击文档部件选择域,再弹出的新窗体中,在左边域名选择DocProperty,在右边找到需要插入的属性插入到相应位置即可:

这样可以快速创建一个标准模版,如下图。接下来的工作就是很简单了,依次在这几个“坑”中填充内容即可:

DocX逻辑实现

  • ComplaintModel属性的创建

首先我们约定,属性值不能包含换行(\r\n),否则插入含有换行符的属性值文本会和预想的有问题,那我们怎样去避免这个情况呢?很简单,假设某个属性的属性值包含换行符,我们不将其作为属性加入文档属性,而是直接Replace掉[]。有了这个约定后,我们接着创建我们对象(ComplainModel)的属性(注意,ComplainModel类型对象的属性必须要合之前创建的文档属性名称相同,原因稍后解释)

public class ComplainModel
        {
            //标题
            public string CTitle { get; set; }
            //投诉人
            public string Complainer { get; set; }
            //联系电话
            public string Mobile { get; set; }
            //分类
            public string Sort { get; set; }
            //投诉内容
            public string Complain { get; set; }
            //街道
            public string Stretch { get; set; }
            //备注
            public string Remark { get; set; }
            //一级审批者
            public string FirstApprover { get; set; }
            //一级审批内容
            public string FirstApproveText { get; set; }
            //二级审批者
            public string SecondApprover { get; set; }
            //二级审批内容
            public string SecondApproveText { get; set; }
            //三级审批者
            public string ThirdApprover { get; set; }
            //三级审批内容
            public string ThirdApproveText { get; set; }
        }
  • 接下来就是核心步骤了,我们Load预先定义好的Template(如果抛出异常,请加上EveryOne权限,然后去掉只读)。
DocX gDocument = DocX.Load(@"C:\Users\Administrator\Desktop\投诉审批表.docx");
  • 初始化ComplainModel
//创建CustomProperty对象
                        ComplainModel complainModel = new ComplainModel();
                        complainModel.CTitle = newItem["Title"].ToString();
                        complainModel.Complainer = newItem["Complainter"].ToString();
                        complainModel.Mobile = newItem["Tel"].ToString();
                        complainModel.Sort = newItem["ComplaintType"].ToString();
                        complainModel.Complain = newItem["ComplaintContent"].ToString();
                        complainModel.Stretch = newItem["RoadSelect"].ToString();
                        complainModel.Remark = newItem["Remark"].ToString();

                        //审批意见
                        complainModel.FirstApprover = newItem["FirstApprover"].ToString();
                        complainModel.FirstApproveText = newItem["FirstApproverText"].ToString();
                        complainModel.SecondApprover = newItem["SecondApprover"].ToString();
                        complainModel.SecondApproveText = newItem["SecondApproverText"].ToString();
                        complainModel.ThirdApprover = newItem["ThirdApprover"].ToString();
                        //还没持久化到数据库,所以直接 txtLevelThreeSuggestion.Text
                        complainModel.ThirdApproveText = txtLevelThreeSuggestion.Text;
  • 定义DocXHelper,他提供反射机制,给Load Template创建的新DocX对象添加文档属性
public static class DocXHelper
    {
        public static void AddCustomProperty<T>(this DocX docx, T source)
        { 
            Type type=typeof(T);
            //反射得到指定类型所有的非静态公开属性
            PropertyInfo[] props = type.GetProperties(BindingFlags.Instance|BindingFlags.Public);
            foreach (var prop in props)
            {
                //得到指定对象属性值
                var value = string.Format("{0}",prop.GetValue(source,null));
                //如果包含\r\n,直接无视,不加入文档属性中,而是直接Replace
                if (!value.Contains(Environment.NewLine))
                {
                    CustomProperty customProperty = new CustomProperty(prop.Name, value);
                    docx.AddCustomProperty(customProperty);
                    continue;
                }
                //把[]替换成指定属性值
                docx.ReplaceText(string.Format("[{0}]",prop.Name),value);
            }
        
        }

正如前面所说的那样,必须文档属性和ComplainModel对象属性名称一样,原因在于docx.AddCustomProperty方法内部(DocX组件是开源的,可以查看AddCustomPropery的实现),帮我们做了如下步骤:首先判断文档属性是否存在,如果是,删除它(Remove),之后创建一个新的文档属性(注意名称是相同的哦,否则会出现错误!未知的文档属性名称,具体可以拿个Word手动删除文档属性后,更新域),最后Update更新域,这样属性值就同步到了文档属性插入的相应位置了。

  • 全部代码如下
//创建投诉审批docx文档,以附件形式附加到Attachment栏
                    DocX gDocument;
                    try
                    {
                        gDocument = DocX.Load(@"C:\Users\Administrator\Desktop\武林管委会\投诉审批表.docx");
                        //创建CustomProperty对象
                        ComplainModel complainModel = new ComplainModel();
                        complainModel.CTitle = newItem["Title"].ToString();
                        complainModel.Complainer = newItem["Complainter"].ToString();
                        complainModel.Mobile = newItem["Tel"].ToString();
                        complainModel.Sort = newItem["ComplaintType"].ToString();
                        complainModel.Complain = newItem["ComplaintContent"].ToString();
                        complainModel.Stretch = newItem["RoadSelect"].ToString();
                        complainModel.Remark = newItem["Remark"].ToString();

                        //审批意见
                        complainModel.FirstApprover = newItem["FirstApprover"].ToString();
                        complainModel.FirstApproveText = newItem["FirstApproverText"].ToString();
                        complainModel.SecondApprover = newItem["SecondApprover"].ToString();
                        complainModel.SecondApproveText = newItem["SecondApproverText"].ToString();
                        complainModel.ThirdApprover = newItem["ThirdApprover"].ToString();
                        //还没持久化到数据库,所以直接 txtLevelThreeSuggestion.Text
                        complainModel.ThirdApproveText = txtLevelThreeSuggestion.Text;
                        //给docx文档添加CustomProperty对象
                        gDocument.AddCustomProperty<ComplainModel>(complainModel);

                        //从模版里取出的Docx文件另存为以流的形式
                        var stream = new System.IO.MemoryStream();
                        gDocument.SaveAs(stream);
                        //设置stream的位置为0
                        stream.Position = 0;
                        
                        //将得到的流附加到SharePoint List Attachment栏上
                        newItem.Attachments.Add("投诉审批表_导出打印.docx",stream.ReadFully());
                        //最后Update,执行工作流,执行审批归档
                        newItem.Update();
                        
                    }
                    catch (Exception ex)
                    {
                        
                      //如果模版文档不存在,或者List Attachment中忘记设置了,那么什么也不发生,也就是没有生成可以导出的文档,不影响整个审批过程。
                    }

查看生成的审批附件

在审批结束归档后,即可在附件栏查看到他,相关领导即可下载打印。

  • 导出查看Word

总结

DocX是一个非常方便的轻量级开源组件,可以方便操作Word,更强大的功能可以查看DocX Codeplex官网Example,更强大的功能等着你去探索。

 

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 222
码字总数 199010
作品 0
黄浦
私信 提问
java利用Freemarker模板生成docx格式的word文档

之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了。所以,后面需求必须是生成的docx文档,结果导出后正常才几M,昨...

lemonLove
11/24
0
0
开源Word读写组件DocX介绍与入门

今天向大家介绍一款.NET下的开源轻量级Word 2007/2010格式读写组件DocX,很小巧,能够满足大部分工作需求吧,最重要的是可以不用庞大的Office。 1.前言 读写Offic格式的文档,大家多少都有用...

分钟
2014/04/09
0
0
poi操作doc文档

http://haofenglemon.iteye.com/blog/568897 关键字:POI JAVA 批注 总页数 总字符数 一:认识POI Apache POI是一个开源的利用Java读写Excel、WORD等微软OLE2组件文档的项目。最新的3.5版本有...

yunlong090614
2015/01/30
2
0
python docx文档转html页面

说到word文档转html的,网上一搜一大把,各种在线word转html页面,使用起来也方便。但是在实际项目中要使用的话,需要自己开发,这里就提供一个简单的方法。 后缀 .doc 和 .docx 都是word文档...

Mr_zebra
11/20
0
0
openxml文件转换成docx

在处理word时候,poi太复杂,然后直接将docx模板转换成 openxml格式文件。使用jdom操作。处理成功。但是遇到一个问题,如果直接讲xml后缀改成docx,word打开的时候错误,如果是xml后缀,使用...

Amazon
2017/06/29
122
1

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
8
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
14
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
14
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
8
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部