上一篇的文章中我们介绍了在不使用第三方组件的方式,多种数据输出出到 word的方式,最后我们也提到了不使用组件的弊端,就是复杂的word我们要提前设置模板、编码不易控制、循环输出数据更是难以控制。接下来介绍用第三方组件Aspose.Words 的开发方式解决上面提到的问题。

[本次实例和上次实例的源代码,点击这里下载]

[Aspose.Words.dll 以及 使用手册由于太大传到csdn上了,点这里下载(免费)]

文章的梗概:

♦ Aspose.Words 的介绍

♦ 整体概括

♦ 支持的平台

      ♦ 支持的文件格式

♦ Aspose.Words 的基本使用介绍

      ♦ 创建一个word文档

♦ 加载一个已存在的word文档

♦ 保存word文档

♦ 控制word初始显示形式

♦ 创建书签

♦ 控制文字输出样式

♦ 利用标志位替换想要输出的内容

♦ word文档中添加水印

♦ 输出表格

♦ 综合实例介绍

♦ 运用书签输出表格

一、Aspose.Words 的介绍(更多介绍请到官网查看)

At a Glance

整体概括

An overview of the main conversion, rendering and reporting capabilities of Aspose.Words for .NET.

Aspose.Words在.NET版本下,其渲染和报告能力的主要转换的概述。

Supported Platforms

支持的平台

