[.NET]透過 Aspose.Words 來做有RowSpan的合併列印

當合併列印中,如果有些欄位要做 RowSpan,要如何做呢?

我們要如何透過 Aspose.Words 的 MailMerge 來合併列印出以下的內容呢?

首先,我們要先製作範本,在Word中切到插入的Tab,然後從 快速組件 加入 MergeField 的功能變數,如下,

因為其中有個欄位需要格式化,所以按下 Alt+F9,加入要 三位一徹 的格式設定 \# #,###,如下,

再來就是在合併列印時,針對要合併的欄位設定 RowSpan,所以建立一個實作 IFieldMergingCallback 的 Class,如下,

internal class HandleC1MergeFieldAlternatingRows : IFieldMergingCallback
{
	private DocumentBuilder mBuilder;
	public void FieldMerging(FieldMergingArgs e)
	{
		if (mBuilder == null)
			mBuilder = new DocumentBuilder(e.Document);

		// 設定那個欄位要 RowSpan
		if (e.FieldName.Equals("信評"))
		{
			mBuilder.MoveToMergeField(e.DocumentFieldName);
			
			if (e.RecordIndex == 0)
			{
				mBuilder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.First;
				mBuilder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
				mBuilder.Write((string)e.FieldValue);
			}
			else
			{
				mBuilder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.Previous;
			}
		}
	}

	public void ImageFieldMerging(ImageFieldMergingArgs args)
	{
	}
}

Aspose.Words 的 MailMerge 如果要讓一列一列動態長出的話,只要在每列的前後加上 TableStart:DataTable的名稱及 TableEnd:DataTable的名稱 的 MergeField,如下,

所以測試的程式如下,

//準備測試資料
DataSet ds = new DataSet();
DataTable dt = new DataTable("C1");
dt.Columns.Add("身份別", typeof(string));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("ID", typeof(string));
dt.Columns.Add("VIP", typeof(string));
dt.Columns.Add("AUM", typeof(Int32));
dt.Columns.Add("關係", typeof(string));
dt.Columns.Add("原始客層", typeof(string));
dt.Columns.Add("調整客層", typeof(string));
dt.Columns.Add("付款者", typeof(string));
dt.Columns.Add("信評", typeof(string));
dt.Rows.Add("借款人", "夏大炮", "A1", "PM", 12000, "本人", "PM-1", "PM-2", "夏大炮", "SA");
dt.Rows.Add("保人1", "夏江", "A2", "SA", 300, "朋友", "PM-1", "PM-2", "夏大炮", "SA");
dt.Rows.Add("保人2", "夏春", "A3", "PA", 50, "朋友", "PM-1", "PM-2", "夏大炮", "SA");
ds.Tables.Add(dt);

Aspose.Words.License license = new Aspose.Words.License();
license.SetLicense("Aspose.Words.lic");
Aspose.Words.Document doc = new Aspose.Words.Document(@"D:\Aspose\c1.docx");
doc.MailMerge.FieldMergingCallback = new HandleC1MergeFieldAlternatingRows();
doc.MailMerge.CleanupOptions =  MailMergeCleanupOptions.RemoveUnusedRegions;
doc.MailMerge.ExecuteWithRegions(ds);
doc.Save(@"D:\Aspose\c1Result.docx");

合併出來內容如下,

參考資料

Merge Field Formatting

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^