在大型软件中用Word做报表: 书签的应用

本文转载:http://www.cnblogs.com/huyong/archive/2011/08/24/2151599.html

报表基本上在每一个项目中占有很大的比例,做报表也是我们开发人员必须过的坎,现在市面上各种类型的报表,我们到底应该如何选择呢?每一种报表都有他自己优秀的一面,我在项目开发中,一般用Grid++Report做报表,对于复杂的,量大的也用ExcelWord来做,大家也可以分享一下你们在项目中用到的报表软件!

现在有这样一个需求,比如有一个几十页的合同(合同内容每年会有所不同),合同中要填的数据(如:甲方、乙方什么的)从数据库中得到,各个页都有可能填写相关数据,最后生成合同打印出来,对于这样的需求,我想要用水晶报表等来做相当麻烦。

本文给大家提供一种思路,就是用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);
        }
    }

 

 

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

     

   

 

源码下载(下载前请评论与推荐下,感谢)

 

本文只是提供一种解决问题的思路,欢迎大家拍砖,也分享一下你们的经验。

时间: 2024-10-23 22:48:52

在大型软件中用Word做报表: 书签的应用的相关文章

在C#中用DirectShow做的媒体播放机

媒体 在C#中用DirectShow做的媒体播放机   概述:我的这个程序仅仅只是告诉大家如何用DirectShow 在C#中做一个播放机,世上并不能有太多的功能.也许你只要花上五分种就可以解决问题.是的如果你用的是IDE,我感保证一切都只是用你的鼠标在你的设计器中点点属性设置一些东西就可以简单的完成了.当然了还是要那么一点点编码的.至少是关于DirectShow 接口的.例如,视屏和声音. 程序中的小问题:1.如何从你的磁盘上打开媒体文件2.如何让工具条上的按钮起用和禁用3.如何设置状态栏的显

怎么用Word做组织结构图

  怎么用Word做组织结构图           1.如果你是Word 2007或Word 2010版本Office软件,那么直接菜单栏上面选择插入,SmartArt,然后选择组织结构图,插入就可以了.然后你可以自己在图片内容上继续创作,填写需要的内容信息. 2.如果是Word 2003,可以在工具栏或菜单栏,找到插入绘图,然后在绘图类型中找到组织结构图样式,然后插入即可.

用word做禁止吸烟标志牌全教程

  第一步:新建一个空白word文档,设置页面布局为横向. 第二步:插入一个文本框,我们要在里面写上文字和插入图片. 第三步:在其中一个文本框里插入我们用Photoshop做好的禁止吸烟的图片. 第四步:在另一个文本框里插入"艺术字" 第五步:调整"艺术字"的大小和样式.我这里加了一个倒影效果,你可以根据自己的喜好设置. 三联推荐:点击免费下载最新版WPS办公软件    >>查看更多电脑教程 第六步:设置插入图片和文字的文本框边框的样式为无线条,这样就没

c#-我在局域网中用SOCKET做了一个远程通信,怎么移植到广域网

问题描述 我在局域网中用SOCKET做了一个远程通信,怎么移植到广域网 我用C#在局域网中用SOCKET做了一个远程通信,怎么移植到广域网 解决方案 把端口映射到外网,,,,, 解决方案二: google "NAT" 解决方案三: 正常来说 你只需要把服务端代码移植到你的服务器那客户端的软件连接的IP修改成你服务器的IP即可.... 解决方案四: 局域网中使用的是受限的ip,不能穿过路由器你需要在路由器上做端口映射,并且对方要用你的路由器出口ip作为标的 解决方案五: 首先你得有一个拥

消灭bug秘籍 如何处理大型软件中的错误和异常

[51CTO.com快译] "我在测试中没有发现任何bug,这就意味着没有bug--对吗?"千万不要这样认为.由于大型软件的复杂程度很高,不管你做了多少测试,都不可能达到零bug的程度.因为你并不能揣测出用户的所有使用方式,因此,了解应用程序中错误和异常之间的差异,是非常重要的.为此,你要选择正确的方式来处理这些错误和异常,以积极的态度来确保应用的正常运行,对你的开发团队和最终用户负责. 测试的本身亦是个问题 即便你的测试是最彻底的,你依然只是在测试特定的情况,而且自己的偏好也在测试过

小脑袋360竞价软件告诉你做分类信息推广要线上线下结合

信息分类网,区域性强,方针清楚.我的信息分类网河南361℃就是对于郑州区域的,所以我关键推行郑州市. &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 推行办法:   1.QQ群推行.多加点本区域群,争夺加100个本地QQ群,或许更多,所以要多恳求QQ号,要几十个吧,多多益善.这其中有500人的大群,小群也有170-180人,则200×100 = 2万,被T就T了吧,横竖也发了. 小脑袋360竞价软件告诉你做分类信

大型软件回归测试方法研究

摘要:程序被修改后,要保证程序能正常运行并且修改不能给程序质量带来任何负面影响,回归测试是必要的.大型软件系统结构复杂,构成要素多,如何做到不遗漏功能点同时降低软件回归测试代价,本文结合业务规则模型.修改影响分析和成本风险管理等技术提出了一种自动化回归测试方法. 关键词:回归测试风险管理修改影响分析 1.引言 在软件测试过 程中,由于需要对软件进行修改,修改后的程序必须重新测试,以确保程序的修改是否达到了目的和是否引入了新的错误,这种测试就是回归测试.软件的变化可能 是源于发现了错误并做了修改,

怎么用word做印章和图章

怎么用word做印章和图章   首先打开word,在"插入选项卡"选择"形状"然后选择椭圆或者矩形,因为在word形状里面只有椭圆,如果需要绘制正圆,我们需要选择椭圆并按住Shift键即可,同样道理,输入正方形需要选择基本矩形并按住Shift键绘制.绘制完成后,将其形状填充设置为"无",将其形状轮廓设置为标准红色,然后选择轮廓粗细,比如6磅. 接着插入艺术字,选择适当艺术字样式,输入相应文字,然后在"艺术字样式"处选择文本效果

MAC中快速安装卸载大型软件的技巧

  MAC新手用户们一定都想知道MAC系统是不是也可以通过Setup.exe之类的文件进行软件安装.其实这个在MAC系统中是可以做到的,今天小编就给介绍一下这种方法吧,有兴趣的用户可以看看. 安装软件: 获得了光盘或DMG文件后我们挂接到系统上,进入镜像中很直观的就能找到安装程序用的执行文件,一般是不会找错的.(如下图) 之后会出现一些关于版权信息或安装配置的步骤,再下一步就开始安装了,在安装完成前的最后一步就是更新系统相关的配置信息,在Mac OS X上几乎所有大型软件的安装都会进行系统配置信