Aspose.Words for .NET supports the .NET framework (including C#, VB.NET, ASP.NET etc.), ASP, ColdFusion, Perl, Power Builder, PHP, Python and Mono.

Aspose.Words 在 .NET的版本支持.NET framework(包括C#, VB.NET, ASP.NET 等), ASP, ColdFusion, Perl, Power Builder, PHP, Python and Mono.

Supported File Formats

支持的文件格式

Aspose.Words for .NET supports the popular word (DOC, DOT, DOCM, DOTM, DOCX, DOTX, FlatOpc, FlatOpcMacroEnabled, FlatOpcTemplate, FlatOpcTemplateMacroEnabled, XML, ODT, OTT, OOXML, WordML, RTF, HTML, XHTML, MHTML & TXT) file formats that your business depend on. It also allows exporting or converting word documents to PDF, XPS, XamlFixed, XamlFlow, XamlFlowPack, EPUB, HTML, HtmlFixed, OpenXPS, PostScript, TXT and popular image/multimedia file formats including TIFF, JPG, PNG, BMP, SVG, EMF, SVG and SWF.

Aspose.Words 在 .NET的版本 支持主流的 word文件格式(DOC, DOT, DOCM, DOTM, DOCX, DOTX, FlatOpc, FlatOpcMacroEnabled, FlatOpcTemplate, FlatOpcTemplateMacroEnabled, XML, ODT, OTT, OOXML, WordML, RTF, HTML, XHTML, MHTML & TXT)。它也允许导出或者转换word文档到PDF, XPS, XamlFixed, XamlFlow, XamlFlowPack, EPUB, HTML, HtmlFixed, OpenXPS, PostScript, TXT和主流的文件或TIFF, JPG, PNG, BMP, SVG, EMF, SVG and SWF多媒体格式。

二、Aspose.Words 的基本使用介绍(更多的使用介绍请下载实例,参考使用说明文档或者点这里参考在线版使用文档)

下面的内容是介绍把数据输出到word的常用用法,而word怎么转换成pdf或者其他功能这篇文章将不做介绍,感兴趣可以参考使用文档。

首先我们要添加引用,找到"Aspose.Words.dll"组件的路径,添加此引用到项目中。

创建一个word文档

其中两个非常重要的对象,Document是文档对象,一切的word控制Document对象时最基础的。另一个就是DocumentBuilder对象,几乎所有的输出类型都是和它有关联。

  protected void CreateWord_Click(object sender, EventArgs e)
{
// 实例化 Aspose.Words.Document 对象
Document doc = new Document(); // 实例化 Aspose.Words.DocumentBuilder 对象 (后面几乎都是通过操作DocumentBuilder实现输出word内容的
DocumentBuilder builder = new DocumentBuilder(doc); // 往word中输入内容
builder.Writeln("这是创建的一个word文档"); // 保存到指定的路径
doc.Save("G:/CreateWord(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc");
}

加载一个已存在的word文档

可以直接加载项目中对应的word文件

 protected void LoadWord_Click(object sender, EventArgs e)
{
// 找到项目中的word模板 并转换成物理路径
var path = Server.MapPath("../Document/AsposeWord.doc"); // 实例化 Aspose.Words.Document 对象
Document doc = new Document(path); // 实例化 Aspose.Words.DocumentBuilder 对象 (后面几乎都是通过操作DocumentBuilder实现输出word内容的
DocumentBuilder builder = new DocumentBuilder(doc); // 往word中输入内容
builder.Writeln("这是加载的word文档"); // 保存到指定的路径
doc.Save("G:/LoadWord(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc");
}

或者把word文件转换成流的形式加载(相比之下上面那种形式用的更多)

 protected void LoadWord_Click(object sender, EventArgs e)
{
var path = Server.MapPath("../Document/AsposeWord.doc"); // 把文件转换成流的形式
Stream stream = File.OpenRead(path); Document doc = new Document(stream); // 用完关闭
stream.Close(); DocumentBuilder builder = new DocumentBuilder(doc); // 往word中输入内容
builder.Writeln("这是加载的word文档"); // 保存到指定的路径
doc.Save("G:/LoadWord(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc");
}

保存word文档

上面的word示例保存是服务器端指定的路径,其实不一定把word保存到指定的路径上,也可以直接把文件保存到客户端,即用户通过类似下载的形式保存。

参数中SaveFormat枚举是指保存的格式,有很多种,这里指定为word的doc格式;SaveType枚举指定保存类型,有SaveType.OpenInWord和OpenInBrowser两种,

如果保存方式指定为OpenInWord会在浏览器左下角提示word文档,而如果是OpenInBrowser会提示打来word文档。当然浏览器的不同,提示的信息也不一样。

 protected void LoadWord_Click(object sender, EventArgs e)
{
// 找到项目中的word模板 并转换成物理路径
var path = Server.MapPath("../Document/AsposeWord.doc"); // 实例化 Aspose.Words.Document 对象
Document doc = new Document(path); // 实例化 Aspose.Words.DocumentBuilder 对象 (后面几乎都是通过操作DocumentBuilder实现输出word内容的
DocumentBuilder builder = new DocumentBuilder(doc); // 往word中输入内容
builder.Writeln("这是加载的word文档"); // 文件保存到客户端
var fileName = "LoadWord(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc"; // 保存到客户端(保存的路径默认是客户端自己设置的下载路径,与服务器端无关)
doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInWord, Response);
//doc.Save("G:/LoadWord(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc");
}

控制word初始显示形式

可以控制初始显示的大小比例或者打开呈现的形式。

 protected void LoadWord_Click(object sender, EventArgs e)
{
// 找到项目中的word模板 并转换成物理路径
var path = Server.MapPath("../Document/AsposeWord.doc"); // 实例化 Aspose.Words.Document 对象
Document doc = new Document(path); // 实例化 Aspose.Words.DocumentBuilder 对象 (后面几乎都是通过操作DocumentBuilder实现输出word内容的
DocumentBuilder builder = new DocumentBuilder(doc); // 控制显示的形式
doc.ViewOptions.ViewType = ViewType.PageLayout; // 控制显示的大小比例此处为百分比,范围是0~100
doc.ViewOptions.ZoomPercent = ; // 往word中输入内容
builder.Writeln("这是加载的word文档"); // 文件保存到客户端
var fileName = "LoadWord(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc"; // 保存到客户端
doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInBrowser, Response);
//doc.Save("G:/LoadWord(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc");
}

创建书签

创建书签的含义,就和通过我的创建书签一样,到时候就可以快速的定位了。不过一般都是先通过word创建好书签,程序中就可以直接定位到书签的位置,并输出内容。

通过word创建书签:

用程序创建书签(一般都是先通过word创建书签,此处只是演示程序如何创建书签)

             Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// 创建书签
builder.StartBookmark("MyBookmark"); builder.Writeln("Text inside a bookmark.");
// 结束书签
builder.EndBookmark("MyBookmark");

控制文字输出样式

前面也说了DocumentBuilder对象,非常强大。原文是这样说的:

DocumentBuilder is a powerful class that is associated with a Document and allows dynamic document building from scratch or the addition of new elements to an existing document. It provides methods to insert text, paragraphs, lists, tables, images and other contents, specification of font, paragraph, and section formatting, and other things. Using DocumentBuilder is somewhat similar in concept to using the StringBuilder class of the .NET Framework.

DocumentBuilder是一个功能强大的类,与文档相关联的,允许动态文档建设从无到有或新的元素到一个现有的文件添加。它提供了方法来插入文字,段落,列表,表格,图片和其他内容,字体,段落格式规范,节,和其他的东西。使用DocumentBuilder有些类似的概念使用的StringBuilder类。NET框架。

