天天看点

[提供源码下载]在大型软件中用Word做报表:书签的应用(提供一种思路)

[提供源码下载]在大型软件中用Word做报表:

书签的应用(提供一种思路)

——通过知识共享树立个人品牌。

报表基本上在每一个项目中占有很大的比例,做报表也是我们开发人员必须过的坎,现在市面上各种类型的报表,我们到底应该如何选择呢?每一种报表都有他自己优秀的一面,我在项目开发中,一般用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);

                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);                    

                 }

                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);

        }

    }

    步骤四:查看效果,如下图所示:

本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321337,如需转载请自行联系原作者