Aspose.Words使用教程之如何重命名合并字段
2015-08-27 16:15
597 查看
本文为Aspose.Words使用教程——重命名合并字段,什么是Aspose.Words呢?它是一款先进的文档处理控件!有什么用呢?
无需MS Word也可执行各种文档处理任务,包括文档的生成、修改、渲染、打印,文档格式转换和邮件合并等文档处理!
一个示例展示如何创建自己的合并字段类,代表一个在微软的Word文档中允许您获取或设置它的名称的合并字段。
Example
如何在一个文档里重命名字段。
using System;
using System.Text;
using System.Text.RegularExpressions;
using Aspose.Words;
using Aspose.Words.Fields;
namespace Examples
{
/// <summary>
/// Shows how to rename merge fields in a Word document.
/// </summary>
public class ExRenameMergeFields : ExBase
{
/// <summary>
/// Finds all merge fields in a Word document and changes their names.
/// </summary>
public void RenameMergeFields()
{
// Specify your document name here.
Document doc = new Document(MyDir + "RenameMergeFields.doc");
// Select all field start nodes so we can find the merge fields.
NodeCollection fieldStarts = doc.GetChildNodes(NodeType.FieldStart, true);
foreach (FieldStart fieldStart in fieldStarts)
{
if (fieldStart.FieldType.Equals(FieldType.FieldMergeField))
{
MergeField mergeField = new MergeField(fieldStart);
mergeField.Name = mergeField.Name + "_Renamed";
}
}
doc.Save(MyDir + "RenameMergeFields Out.doc");
}
}
/// <summary>
/// Represents a facade object for a merge field in a Microsoft Word document.
/// </summary>
internal class MergeField
{
internal MergeField(FieldStart fieldStart)
{
if (fieldStart.Equals(null))
throw new ArgumentNullException("fieldStart");
if (!fieldStart.FieldType.Equals(FieldType.FieldMergeField))
throw new ArgumentException("Field start type must be FieldMergeField.");
mFieldStart = fieldStart;
// Find the field separator node.
mFieldSeparator = fieldStart.GetField().Separator;
if (mFieldSeparator == null)
throw new InvalidOperationException("Cannot find field separator.");
mFieldEnd = fieldStart.GetField().End;
}
/// <summary>
/// Gets or sets the name of the merge field.
/// </summary>
internal string Name
{
get
{
return ((FieldStart)mFieldStart).GetField().Result.Replace("«", "").Replace("»", "");
}
set
{
// Merge field name is stored in the field result which is a Run
// node between field separator and field end.
Run fieldResult = (Run)mFieldSeparator.NextSibling;
fieldResult.Text = string.Format("«{0}»", value);
// But sometimes the field result can consist of more than one run, delete these runs.
RemoveSameParent(fieldResult.NextSibling, mFieldEnd);
UpdateFieldCode(value);
}
}
private void UpdateFieldCode(string fieldName)
{
// Field code is stored in a Run node between field start and field separator.
Run fieldCode = (Run)mFieldStart.NextSibling;
Match match = gRegex.Match(((FieldStart)mFieldStart).GetField().GetFieldCode());
string newFieldCode = string.Format(" {0}{1} ", match.Groups["start"].Value, fieldName);
fieldCode.Text = newFieldCode;
// But sometimes the field code can consist of more than one run, delete these runs.
RemoveSameParent(fieldCode.NextSibling, mFieldSeparator);
}
/// <summary>
/// Removes nodes from start up to but not including the end node.
/// Start and end are assumed to have the same parent.
/// </summary>
private static void RemoveSameParent(Node startNode, Node endNode)
{
if ((endNode != null) && (startNode.ParentNode != endNode.ParentNode))
throw new ArgumentException("Start and end nodes are expected to have the same parent.");
Node curChild = startNode;
while ((curChild != null) && (curChild != endNode))
{
Node nextChild = curChild.NextSibling;
curChild.Remove();
curChild = nextChild;
}
}
private readonly Node mFieldStart;
private readonly Node mFieldSeparator;
private readonly Node mFieldEnd;
private static readonly Regex gRegex = new Regex(@"\s*(?<start>MERGEFIELD\s|)(\s|)(?<name>\S+)\s+");
}
}
查看更多Aspose.Words信息
无需MS Word也可执行各种文档处理任务,包括文档的生成、修改、渲染、打印,文档格式转换和邮件合并等文档处理!
一个示例展示如何创建自己的合并字段类,代表一个在微软的Word文档中允许您获取或设置它的名称的合并字段。
Example
如何在一个文档里重命名字段。
using System;
using System.Text;
using System.Text.RegularExpressions;
using Aspose.Words;
using Aspose.Words.Fields;
namespace Examples
{
/// <summary>
/// Shows how to rename merge fields in a Word document.
/// </summary>
public class ExRenameMergeFields : ExBase
{
/// <summary>
/// Finds all merge fields in a Word document and changes their names.
/// </summary>
public void RenameMergeFields()
{
// Specify your document name here.
Document doc = new Document(MyDir + "RenameMergeFields.doc");
// Select all field start nodes so we can find the merge fields.
NodeCollection fieldStarts = doc.GetChildNodes(NodeType.FieldStart, true);
foreach (FieldStart fieldStart in fieldStarts)
{
if (fieldStart.FieldType.Equals(FieldType.FieldMergeField))
{
MergeField mergeField = new MergeField(fieldStart);
mergeField.Name = mergeField.Name + "_Renamed";
}
}
doc.Save(MyDir + "RenameMergeFields Out.doc");
}
}
/// <summary>
/// Represents a facade object for a merge field in a Microsoft Word document.
/// </summary>
internal class MergeField
{
internal MergeField(FieldStart fieldStart)
{
if (fieldStart.Equals(null))
throw new ArgumentNullException("fieldStart");
if (!fieldStart.FieldType.Equals(FieldType.FieldMergeField))
throw new ArgumentException("Field start type must be FieldMergeField.");
mFieldStart = fieldStart;
// Find the field separator node.
mFieldSeparator = fieldStart.GetField().Separator;
if (mFieldSeparator == null)
throw new InvalidOperationException("Cannot find field separator.");
mFieldEnd = fieldStart.GetField().End;
}
/// <summary>
/// Gets or sets the name of the merge field.
/// </summary>
internal string Name
{
get
{
return ((FieldStart)mFieldStart).GetField().Result.Replace("«", "").Replace("»", "");
}
set
{
// Merge field name is stored in the field result which is a Run
// node between field separator and field end.
Run fieldResult = (Run)mFieldSeparator.NextSibling;
fieldResult.Text = string.Format("«{0}»", value);
// But sometimes the field result can consist of more than one run, delete these runs.
RemoveSameParent(fieldResult.NextSibling, mFieldEnd);
UpdateFieldCode(value);
}
}
private void UpdateFieldCode(string fieldName)
{
// Field code is stored in a Run node between field start and field separator.
Run fieldCode = (Run)mFieldStart.NextSibling;
Match match = gRegex.Match(((FieldStart)mFieldStart).GetField().GetFieldCode());
string newFieldCode = string.Format(" {0}{1} ", match.Groups["start"].Value, fieldName);
fieldCode.Text = newFieldCode;
// But sometimes the field code can consist of more than one run, delete these runs.
RemoveSameParent(fieldCode.NextSibling, mFieldSeparator);
}
/// <summary>
/// Removes nodes from start up to but not including the end node.
/// Start and end are assumed to have the same parent.
/// </summary>
private static void RemoveSameParent(Node startNode, Node endNode)
{
if ((endNode != null) && (startNode.ParentNode != endNode.ParentNode))
throw new ArgumentException("Start and end nodes are expected to have the same parent.");
Node curChild = startNode;
while ((curChild != null) && (curChild != endNode))
{
Node nextChild = curChild.NextSibling;
curChild.Remove();
curChild = nextChild;
}
}
private readonly Node mFieldStart;
private readonly Node mFieldSeparator;
private readonly Node mFieldEnd;
private static readonly Regex gRegex = new Regex(@"\s*(?<start>MERGEFIELD\s|)(\s|)(?<name>\S+)\s+");
}
}
Imports Microsoft.VisualBasic Imports System Imports System.Text Imports System.Text.RegularExpressions Imports Aspose.Words Imports Aspose.Words.Fields Namespace Examples ''' <summary> ''' Shows how to rename merge fields in a Word document. ''' </summary> <TestFixture> _ Public Class ExRenameMergeFields Inherits ExBase ''' <summary> ''' Finds all merge fields in a Word document and changes their names. ''' </summary> <Test> _ Public Sub RenameMergeFields() ' Specify your document name here. Dim doc As New Document(MyDir & "RenameMergeFields.doc") ' Select all field start nodes so we can find the merge fields. Dim fieldStarts As NodeCollection = doc.GetChildNodes(NodeType.FieldStart, True) For Each fieldStart As FieldStart In fieldStarts If fieldStart.FieldType.Equals(FieldType.FieldMergeField) Then Dim mergeField As New MergeField(fieldStart) mergeField.Name = mergeField.Name & "_Renamed" End If Next fieldStart doc.Save(MyDir & "RenameMergeFields Out.doc") End Sub End Class ''' <summary> ''' Represents a facade object for a merge field in a Microsoft Word document. ''' </summary> Friend Class MergeField Friend Sub New(fieldStart As FieldStart) If fieldStart.Equals(Nothing) Then Throw New ArgumentNullException("fieldStart") End If If Not fieldStart.FieldType.Equals(FieldType.FieldMergeField) Then Throw New ArgumentException("Field start type must be FieldMergeField.") End If mFieldStart = fieldStart ' Find the field separator node. mFieldSeparator = fieldStart.GetField().Separator If mFieldSeparator Is Nothing Then Throw New InvalidOperationException("Cannot find field separator.") End If mFieldEnd = fieldStart.GetField().End End Sub ''' <summary> ''' Gets or sets the name of the merge field. ''' </summary> Friend Property Name() As String Get Return DirectCast(mFieldStart, FieldStart).GetField().Result.Replace("«", "").Replace("»", "") End Get Set ' Merge field name is stored in the field result which is a Run ' node between field separator and field end. Dim fieldResult As Run = DirectCast(mFieldSeparator.NextSibling, Run) fieldResult.Text = String.Format("«{0}»", value) ' But sometimes the field result can consist of more than one run, delete these runs. RemoveSameParent(fieldResult.NextSibling, mFieldEnd) UpdateFieldCode(value) End Set End Property Private Sub UpdateFieldCode(fieldName As String) ' Field code is stored in a Run node between field start and field separator. Dim fieldCode As Run = DirectCast(mFieldStart.NextSibling, Run) Dim match As Match = gRegex.Match(DirectCast(mFieldStart, FieldStart).GetField().GetFieldCode()) Dim newFieldCode As String = String.Format(" {0}{1} ", match.Groups("start").Value, fieldName) fieldCode.Text = newFieldCode ' But sometimes the field code can consist of more than one run, delete these runs. RemoveSameParent(fieldCode.NextSibling, mFieldSeparator) End Sub ''' <summary> ''' Removes nodes from start up to but not including the end node. ''' Start and end are assumed to have the same parent. ''' </summary> Private Shared Sub RemoveSameParent(startNode As Node, endNode As Node) If (endNode IsNot Nothing) AndAlso (startNode.ParentNode <> endNode.ParentNode) Then Throw New ArgumentException("Start and end nodes are expected to have the same parent.") End If Dim curChild As Node = startNode While (curChild IsNot Nothing) AndAlso (curChild <> endNode) Dim nextChild As Node = curChild.NextSibling curChild.Remove() curChild = nextChild End While End Sub Private ReadOnly mFieldStart As Node Private ReadOnly mFieldSeparator As Node Private ReadOnly mFieldEnd As Node Private Shared ReadOnly gRegex As New Regex("\s*(?<start>MERGEFI 97e7 ELD\s|)(\s|)(?<name>\S+)\s+") End Class End Namespace
查看更多Aspose.Words信息
相关文章推荐
- 用VBScript写合并文本文件的脚本
- oracle列合并的实现方法
- 使用BAT一句话命令实现快速合并JS、CSS
- SQL 合并多行记录的方法总汇
- C#生成Word文档代码示例
- C#自适应合并文件的方法
- jQuery窗口、文档、网页各种高度的精确理解
- 比较全的一个C#操作word文档示例
- GridView单元格合并
- 如何合并多个 .NET 程序集
- 使用UglifyJS合并/压缩JavaScript的方法
- 高性能WEB开发 JS、CSS的合并、压缩、缓存管理
- 多个js与css文件的合并方法详细说明
- 使用不同的方法结合/合并两个JS数组
- C#编程实现Excel文档中搜索文本内容的方法及思路
- 合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
- 用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
- oracle实现多行合并的方法
- php分割合并两个字符串的函数实例
- PHP合并静态文件详解