做模板
图片字段,前面加上一个Image:
然后看上去就像这样:
合并
代码:其中有一个doc.MailMerge.FieldMergingCallback = new HandleMergeFieldInsertDocument();,是合并的事件,自己定义的
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "Word97-2003文件(*.doc)|*.doc|Word文件2007版(*.docx)|*.docx";
dialog.RestoreDirectory = true;
//点了保存按钮进入
string filename = "";
if (dialog.ShowDialog() == DialogResult.OK)
{
filename = dialog.FileName;
Document doc = new Document(Program.docTemplate);
//字段合并时的处理事件
doc.MailMerge.FieldMergingCallback = new HandleMergeFieldInsertDocument();
DataTable dt = (DataTable)dataGridView1.DataSource;
dt.TableName = "CardInfo";
doc.MailMerge.ExecuteWithRegions(dt); //执行区域合并,重复区域而不是整个文档
doc.Save(filename, filename.EndsWith("x") ? SaveFormat.Docx : SaveFormat.Doc);
if (MessageBox.Show("文件已经保存到:" + filename + "\n\n是否查看?", "保存成功", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
System.Diagnostics.Process.Start(filename);
}
}
合并事件
就是一个类
class HandleMergeFieldInsertDocument : IFieldMergingCallback
{
//文本处理在这里,如果写在这一块,则不起作用
void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
{
}
//图片处理在这里
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
{
if (args.DocumentFieldName.Equals("Pic"))//如果是Pic字段则处理图片
{
// 使用DocumentBuilder处理图片的大小
DocumentBuilder builder = new DocumentBuilder(args.Document);
builder.MoveToMergeField(args.FieldName);
Image img = ImageHelper.ImageFromBytes((byte[])args.FieldValue);
img = ImageHelper.ResizeImageToAFixedSize(img, 200, 25, ImageHelper.ScaleMode.MaxHW);
Shape shape = builder.InsertImage(img);
// 设置x,y坐标和高宽.
shape.Left = 0;
shape.Top = 0;
}
}
}