首页 > 代码库 > 开源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/

2DocX主要优点

DocX组件目前的最新版本是V1.0.0.12,主要特点有:

1.支持在文件中插入、删除和替代文本,支持所有的文本格式,如字体,下划线,高亮等。

2.支持插入图片、超链接、表格、页眉页脚以及自定义属性等。

3.支持类似JQuery的链式写法,很方便编程开发。

4、不用在服务器上安装微软的office软件,便可以使用

5、轻量级,读写的速度快,我曾经用过asposewps开发,没有做过具体测试分析,但是可以感觉出明显速度快很多

3DocX缺点

1、功能不够完善,但是算是能满足大众需求了

2、不技能office2003,只支持office2007版本以上打开,2013打开有些问题

4、我使用的开发环境

1win7

2vs2010

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);
}




上面是的写法虽然简便,但是有不足之处就是

  1. 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类,因为我发现用不上了,研究良久也没有发现要怎么样才能用上,郁闷中。。。有好方法的同学请不吝赐教。完,有什么不对的地方望大家斧正