Aspose.Words使用教程之如何重命名合并字段

本文为Aspose.Words使用教程——重命名合并字段,什么是Aspose.Words呢?它是一款先进的文

档处理控件!有什么用呢?无需MS Word也可执行各种文档处理任务,包括文档的生成、修改、渲染、打印,文档格式转换和邮件合并等文档处理!

一个示例展示如何创建自己的合并字段类,代表一个在微软的Word文档中允许您获取或设置它的名称的合并字段。

Example

如何在一个文档里重命名字段。

C#

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

Visual Basic

Imports Microsoft.VisualBasic
  Imports System
  Imports System.Text
  Imports System.Text.RegularExpressions
  Imports Aspose.WordsImports 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>MERGEFIELD\s|)(\s|)(?<name>\S+)\s+")
  End Class
  End Namespace

查看更多Aspose.Words信息

时间: 2024-10-09 06:00:37

Aspose.Words使用教程之如何重命名合并字段的相关文章

iOS项目的完整重命名方法图文教程

链接地址:http://blog.csdn.net/abc4715760/article/details/42404039 前言:在iOS开发中,有时候想改一下项目的名字,都会遇到很多麻烦.直接改项目名吧,XCODE又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译不了.所以各位重命名项目时,记得先备份好一份噢.本文我会介绍一种方法,是我自己参考了很多资料得出的总结. 为什么说是完整呢?因为改名之后,你不会再看到任何有关于之前的项目名字.

转 iOS项目的完整重命名方法图文教程

前言:在iOS开发中,有时候想改一下项目的名字,都会遇到很多麻烦.直接改项目名吧,XCODE又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译不了.所以各位重命名项目时,记得先备份好一份噢.本文我会介绍一种方法,是我自己参考了很多资料得出的总结. 为什么说是完整呢?因为改名之后,你不会再看到任何有关于之前的项目名字. 本文会把一个项目名叫“test233333333”改成“test”. 1)打开项目: 以上是目前的项目结构. 2)选中项目

php nginx fastdfs 下载文件重命名

其实fdfs可以传入一个filename参数,指定文件名.. M00/00/00/fwAAAVGMateAafjTAAAABBW-xbM368.txt?filename=test.txt 这样下载时用户将得到test.txt文件名啦. ////以下内容仅供娱乐 首先搭好fastdfs 然后安装nginx 和 fastdfs-nginx模块 配置好nginx 这里网上有详细教程. 现在问题是,我们下载文件都是fdfs转换后的文件名,这对于用户来说是不友好的. 比如用户通过网站上传一个  小说.tx

教你在Win10电脑中给照片快速批量重命名的方法

我们在win10系统电脑的使用中,有时候在一些工作上的小气叫可以帮助我们在工作中做到事半功倍的效果,有小伙伴想要实现在win10中批量给图片重命名的操作方法,今天小编就来把方法分享给大家,一起来看一下教你在Win10电脑中给照片快速批量重命名的方法. 具体的方法和详细的步骤如下: 1.把所有需要重命名的照片放入同一个文件夹中,例如"2016年10月连云港旅游留念",全部选中这些照片,然后在第一张照片上点右键选择"重命名": 2.重命名为"2016年10月连

如何在 Linux 中批量移动、复制、追加和重命名文件

你可能已经知道,我们使用 mv 命令在类 Unix 操作系统中重命名或者移动文件和目录. 但是,mv 命令不支持一次重命名多个文件. 不用担心. 在本教程中,我们将学习使用 Linux 中的 mmv 命令一次重命名多个文件. 此命令用于在类 Unix 操作系统中使用标准通配符批量移动.复制.追加和重命名文件. 在 Linux 中一次重命名多个文件 mmv 程序可在基于 Debian 的系统的默认仓库中使用. 要想在 Debian.Ubuntu.Linux Mint 上安装它,请运行以下命令: $

利用Python批量重命名文件(给非技术人员的Python实例参考)

转自https://www.cnblogs.com/brucex/p/python-rename-example.html 这一回我需要完成的任务是把"照片"目录下面的数百个以"数字+中文姓名.jpg"的文件批量重命名,我需要把"数字"删除,保留"中文姓名.jpg",手工改名将是一件繁琐无趣的事.很自然我想到了我一直很喜欢的Python,当然,在这里除了Python还可以用Perl.Ruby.PHP.DOS Batch.VBS

批量重命名文件

今天突然想给桌面换张壁纸,打开原来的壁纸文件夹,很多当时觉得不错的壁纸现在已经不能看了,删掉一些之后,壁纸文件的名称变得断断续续.当时下载时是按照数字顺序命名的,现在看上去多少有些别扭.于是突发奇想,能否批量给某一目录下的文件重命名,比如我现在的壁纸文件夹. 首先我想到应该要打开一个目录,猜想是否有opendir之类的函数?果然有!在头文件<dirent.h>下面: DIR* __cdecl __MINGW_NOTHROW opendir (const char*); 返回值是DIR*,查看D

QT5 QtreeWidget 实现点击item事件以及右键菜单删除item 和 重命名item

1.new 一个QTreeWidget 对象,并设置头标签,和根节点(个人程序需要) QTreeWidget* treeWidget = ui.treeWidget;//我已经在ui设计师中拖了一个QTreeWidget QString headers; headers = "Name" ; treeWidget->setHeaderLabel(headers); QStringList rootText; rootText << "wells";

Python 批量重命名

#coding=utf-8 import os #1.获取要重命名的文件夹的名字 folder_name = input("输入文件夹名:") #2.获取制定的文件夹中的名字 file_names = os.listdir(folder_name) #3.重命名 for name in file_name: print name old_file_name = folder name+"/"+name new_file_name = folder_name+&quo