当然了由于篇幅问题DocumentBuilder不能详细介绍了,更多细节还是参考说明文档吧。下面回归到文字输出控制的介绍:

 protected void CreateWordContainFontStyle_Click(object sender, EventArgs e)
{
var path = Server.MapPath("../Document/AsposeWord.doc");
Document doc = new Document(path);
DocumentBuilder builder = new DocumentBuilder(doc); Aspose.Words.Font font = builder.Font;
font.Size = ;
font.Bold = true;
font.Color = Color.Blue;
font.Name = "Arial";
font.Underline = Underline.Dash;
builder.Write("文字样式控制"); var fileName = "CreateWordContainFontStyle(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc";
doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInBrowser, Response);
}

效果如下:

利用标志位替换想要输出的内容

就和上篇文章差不多,利用占位符将我们要输出的内容替换掉。

下面演示中,定义了两个占位符 {name} 和{city}。当然不一定都是用'{}'符号包裹,只要不影响到word中其他内容用什么都可以,最好用特殊点的符号。

word如下:

 protected void ReplaceFlag_Click(object sender, EventArgs e)
{
var path = Server.MapPath("../Document/AsposeWord2.doc");
Document doc = new Document(path);
DocumentBuilder builder = new DocumentBuilder(doc); doc.Range.Replace("{name}", "Little-Ant", false, false);
doc.Range.Replace("{city}", "上海,徐汇", false, false); var fileName = "ReplaceFlag(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc";
doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInBrowser, Response);
}

效果如下:

word文档中添加水印

在Aspose.Words.Drawing命名空间下有一个Shape对象,通过控制这个对象可以输出类似水印的效果。

 protected void WaterMark_Click(object sender, EventArgs e)
{
var path = Server.MapPath("../Document/AsposeWord2.doc");
Document doc = new Document(path);
DocumentBuilder builder = new DocumentBuilder(doc); doc.Range.Replace("{name}", "Little-Ant", false, false);
doc.Range.Replace("{city}", "上海,徐汇", false, false); // 添加水印
InsertWatermarkText(doc, "http://www.cnblogs.com/littleAnt-strongPower/"); var fileName = "WaterMark(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc";
doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInBrowser, Response);
}
#region 1.5.1 添加水印 public void InsertWatermarkText(Document doc, string watermarkText)
{
// Create a watermark shape. This will be a WordArt shape.
// You are free to try other shape types as watermarks.
Shape watermark = new Shape(doc, ShapeType.TextPlainText);
// Set up the text of the watermark.
watermark.TextPath.Text = watermarkText;
watermark.TextPath.FontFamily = "Arial"; // 控制水印的大小
watermark.Width = ;
watermark.Height = ; // 倾斜度
watermark.Rotation = -; // Remove the following two lines if you need a solid black text.
// 控制水印的颜色
watermark.Fill.Color = Color.Gray; // Try LightGray to get more Word-style watermark
watermark.StrokeColor = Color.Gray; // Try LightGray to get more Word-style watermark // 水平居中
watermark.RelativeHorizontalPosition = RelativeHorizontalPosition.Page; // 垂直居中 注释后会在word正文的头部显示
//watermark.RelativeVerticalPosition = RelativeVerticalPosition.Page; watermark.WrapType = WrapType.None; // 文字的居中方式
watermark.VerticalAlignment = VerticalAlignment.Center;
watermark.HorizontalAlignment = HorizontalAlignment.Center; // Create a new paragraph and append the watermark to this paragraph. Paragraph watermarkPara = new Paragraph(doc); watermarkPara.AppendChild(watermark); // Insert the watermark into all headers of each document section. foreach (Section sect in doc.Sections)
{
// There could be up to three different headers in each section, since we want
// the watermark to appear on all pages, insert into all headers.
InsertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HeaderPrimary);
InsertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HeaderFirst);
InsertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HeaderEven);
}
} public void InsertWatermarkIntoHeader(Paragraph watermarkPara, Section sect, HeaderFooterType headerType)
{
HeaderFooter header = sect.HeadersFooters[headerType];
if (header == null)
{
// There is no header of the specified type in the current section, create it.
header = new HeaderFooter(sect.Document, headerType);
sect.HeadersFooters.Add(header);
}
// Insert a clone of the watermark into the header.
header.AppendChild(watermarkPara.Clone(true));
} #endregion

效果如下:

输出表格

