9.創建word模版,使用MergeFeild插入圖片


10.插入圖片示例
string tempPath = Server.MapPath("~/Docs/Temp/Template.doc");
string logoPath = Server.MapPath("~/Content/logo.jpg");
var doc = new Document(tempPath); //載入模板
//提供數據源
String[] fieldNames = new String[] { "logo", "Gender", "BirthDay", "Address","Logo" };
Object[] fieldValues = new Object[] { "張三", "男", "1988-09-02", "陝西咸陽",logoPath };
//增加處理圖片大小程序
//doc.MailMerge.FieldMergingCallback = new HandleMergeFieldInsertDocument();
//合並模版,相當於頁面的渲染
doc.MailMerge.Execute(fieldNames, fieldValues);
//在MVC中采用,保存文檔到流中,使用base.File輸出該文件
var docStream = new MemoryStream();
doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
return base.File(docStream.ToArray(), "application/msword", "Template.doc");
效果如下:

增加圖片大小處理的程序
Aspose.Word提供了一個類似Handler的功能,IFieldMergingCallback允許我們動態的處理MergeField
void IFieldMergingCallback.FieldMerging(FieldMergingArgs e){}
//處理文本
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args){}
//處理圖片
這里我們處理圖片寫了一個自定義的類實現
class HandleMergeFieldInsertDocument : IFieldMergingCallback
{
//文本處理在這里,如果寫在這一塊,則不起作用
void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
{
}
//圖片處理在這里
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
{
if (args.DocumentFieldName.Equals("Logo"))
{
// 使用DocumentBuilder處理圖片的大小
DocumentBuilder builder = new DocumentBuilder(args.Document);
builder.MoveToMergeField(args.FieldName);
Shape shape = builder.InsertImage(args.FieldValue.ToString());
// 設置x,y坐標和高寬.
shape.Left = 0;
shape.Top = 0;
shape.Width = 60;
shape.Height = 80;
}
}
}
效果如下:

11.向模版插入Html

這里的家鄉簡介使用html格式
12.插入html示例
string tempPath = Server.MapPath("~/Docs/Temp/Template.doc");
string descHtml = "";
//這里是html文本,由於太長略去
var doc = new Document(tempPath);
//載入模板
//提供數據源
String[] fieldNames = new String[] { "UserName", "Gender", "BirthDay", "Address","Desc"};
Object[] fieldValues = new Object[] { "張三", "男", "1988-09-02", "陝西咸陽", descHtml};
//增加處理html程序
doc.MailMerge.FieldMergingCallback = new HandleMergeFieldInsertHtml();
//合並模版,相當於頁面的渲染
doc.MailMerge.Execute(fieldNames, fieldValues);
//在MVC中采用,保存文檔到流中,使用base.File輸出該文件
var docStream = new MemoryStream();
doc.Save(docStream, SaveOptions.CreateSaveOptions(SaveFormat.Doc));
return base.File(docStream.ToArray(), "application/msword", "Template.doc");
如果不增加html的處理程序,默認以文本的輸出,這里我們寫一個自定義的處理類
class HandleMergeFieldInsertHtml : IFieldMergingCallback
{
//文本處理在這里
void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
{
if (e.DocumentFieldName.Equals("Desc"))
{
// 使用DocumentBuilder處理圖片的大小
DocumentBuilder builder = new DocumentBuilder(e.Document);
builder.MoveToMergeField(e.FieldName);
builder.InsertHtml(e.FieldValue.ToString());
}
}
//圖片處理在這里
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
{
}
}
IFieldMergingCallback在循環結構中同樣適用
小結:利用書簽加上標志位,利用自定義的IFieldMergingCallback靈活處理各種需求,后邊會繼續嘗試根據條件加載不同的模版
示例下載