平常开发时,或多或少都需要和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.TextcomplainModel.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,直接无视,不加入文档属性中,而是直接Replaceif (!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.TextcomplainModel.ThirdApproveText = txtLevelThreeSuggestion.Text;//给docx文档添加CustomProperty对象gDocument.AddCustomProperty<ComplainModel>(complainModel);//从模版里取出的Docx文件另存为以流的形式var stream = new System.IO.MemoryStream();gDocument.SaveAs(stream);//设置stream的位置为0stream.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,更强大的功能等着你去探索。

转载于:https://www.cnblogs.com/OceanEyes/archive/2013/06/11/DocX_Memo.html

SharePoint下利用DocX组件导出Word相关推荐

  1. Python3-word文档操作(十):利用docx库创建word文档,添加段落,添加表格,添加图片,设置文字粗体,斜体

    1 简介: 作为一个综合例子,本篇主要显示docx库的一些基本操作: 利用docx库创建word文档,添加段落,添加表格,添加图片,设置文字粗体,斜体. 2 举例: 对word文档进行属性的设置,以及 ...

  2. 利用docx4j完美导出word文档(标签替换、插入图片、生成表格)

    最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索. 1 ...

  3. Vue下使用docxtemplater-POI模式导出word

    快捷导航 需要用到的组件 核心代码 遇到的问题 相关链接 需要用到的组件 import docxtemplater from 'docxtemplater' import PizZip from 'p ...

  4. java利用poi模板导出word文件

    注意:  doc文件的读取,需要导入poi-scratchpad包: docx文件读取,需要导入poi-ooxml包: 一.引入pom <dependency><groupId> ...

  5. (14)Delphi下利用JVCL组件包快速实现——解释Pascal语言的脚本引擎

    文章目录 前言 一.效果展示 二.使用说明 1.引用控件 2.配置控件 3.核心代码 三.Demo源码下载(Delphi7+Delphi11下通过) 前言   有时候编程会遇到需要经常变动的代码,或者 ...

  6. 在ubuntu 下 利用svn命令导出 两个版本之间更改的文件

    2019独角兽企业重金招聘Python工程师标准>>> #!/bin/sh # dt=`date +%Y%m%d%H%M` FN='/data/svn_test/modifylist ...

  7. Aspose.Words利用Word模板导出Word文档

    今天工作中遇到了导出Word文档的问题,但是在搜索Aspose.Words 导出Word文档时发现网上的方法都是有头没尾的,有的只有一小段实例,让人看着摸不着头脑. 利用Aspose.Words导出W ...

  8. php aspose.words,C#_使用aspose.word 第三方的插件实现导出word,使用aspose.word 第三方的插 - phpStudy...

    使用aspose.word 第三方的插件实现导出word 使用aspose.word 第三方的插件实现服务器端无需安装office组件导出word的功能 #region 生成的excel文件命名和确保 ...

  9. 开源组件DocX导出Word

    1.使用Docx替换Word模板里书签里内容的一个方法 using Novacode;public class ExportWord{/// <summary>/// 导出word/// ...

  10. js 导出word 文档 doc docx

    在做项目时,要将富文本编辑器,或是html内容 导出为word. 先引入文件保存js <script src="FileSaver.js"></script> ...

最新文章

  1. pip install 及导出安装库,批量安装库
  2. JDBC与ORM发展与联系 JDBC简介(九)
  3. MySQL字符串截取函数
  4. 软件可靠性指标mtbf测试评估,软件可靠性评估.pdf
  5. 华为p10plus能用鸿蒙吗,华为P10/P10 Plus对比评测:自家兄弟大对决
  6. 嵌入式开发之davinci--- MSB和LSB
  7. ccna之交换机密码破解
  8. cdt规约报文用程序解析_程序员必备的学习笔记《TCP/IP详解(二)》
  9. Jmeter测试——java测试脚本编写
  10. window版本下载安装kafka和ZooKeeper并调试
  11. java基本数据类型转类对象
  12. 人物简介——奥古斯塔·德摩根
  13. 前端必备:六款CSS工具让代码充满魅力
  14. window.open无法打开新窗口
  15. 使用vue写一个计时器
  16. Struggling
  17. 讯飞语音合成 下载音频Java Demo
  18. NAS论文笔记:代理模型篇:NSGA Net V2: Evolutionary Multi-Objective Surrogate-Assisted Neural Architecture Sear
  19. 【沐风老师】教你在3dMax中使用Greeble插件结合变形修改器建模
  20. 阿里图标字体库的动态使用Android

热门文章

  1. python_入门初级
  2. [渝粤教育] 西南科技大学 现代企业管理 在线考试复习资料(2)
  3. 分享两个私藏的获取电子书资源方法
  4. 强化学习实战(七)【Windows安装星际争霸Ⅰ 强化学习环境教程】
  5. 对分类型变量,进行编码处理——pd.get_dummies()、LabelEncoder()、oneHotEncoder()
  6. height100%不能生效问题解决
  7. glog学习(二):glog主要接口和类分析
  8. Codeforces 988D Points and Powers of Two 【性质】【卡常】
  9. C/C++(变量作用域)
  10. windows下使用wineshark分析抓取本地回环包