这部分是重点,因为需求中经常会牵扯到输出表格的需求。输出表格的原理,就是先设置好表格的样式,然后"画"出来。实例中演示画一个含有表头5行4列的表格。

 protected void OutPutTable_Click(object sender, EventArgs e)
{
var path = Server.MapPath("../Document/AsposeWord.doc");
Document doc = new Document(path);
DocumentBuilder builder = new DocumentBuilder(doc); Aspose.Words.Font font = builder.Font;
font.Bold = false;
font.Size = ; // 设置表格的样式
builder.RowFormat.Borders.LineStyle = LineStyle.Single;
builder.RowFormat.HeightRule = HeightRule.Exactly;
builder.RowFormat.Alignment = RowAlignment.Center;
// 设置行高
builder.RowFormat.Height = ; // 设置单元格的高度 // 表格设置为4列 总宽度为492.7
double width1 = 92.7;
double width2 = ;
double width3 = ;
double width4 = ; // 设置每个单元格内的样式
builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
builder.CellFormat.VerticalMerge = CellMerge.First;
builder.CellFormat.HorizontalMerge = CellMerge.None; // 开始画单元格
builder.InsertCell();
// 设置单元格的宽度
builder.CellFormat.Width = width1;
// 单元格中的内容
builder.Write("姓名"); builder.InsertCell();
builder.CellFormat.Width = width2;
builder.Write("证件类型"); builder.InsertCell();
builder.CellFormat.Width = width3;
builder.Write("证件号码"); builder.InsertCell();
builder.CellFormat.Width = width4;
builder.Write("联系方式"); // 每一行结束一定要EndRow() 不然每一行的样式会受到影响
builder.EndRow(); // 输出4行空表格
for (var i = ; i < ; i++)
{
builder.InsertCell();
builder.CellFormat.Width = width1; builder.InsertCell();
builder.CellFormat.Width = width2; builder.InsertCell();
builder.CellFormat.Width = width3; builder.InsertCell();
builder.CellFormat.Width = width4; builder.EndRow();
} var fileName = "WaterMark(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc";
doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInBrowser, Response);
}

效果如下:

三、综合实例介绍

其实还有很多的东西需要演示,比如程序输出页眉、页尾等。但是篇幅实在是太大了,而且接下来还有内容。还是那句话,更多内容查看帮助文档,我在这里就是引导

大家怎么做,上面那几个实例掌握后,几乎就差不多了。下面是结合上面的实例进行演示。因为实际的业务需求并没有那么单一。

运用书签输出表格

书签很有用,可以让我们在程序中通过提前设置好的书签快速定位到要输出的位置。

下面是一个word文档,先设置好书签(直接在word文档上设置,前面已经说过说过如何设置输钱了书签),书签名为"UserInfoTable",具体如下:

 protected void OutPutTableWidthBookMark_Click(object sender, EventArgs e)
{
var path = Server.MapPath("../Document/Aspose.WordBookMark.doc");
Document doc = new Document(path);
DocumentBuilder builder = new DocumentBuilder(doc); Aspose.Words.Font font = builder.Font;
font.Bold = false;
font.Size = ; // 设置表格的样式
builder.RowFormat.Borders.LineStyle = LineStyle.Single;
builder.RowFormat.HeightRule = HeightRule.Exactly;
builder.RowFormat.Alignment = RowAlignment.Center;
// 设置行高
builder.RowFormat.Height = ; // 设置单元格的高度 // 设置每个单元格内的样式
builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
builder.CellFormat.VerticalMerge = CellMerge.First;
builder.CellFormat.HorizontalMerge = CellMerge.None; // 定义一个存储模板表头每个单元格宽度的集合
List<double> cellWidths = new List<double>();
// 根据集合列数
for (int i = ; i < ; i++)
{
// 参数依次是: "表格的索引"、"行的索引"、"列的索引"、"单元格内部索引"
builder.MoveToCell(, , i, ); //移动单元格 (代表着表头的cell依次移动)
double width = builder.CellFormat.Width;//获取单元格宽度
cellWidths.Add(width);
} // 直接定位到书签的位置 (根据书签名定位的)
builder.MoveToBookmark("UserInfoTable");
// 输出表格
for (var i = ; i < ; i++)
{
builder.InsertCell();
// 设置单元格宽度
builder.CellFormat.Width = cellWidths[];
builder.Write("张三"+i); builder.InsertCell();
builder.CellFormat.Width = cellWidths[];
builder.Write("身份证" + i); builder.InsertCell();
builder.CellFormat.Width = cellWidths[];
builder.Write("ABC" + i); builder.InsertCell();
builder.CellFormat.Width = cellWidths[];
builder.Write("" + i); builder.EndRow();
}
// 结束表格
builder.EndTable();
// 结束书签
builder.EndBookmark("UserInfoTable"); var fileName = "OutPutTableWidthBookMark(" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ").doc";
doc.Save(fileName, SaveFormat.Doc, SaveType.OpenInBrowser, Response);
}

