當合併列印中,如果有些欄位要做 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");
合併出來內容如下,
參考資料
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^