目标:使用word的mailmerge功能,数据源是excel中的数据。这些资料在网上很少,只能自己慢慢测试了。
关于word的mailmerge功能:
word提供邮件的模板,可以选择各种数据源,比如数据库,excel等,然后群发(或打印、另存文件)邮件。
为了实现这个功能,我的程序要能做的是
1:打开word文件对象
2:设置mailmerge数据源:指定excel,指定查询语句,指定联接的列s
3:关闭保存
关于引用:
using word = microsoft.office.interop.word;
using system.reflection;
using system.diagnostics;
using system.io;
关于变量:word的com对象需要传入的参数定义
word.application wordapp = new microsoft.office.interop.word.application();
object missing = system.reflection.missing.value;
object falsevalue = false;
object truevalue = true;
关于处理
需要注意的是
1:打开word的方式
2:query的写法。类似于sql一般,比较好玩。
3:设置列,。设置之后,在word中可以看见这些列。
4:关闭word之后,还得再copy一次excel。直接生成之后的excel文件size暴涨,文件还打不开,所以覆盖一遍了之。原因不详。
private void button1_click(object sender, eventargs e)
{
object filename = copytemplatedoc();//copy doc in
word.document doc = wordapp.documents.open(ref filename, ref missing, ref falsevalue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref truevalue, ref missing, ref missing, ref missing);
object linkto = copyexceldata();//copy excel data
object query = "select * from `sheet1$`";//data from sheet1
object header = "name,category,address,content";//filed list
try
{
doc.mailmerge.createdatasource(ref linkto, ref missing, ref missing, ref header, ref falsevalue, ref query, ref missing, ref missing, ref truevalue);
doc.mailmerge.fields.add(wordapp.selection.range, "name");//add one filed to test
messagebox.show("success");
}
catch (exception ex)
{
messagebox.show(ex.message);
}
finally
{
doc.save();//save word
closeapp();//close word app
copyexceldata();//copy data again,*******************
}
}
关于关闭word对象
public void closeapp()
{
wordapp.documents.close(ref truevalue, ref missing, ref missing);
wordapp.quit(ref truevalue, ref missing, ref missing);
system.runtime.interopservices.marshal.releasecomobject(wordapp);
gc.collect();
//this.killexcelprocess();
}
还有两个工具函数不再赘述,用来copy文件并且返回文件名private string copyexceldata();和private string copytemplatedoc()。
新闻热点
疑难解答