首页 > 代码库 > 开源Office Word——DocX
开源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、不用在服务器上安装微软的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类,因为我发现用不上了,研究良久也没有发现要怎么样才能用上,郁闷中。。。有好方法的同学请不吝赐教。完,有什么不对的地方望大家斧正