本文转载:http://www.cnblogs.com/huyong/archive/2011/08/24/2151599.html
报表基本上在每一个项目中占有很大的比例,做报表也是我们开发人员必须过的坎,现在市面上各种类型的报表,我们到底应该如何选择呢?每一种报表都有他自己优秀的一面,我在项目开发中,一般用Grid++Report做报表,对于复杂的,量大的也用Excel和Word来做,大家也可以分享一下你们在项目中用到的报表软件!
现在有这样一个需求,比如有一个几十页的合同(合同内容每年会有所不同),合同中要填的数据(如:甲方、乙方什么的)从数据库中得到,各个页都有可能填写相关数据,最后生成合同打印出来,对于这样的需求,我想要用水晶报表等来做相当麻烦。
本文给大家提供一种思路,就是用Word来做这种类型的报表, 具体来说,就是用“书签”定位到Word中要填数据的地方,然后把数据填上去,再把word导出来,灵活应用,以不变应万变。
下面来看具体操作。
步骤一:准备好Word合同模板,在需要填写数据的地方插入书签(不明白的,可以下载源码后自己慢慢看)后保存应模板文件,如下图:
步骤二:新建一个WinForm项目,添加Word的Dll引用,如下图:
步骤三:编写代码,把相关数据写入到书签中,代码如下:
private void btnWriteDataToWord_Click(object sender, EventArgs e)
{
object missingValue = System.Reflection.Missing.Value;
object fileName = System.Windows.Forms.Application.StartupPath + "\\Test.doc";
if (System.IO.File.Exists(fileName as string))
{
object myTrue = false;
Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.ApplicationClass();
Microsoft.Office.Interop.Word.Document oDoc;
oDoc = oWord.Documents.Open(ref fileName, ref missingValue, ref myTrue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue);
MessageBox.Show(oDoc.Bookmarks.Count.ToString()); //得到word中的所有书签个数
//写入Word文档
object[] oBookMarks = { "出让方名称", "出让方通讯地址", "出让方邮政编码" };//Word中的书签
string[] sValues = { "测试出让方名称", "测试出让方通讯地址43号", "测试出让方邮政编码432123" }; //给书签的值
for (int iTemp = 0; iTemp < oBookMarks.Length; iTemp++)
{
Microsoft.Office.Interop.Word.Range tmpRng = oWord.ActiveDocument.Bookmarks.get_Item(ref oBookMarks[iTemp]).Range;
tmpRng.Text = sValues[iTemp].ToString(); //通过tmpRng.Text还可以得到标签处的数据,在这儿是设置它的数据
object oRng = tmpRng;
oDoc.Bookmarks.Add(oBookMarks[iTemp].ToString(), ref oRng);
}
object bSaveChange = true;
//如果"D:\Word"目录不存在,就创建
if (!Directory.Exists("D:\\Word"))
{
Directory.CreateDirectory("D:\\Word"); //创建目录
}
string guid = System.Guid.NewGuid().ToString();
object sFileName = @"D:/Word/出让合同" + guid + ".doc";
//把写好的合同另存为
if (oDoc.SaveFormat == (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument)
{
oDoc.SaveAs(ref sFileName, ref missingValue, ref myTrue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue);
}
oDoc.Close(ref bSaveChange, ref missingValue, ref missingValue);
oWord.Quit(ref bSaveChange, ref missingValue, ref missingValue);
}
else
{
MessageBox.Show("合同模板不存在!");
return;
}
//object tmp = "msr_01";
//Word.Range tmpRng = oWord.ActiveDocument.Bookmarks.get_Item(ref tmp).Range;
//tmpRng.Text = "China";
////由于附值以后书签自动消除,为了以后便于修改,需要把书签再自动生成一个
//object oRng = tmpRng;
//oDoc.Bookmarks.Add(tmp.ToString(), ref oRng);
//object bSaveChange = true;
//oDoc.Close(ref bSaveChange, ref missingValue, ref missingValue);
}
}
{
object missingValue = System.Reflection.Missing.Value;
object fileName = System.Windows.Forms.Application.StartupPath + "\\Test.doc";
if (System.IO.File.Exists(fileName as string))
{
object myTrue = false;
Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.ApplicationClass();
Microsoft.Office.Interop.Word.Document oDoc;
oDoc = oWord.Documents.Open(ref fileName, ref missingValue, ref myTrue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue);
MessageBox.Show(oDoc.Bookmarks.Count.ToString()); //得到word中的所有书签个数
//写入Word文档
object[] oBookMarks = { "出让方名称", "出让方通讯地址", "出让方邮政编码" };//Word中的书签
string[] sValues = { "测试出让方名称", "测试出让方通讯地址43号", "测试出让方邮政编码432123" }; //给书签的值
for (int iTemp = 0; iTemp < oBookMarks.Length; iTemp++)
{
Microsoft.Office.Interop.Word.Range tmpRng = oWord.ActiveDocument.Bookmarks.get_Item(ref oBookMarks[iTemp]).Range;
tmpRng.Text = sValues[iTemp].ToString(); //通过tmpRng.Text还可以得到标签处的数据,在这儿是设置它的数据
object oRng = tmpRng;
oDoc.Bookmarks.Add(oBookMarks[iTemp].ToString(), ref oRng);
}
object bSaveChange = true;
//如果"D:\Word"目录不存在,就创建
if (!Directory.Exists("D:\\Word"))
{
Directory.CreateDirectory("D:\\Word"); //创建目录
}
string guid = System.Guid.NewGuid().ToString();
object sFileName = @"D:/Word/出让合同" + guid + ".doc";
//把写好的合同另存为
if (oDoc.SaveFormat == (int)Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument)
{
oDoc.SaveAs(ref sFileName, ref missingValue, ref myTrue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue);
}
oDoc.Close(ref bSaveChange, ref missingValue, ref missingValue);
oWord.Quit(ref bSaveChange, ref missingValue, ref missingValue);
}
else
{
MessageBox.Show("合同模板不存在!");
return;
}
//object tmp = "msr_01";
//Word.Range tmpRng = oWord.ActiveDocument.Bookmarks.get_Item(ref tmp).Range;
//tmpRng.Text = "China";
////由于附值以后书签自动消除,为了以后便于修改,需要把书签再自动生成一个
//object oRng = tmpRng;
//oDoc.Bookmarks.Add(tmp.ToString(), ref oRng);
//object bSaveChange = true;
//oDoc.Close(ref bSaveChange, ref missingValue, ref missingValue);
}
}
步骤四:查看效果,如下图所示:
源码下载(下载前请评论与推荐下,感谢)
本文只是提供一种解决问题的思路,欢迎大家拍砖,也分享一下你们的经验。