设为首页 收藏本站
查看: 1236|回复: 0

[经验分享] SharePoint下利用DocX组件导出Word

[复制链接]

尚未签到

发表于 2015-9-29 12:05:11 | 显示全部楼层 |阅读模式
  平常开发时,或多或少都需要和Word打交道,特变是编辑、导出Word。
  利用DocX,开源的读写Word组件,可以快速帮助我们进行对Word的操作。
  DocX官方网站:http://docx.codeplex.com/


DocX主要功能


  • 在文档中(Word)插入,删除或者替换文本,支持所有的标准文本格式,如字体{Family,Size,Color},出体,斜体、下划线、高亮等。
  • 提供段落属性,你可以设置其对其方向,如从左到右,居中对齐等。
  • DocX同样支持对图片的操作、超链接、表格、页首、页眉等。
  • 最重要的一点DocX支持自定义文档属性(Custom Properties)
  最近要对一个SharePoint项目进行修改,客户希望对上报的文档审批结束后(如下图),可以导出Word,方便打印。对于OA系统而言,这是很重要的功能,客户催着急,所以需要快速开发。
DSC0000.png

创建文档属性
  DocX支持Load一个事先预定好的模版,通过对模版的修改即可创建出新的DocX类型对象,直接调用DocX.SaveAs方法即可对其进行保存到指定路径,当然你也可以保存到一个内存流中。具体的强大功能,可以参考DocX提供Example,写的非常详细。
  废话少说,我们开始吧。Word2010(07不确定,没用过)以上版本支持文档属性(Document Propery),文档属性对开发者来讲是一个非常重要的功能,你可以扩展Word文档的属性,我以Word 2013为例,打开Word 2013,单击左上角的文件,在新弹出的页面,选择属性à高级属性,如下所示:
DSC0001.png
  接着,新建文档属性,注意取一个合适的名称,别与已存在的属性重名,对于上图介绍的投诉审批,你可以新建以下文档属性:
DSC0002.png
  
  
  当创建完毕后,插入文档属性:切换到插入Tab,找到文档部件,单击文档部件选择域,再弹出的新窗体中,在左边域名选择DocProperty,在右边找到需要插入的属性插入到相应位置即可:
DSC0003.png
  这样可以快速创建一个标准模版,如下图。接下来的工作就是很简单了,依次在这几个“坑”中填充内容即可:
DSC0004.png

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中忘记设置了,那么什么也不发生,也就是没有生成可以导出的文档,不影响整个审批过程。
}

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


  • 导出查看Word
DSC0006.jpg

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120434-1-1.html 上篇帖子: SharePoint 2013 本地创建解决方案 下篇帖子: Moss/SharePoint 常见问题以及解决方法(持续更新中)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表