2

我正在尝试遍历一个Dataset,使用 Aspose.Words Mail-Merge 功能为每个项目创建一个页面。下面的代码循环通过Dataset- 并将一些值传递给 Mail-Merge Execute 函数。

var blankDocument = new Document();
var pageDocument = new Document(sFilename);
...
foreach (DataRow row in ds.Tables[0].Rows){
    var sBarCode = row["BarCode"].ToString();
    var imageFilePath = HttpContext.Current.Server.MapPath("\\_temp\\") + sBarCode + ".png";

    var tempDoc = (Document)pageDocument.Clone(true);

    var fieldNames = new string[] { "Test", "Barcode" };
    var fieldData = new object[] { imageFilePath, imageFilePath };

    tempDoc.MailMerge.Execute(fieldNames, fieldData);

    blankDocument.AppendDocument(tempDoc, ImportFormatMode.KeepSourceFormatting);
}
var stream = new MemoryStream();
blankDocument.Save(stream, SaveFormat.Docx);
// I then output this stream using headers, 
// to cause the browser to download the document.

邮件合并项{ MERGEFIELD Test }Dataset. 但是,实际图像使用以下方法在所有页面上显示第 1 页的图像:

{ INCLUDEPICTURE "{MERGEFIELD Barcode }" \* MERGEFORMAT \d }

假设这是我的“条形码”字段数据:

c:\img1.png
c:\img2.png
c:\img3.png

本文档的第一页,c:\img1.png以文本形式显示“测试”字段。显示的图像是img1.png

但是第 2 页显示c:\img2.png为文本,但显示img1.png为实际图像。

有人对此有任何见解吗?

编辑:这似乎更像是一个Word问题。当我在 Word 中的Alt+F9模式之间切换时,图像实际上显示c:\img1.png为源。这就是为什么它会显示在每一页上的原因。

我已将其简化为:

{ INCLUDEPICTURE "{MERGEFIELD Barcode }" \d }

此外,在 Word 的邮件收件人列表中添加了该字段的测试数据。当我预览时,它不会拉入数据,改变图像。所以,这是根本问题。

4

2 回答 2

4

我知道这是个老问题。但是我还是想回答一下。

使用 Aspose.Words 很容易在执行邮件合并时插入图像。为此,您应该简单地使用具有特殊名称的合并字段,例如 Image:MyImageFieldName。 https://docs.aspose.com/words/net/insert-checkboxes-html-or-images-during-mail-merge/#how-to-insert-images-from-a-database

此外,不需要遍历数据集中的行并为每一行执行邮件合并。只需将整个数据传递给 MailMerge.Execute 方法,Aspose.Words 将为数据中的每条记录复制模板。这是此类模板的简单示例 模板截图

使用以下代码执行邮件合并后:

// Create dummy data.
DataTable dt = new DataTable();
dt.Columns.Add("FirstName");
dt.Columns.Add("LastName");
dt.Columns.Add("MyImage");
dt.Rows.Add("John", "Smith", @"C:\Temp\1.png");
dt.Rows.Add("Jane", "Smith", @"C:\Temp\2.png");

// Open template, execute mail merge and save the result.
Document doc = new Document(@"C:\Temp\in.docx");
doc.MailMerge.Execute(dt);
doc.Save(@"C:\Temp\out.docx");

结果将如下所示: 结果截图

披露:我在 Aspose.Words 团队工作。

于 2020-10-22T11:06:39.547 回答
2

如果这是 Word 进行输出(不确定 Aspose),这里可能会出现两个问题。

  1. INCLUDEPICTURE期望反斜杠加倍,例如,或(有点不太可靠)在该平台上"c\\img2.png"使用正斜杠或 Mac分隔符。":"不过,如果数据像您在此处所做的那样通过字段结果输入,则可能没问题。

  2. INCLUDEPICTURE自从微软在大约 10 年前出于安全原因修改了一堆字段行为以来,结果并没有“按设计”自动更新。如果您要合并到输出文档,您可能可以通过使用以下嵌套字段来解决这个问题:

    { INCLUDEPICTURE { IF TRUE "{ MERGEFIELD Barcode }" } }
    

    或删除结果文档中的字段,

    { IF { INCLUDEPICTURE { IF TRUE "{ MERGEFIELD Barcode }" } } {
    INCLUDEPICTURE { IF TRUE "{ MERGEFIELD Barcode }" } } }
    

所有需要以通常的方式{ }Ctrl+插入。 (不要问我在哪里记录了“TRUE”的这种用法 - 据我所知,它不是。)F9

于 2012-06-08T11:36:27.057 回答