开源Office Word——DocX
1.前言
请阅读前请看以下这位大神的文章
http://www.cnblogs.com/asxinyu/archive/2013/02/22/2921861.html
另附两个附件
1、DocX.DLL
2、DocX开源文档(因为原作者非常懒,开发文档才写到V1.0.0.10到,这但是我找了好久才找到的,打开可能会无法显示,鼠标右键,好像有个什么危害之类的选项,并非病毒,你懂的)
DocX原作者是,忘记叫什么名字了,给个连接吧,支持原著 http://docx.codeplex.com/
2、DocX主要长处
DocX组件眼下的最新版本号是V1.0.0.12,主要特点有:
1.支持在文件里插入、删除和替代文本,支持全部的文本格式,如字体,下划线,高亮等。
2.支持插入图片、超链接、表格、页眉页脚以及自己定义属性等。
3.支持类似JQuery的链式写法,非常方便编程开发。
4、不用在server上安装微软的office软件,便能够使用
5、轻量级,读写的速度快,我以前用过aspose、wps开发,没有做过详细測试分析,可是能够感觉出明显速度快非常多
3、DocX缺点
1、功能不够完好,可是算是能满足大众需求了
2、不技能office2003,仅仅支持office2007版本号以上打开,2013打开有些问题
4、我使用的开发环境
1、win7
2、vs2010
5、实现的功能——插入表格数据
今天,我们来讲一下怎样在word中的表格插入数据,这个应该也是相对来比較有用的功能,也算是为上面这位大神补充回善资料吧。
咳咳,我想在这里多说两牢骚话,首先是我实际项目中要用到,依据项目的需求死活没实用到Excel表格,不然我就用NPOI了,然后我是走了非常多弯路,从Aspose组件到wps组件,苦苦折腾了两周,最后放弃了他们,aspose太慢太臃肿,wps偶尔有bug(可能是我技术问题),最后还是经别人推荐用了这个轻量级的DocX组件,以下開始正题。
有经验的程序猿都知道,在表格的数据里,都会涉及到循环遍历,没错,我实现的这个功能也是要用以遍历的。
下面是代码、凝视:(说明一下我这个是在模板的基础上插入数据的)
string path;
stringdocName;
//首先用using把初始化载入模板的代码放到括号中
using (DocXdocx = DocX.Load(docPath)) //
{
//把文档中我做的字符串标记替换成DataTable里面的数据(如“Project_Name”)
docx.ReplaceText("Project_Name",dt.Rows[0]["ProjectName"].ToString());
docx.ReplaceText("Leader_Installer",dt.Rows[0]["Engineer"].ToString());
docx.ReplaceText("Production_Info",dt.Rows[0]["ModuleID"].ToString());
docx.ReplaceText("Project_Duration","暂Y无T");
docx.ReplaceText("Report_Date",DateTime.Now.ToString("yyyy-mm-dd hh:mm:ss"));
docx.ReplaceText("Current_Session",DateTime.Now.ToString("暂Y无T")); //实例化一个DocX中的一个Table类(插入表格数据用)
TablenewTable = docx.Tables[1];//这里取的是模板里的第二表格
//实例化一个DocX中的一个Formatting类(格式化数据用),并加入一些格式,字体为红色
Formattingformating =new Formatting();
formating.FontColor=System.Drawing.Color.Red;
//formating.Spacing = 200;
//循环遍历找到的表格
for(int i = 0; i < dt.Rows.Count; i++)
{
//在第i行中插入字段Name newTable.Rows[i].Cells[0].InsertParagraph(dt.Rows[i]["Name"].ToString(),false, formating);
//在第i行中插入字段TitlenewTable.Rows[i].Cells[1].InsertParagraph(dt.Rows[i]["Title"].ToString(),false, formating);
//在表格后追加一行
newTable.InsertRow();
}
docName= "/" + DateTime.Now.ToString("yyyy-mm-dd")+”Project Daily Report.docx";
path= Folders.GenerateFiles.Project + docName;
path= newWebService().Server.MapPath(path);
//另存为
docx.SaveAs(path);
}
上面是的写法尽管简便,可是有不足之处就是
Formatting类的格式控制不够全,不能控制行高,必须在Row类中才干控制行
经过研究,以下是还有一种写法,相对上面的样例的写法略微复杂一些,可是能更灵活的控制格式,
stringpath;
stringdocName;
using(DocXdocx = DocX.Load(docPath))
{
docx.ReplaceText("Project_Name",dt.Rows[0]["ProjectName"].ToString());
docx.ReplaceText("Leader_Installer",dt.Rows[0]["Engineer"].ToString());
docx.ReplaceText("Production_Info",dt.Rows[0]["ModuleID"].ToString());
docx.ReplaceText("Project_Duration","暂Y无T");
docx.ReplaceText("Report_Date",DateTime.Now.ToString("yyyy-mm-ddhh:mm:ss"));
docx.ReplaceText("Current_Session",DateTime.Now.ToString("暂Y无T")); //Dictionary<string,CustomProperty> lists = docx.CustomProperties;
TablenewTable = docx.Tables[1];
for(inti = 0; i < dt.Rows.Count; i++)
{
//获取第i行
Rowrow = newTable.Rows[i];
//设置第i行的高
row.Height= 30d;
//设置第i行第1列垂直居中
row.Cells[0].VerticalAlignment= VerticalAlignment.Center;
//获取第i行第一个段落,事实上差点儿相同也就是第i行第1列的单元格(段落在这里我也没有理解透,我想段落应该也是单独的一格子吧,相当于单元格中还包裹着一个段落)
Paragraphparagraph = row.Paragraphs[0];
//把数据库字段为Name的数据放到段落中去,然后加上红色
paragraph.Append(dt.Rows[i]["Name"].ToString()).Color(System.Drawing.Color.Red); //以下反复了,同理
row.Cells[1].VerticalAlignment= VerticalAlignment.Center;
Paragraphparagraph1 = row.Paragraphs[1];
paragraph1.Append(dt.Rows[i]["Title"].ToString());
paragraph1.Color(System.Drawing.Color.Red);
newTable.InsertRow();
} docName= "/"+ ProjectDaily Report.docx";
path= newWebService().Server.MapPath(path);
docx.SaveAs(path);
}
在看完代码后,你会发现,我这里省略了Formatting类,由于我发现用不上了,研究良久也没有发现要怎么样才干用上,郁闷中。。。有好方法的同学请指教。完,有什么不正确的地方望大家斧正
开源Office Word——DocX的更多相关文章
- Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...
- 老牌开源Office操作组件NPOI现已支持.NET Core
昨天在微信群里听到老牌Excel开发利器NPOI的作者瞿总说4.6.1版本的NPOI已经支持.NET Standard 2.0了,这也就意味着你可以在.NET Core中使用NPOI了. 作者:依乐祝 ...
- 使用ABAP编程实现对微软Office Word文档的操作
SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以".docx"结尾的微软Office word文档的读和写操作. 本文介绍了ABAP类CL_DOC ...
- C#操作Office.word(二)
在上一篇文章"C#操作Office.word(一)"中我们讲述了如何使用VS2010引用COM中Miscrosoft Word 14.0 Object Library实现创建文档, ...
- C#操作Office.word(一)
该文章主要是讲述如何使用VS2010创建word文档,因为在项目中我们可能需要点击一个按钮把数据库中的项目表单或图片显示到word文档中,因此该文章主要分析如何使用VS2010创建word文档并填写相 ...
- 解决 apache poi 转换 word(docx) 文件到 html 文件表格没边框的问题
一.起因 这几天在做电子签章问题,要通过替换docx文件中的占位符生成包含业务数据的合同数据,再转换成html文件,转换成pdf文件.遇到的问题是:通过apache poi转换docx到html时,原 ...
- XWPFDocument创建和读取Office Word文档基础篇(一)
注:有不正确的地方还望大神能够指出,抱拳了 老铁! 参考API:http://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDo ...
- 打开word文档时提示“Microsoft Office Word已停止工作”
我的电脑(Win10)有Office 2003和2013两个版本,可能由于之前超长待机等原因导致word 2003的文件(.doc)不能正常打开,没次都会提示“Microsoft Office Wor ...
- java 使用 POI 操作 XWPFDocumen 创建和读取 Office Word 文档基础篇
注:有不正确的地方还望大神能够指出,抱拳了 老铁! 参考 API:http://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDoc ...
随机推荐
- Net线程安全集合
在看Supersocket源码的时候发现很多地方都用到了我们不是很常用的线程安全集合,这些都是由net优化后的线程安全集合因此 应该比我们常规lock来效率好一些 比如说: 1 CurrentStac ...
- NFS服务器端配置
服务器端配置1 创建共享目录# mkdir /home/share# chown nobody.nogroup /home/share2 创建或修改/etc/exports 配置文件这个文件的内容非常 ...
- Delphi代码中嵌入ASM代码(简单明了)
前言 Delphi作为一个快速高效的开发平台,使用的人越来越多,但熟悉在Delphi代码中嵌入ASM代码的程序员我想不多,因为这方面的资料太少了,另一方面,它还需要有基本的汇编语言知识,关於汇编语言的 ...
- Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性加入图标
注:(图中每个条目和图标都是由代码动态生成) 代码动态布局,并须要为每个条目设置图标,此时用到了 android:drawableLeft="@drawable/icon" 父x ...
- c#Enum的用法
public enum ResType { Role = 0, Dept = 1, Group = 2, Site = 3, Org = 4, Sub=8 } 这里定义了一个enum ResTy ...
- HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)
题意: 给你一个图,找最短路.但是有个非一般的的条件:如果a,b之间有路,且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的一条路.问满足这样的路径条数 有多少,噶呜~~题意是搜了解题报 ...
- 《Head First 设计模式》学习笔记——模板方法模式
模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以详细方法以及详细构造函数的形式实现.然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...
- ACM-最小生成树之畅通project——hdu1863
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- KMP算法及KMP算法的应用(POJ2406)
///KMP算法#include<bits/stdc++.h> using namespace std; ]; void makeNext(const char P[],int next[ ...
- [C++]引用浅析
Date:2013-12-22 Summary: 引用数据类型的一些概念记录(沟通中提到引用必须结合语境才能知道说的是引用变量还是“引用”这一行为,再次提到引用指的一般是引用变量) Contents: ...