效果如下:

总结

Aspose.Word 几乎可以解决我们各种复杂word文档的输出问题,以上的内容只是它的冰山一角,如果上面概括的内容满足不了你的需求,那么就看看帮助文档吧,或者联系我。

这部分代码你也可以通过开篇去下载。觉得有帮助就点击右下角"推荐"一个。

把数据输出到Word (组件形式)的更多相关文章

  1. 把数据输出到Word (非插件形式)

    项目开发过程中,我们要把数据以各种各样的形式展现给客户.把数据以文档的形式展现给客户相信是一种比较头疼的问题,如果没有好的方法会 使得我的开发繁琐,而且满足不了客户的需求.接下来我会通过两种开发方式介 ...

  2. pandas数据分析输出excel产生文本形式存储的百分比数据,如何处理?

    关键词: python.pandas.to_excel.文本形式存储的数据 需求描述: 我用 python pandas 写了数据统计与分析脚本,并把计算结果用 pandas 的 to_excel() ...

  3. C#仪器数据文件解析-Word文件(doc、docx)

    不少仪器数据报告输出为Word格式文件,同Excel文件,Word文件doc和docx的存储格式是不同的,相应的解析Word文件的方式也类似,主要有以下方式: 1.通过MS Word应用程序的DCOM ...

  4. Spark Structured Streaming框架(3)之数据输出源详解

    Spark Structured streaming API支持的输出源有:Console.Memory.File和Foreach.其中Console在前两篇博文中已有详述,而Memory使用非常简单 ...

  5. 【matlab】将matlab中数据输出保存为txt或dat格式

    将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...

  6. c#调用Aspose.Word组件操作word 插入文字/图片/表格 书签替换套打

    由于NPOI暂时没找到书签内容替换功能,所以换用Apose.Word组件. using System; using System.Collections.Generic; using System.C ...

  7. 将matlab中数据输出保存为txt或dat格式

    :FID= FOPEN(filename,permission) 用指定的方式打开文件 FID=+N(N是正整数):表示文件打开成功,文件代号是N. FID=-1            : 表示文件打 ...

  8. ffmpeg 从内存中读取数据(或将数据输出到内存)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  9. 《物联网框架ServerSuperIO教程》- 22.动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率

     22.1   概述及要解决的问题 设备驱动有DeviceDynamic接口,可以继承并增加新的实时数据属性,每次通讯完成后更新这些属性数据.原来是通过DeviceDynamic接口实体类反射的方式获 ...

随机推荐

  1. [osx] android studio下修改avd的hosts文件

    1. 启动avd 安装/启动avd就不说啦,可以直接在android studio里面操作的 2. 进入adb目录 当然是打开终端来敲命令啦. cd /Users/birdylee/Library/A ...

  2. rqt工具的使用

    安装rqt工具sudo apt-get install ros-indigo-rqtsudo apt-get install ros-indigo-rqt-common-plugins或者rosdep ...

  3. ORACLE设置id自增长

    1.创建序列create sequence sequence_userinfo start with 1 increment by 1 minvalue 1 maxvalue 999999 nocyc ...

  4. C# ComBox 垂直滚动条

    用到Combox控件两个属性: 1 MaxDorpDownItems 显示条数 2 IntegralHeight 设置 为false 例如:显示最多20条,超过20条显示垂直滚动条 this.comb ...

  5. Windows Azure Storage 之 Retry Policy (用来处理短暂性错误-Transient Fault)

    在使用Windows Azure Storage Service 的时候, 通常会遇到各种各样的问题. 例如网络连接不稳定,导致请求没有发出去.删除一个Blob Container 之后又立刻创建同名 ...

  6. Swift_UI_UIButton

    class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 1. 自定义 ...

  7. 初始angular框架(1)

    作为一个从来没有使用过的angular框架的小白  第一步肯定是 看文档!  没错就是看文档了!

  8. HTML、JavaScript之单双引号转义

    一.HTML : 双引号:" 单引号:&apos; 二.JavaScript: 双引号:\" 单引号:\'

  9. Struts2 基本配置

    Struts2是一个优秀的MVC框架,也是我比较喜欢用的框架.它个各种配置基本都可以集中在一个xml文档中完成.现在让我们看看如何简单几步实现常用功能. 一.搭建Struts2的开发环境 1)首先是利 ...

  10. CSS3 笔记四(Transforms/Transition/Animations)

    CSS3 2D Transforms Methods translate() rotate() scale() skewX() skewY() matrix() 1> translate() T ...