Aspose 词合并

Aspose Word Merge

我正在使用 Aspose 库进行 Word 合并。 在以前版本的 Aspose 中,如果我们在合并时为字段添加空格,它不会将其视为空,但在升级到最新版本后,它会将空格视为空白并在设置为 ON 时删除这些字段.

对于我的情况,我想防止少数字段出现空格或空字段,但将其余字段删除。 我试图找到一个可以应用于字段级别的设置,以防止或删除空字段,但没有找到任何设置。 有什么办法可以实现吗?

如果段落只包含空格,它将被视为空的并被删除。因此,例如,如果您使用如下代码:

string[] fieldNames = new string[] { "FirstName", "MidName", "LastName" };
string[] fieldValues = new string[] { "Alexey", " ", "Noskov" };

Document doc = new Document(@"C:\Temp\in.docx");

doc.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveEmptyParagraphs;
doc.MailMerge.Execute(fieldNames, fieldValues);

doc.Save(@"C:\Temp\out.docx");

如果 MidName 合并字段放在一个单独的段落中,该段落将被删除为空。

但是,您可以使用 IFieldMergingCallback 解决此问题。例如,您可以在合并字段中放置隐藏文本,使段落不为空。例如看下面的代码:

string[] fieldNames = new string[] { "FirstName", "MidName", "LastName" };
string[] fieldValues = new string[] { "Alexey", " ", "Noskov" };

Document doc = new Document(@"C:\Temp\in.docx");

doc.MailMerge.FieldMergingCallback = new MergeWhitespaceCallback("MidName");
doc.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveEmptyParagraphs;
doc.MailMerge.Execute(fieldNames, fieldValues);

doc.Save(@"C:\Temp\out.docx");
private class MergeWhitespaceCallback : IFieldMergingCallback
{
    private readonly string[] mRetainParagraphsWithFields;

    public MergeWhitespaceCallback(params string[] retainParagraphsWithFields)
    {
        mRetainParagraphsWithFields = retainParagraphsWithFields;
    }

    public void FieldMerging(FieldMergingArgs args)
    {
        if (!string.IsNullOrEmpty(args.FieldValue.ToString().Trim()))
            return;

        if (!mRetainParagraphsWithFields.Contains(args.FieldName))
            return;

        DocumentBuilder builder = new DocumentBuilder(args.Document);
        builder.MoveTo(args.Field.Start);
        builder.Font.Hidden = true;
        builder.Write("<empty paragraph>");
    }

    public void ImageFieldMerging(ImageFieldMergingArgs args)
    {
        // Do nothing.
    }
}

稍后,您可以根据需要删除隐藏文本。

假设您实际上正在执行邮件合并(不仅仅是覆盖合并字段),您应该能够通过邮件合并主文档中的邮件合并字段编码来控制大部分(如果不是全部的话)。 在 PC 上,您可以使用合并域 \b and/or \f 开关来抑制空合并域之前或之后的 space。例如,假设您有:

«标题» «名字» «第二名» «姓氏»

但是 «SecondName» 有时是空的,您不希望在输出中留下两个 space。处理:

  1. select «SecondName» 字段并按 Shift-F9 以便您获得 {MERGEFIELD SecondName};
  2. 编辑字段代码,以便您最终得到-
    • {MERGEFIELD SecondName \b " "} 或
    • {MERGEFIELD SecondName \f " "}

取决于要抑制的 space 是在合并字段之后还是之前;

  1. 酌情删除前后相应的space 合并域;
  2. 将光标定位在此字段中的任意位置,然后按 F9 键进行更新。

注意 1: \b 和 \f 开关在 Macs 上或与其他开关一起使用时不起作用。在这种情况下,您需要使用和 IF 测试,按照 -

行编码
  • {IF{MERGEFIELD SecondName}<> "" " {MERGEFIELD SecondName}"} 或
  • {IF{MERGEFIELD SecondName}<> "" "{MERGEFIELD SecondName} "}

即便如此,您仍可以使用 \b 和 \f 开关来表示其他有自己开关的合并域。例如,假设您有四个字段 'Product'、'Supplier'、'Quantity' 和 'UnitPrice',如果 'Supplier' 不想输出 'Product'、'Quantity' 或 'UnitPrice' 字段字段为空。在这种情况下,您可以使用按以下行编码的字段:

{MERGEFIELD "Supplier" \b "{MERGEFIELD Product}→" \f "→{MERGEFIELD Quantity \# 0}→{MERGEFIELD UnitPrice \# "[=10=].00"}¶
"}

注2:上例的字段大括号对(即'{}')都是在文档中创建的,通过Ctrl-F9(Cmd-F9 on a Mac 或者,如果您使用的是笔记本电脑,则可能需要使用 Ctrl-Fn-F9);您不能简单地键入它们或从该消息中复制并粘贴它们。通过任何标准的 Word 对话框添加它们也不切实际。同样,人字形(即“« »”)是实际合并字段的一部分 - 您可以从 'Insert Merge Field' 下拉列表中插入(即您也不能从此消息中键入或复制并粘贴它们)。字段结构中表示的 space 都是必需的。您应该分别使用真正的制表符和 line/paragraph 换行符,而不是 →、↵ 和 ¶ 符号。

有关 Mailmerge 提示与技巧的更多信息,请参阅:https://www.msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html