导出Excel相关(zz)

Web管理系统越来越受到大家的欢迎,尤其是导出Excel文件的功能更是其基本的功能。看了很多导出Excel文件的文章都是介绍导出的而没有介绍道出后的遇到的事项。比如说,我们需要多个Sheet页的Excel阿还有导出的Excel美观问题。下面我就为这两个问题做下说明,希望对大家有所帮助。

首先说说导出多Sheet页的Excel。方法很多,最基本的是微软提供的组件。但是我从不使用。原因有两点。

            第一    安全性。当使用微软的组件后,每当一个用户导出一个Excel文件时,就会在服务器的进程中增加一个Excel.exe的进程,而且不会自动中 止。当再有个用户导出Excel文件的时候又生成一个Excel.exe进程,注意是又生成一个。那么如此类推当多用户导出Excel文件的时候,那么就会在服务器上增加许多个Excel.exe进程,那么对于服务器来说这是不安全的。那么有很多人用这个方法那么就有解决办法,但是解决办法我不肯定。重新编写程序来杀死这个进程,那么会不会无缘无故杀死别的重名的进程呢?

            第二    美观。想要我们导出的Excel文件能够入目而不是那么苍白,就需要我们在样式上下功夫。就像我们的网页中的样式表一样。但是这样的工作量也会不少,当程序员在处理大量的数据的同时还要兼顾样式,反正对我来说比较头疼。

            综上两个原因我放弃了微软的方法。写出了自己在项目中用到的方法,来和大家分享,希望对大家的项目开发有所帮助。

            关键字:   C#,VBA,ASP.NET,WEB系统。

            一  保存数据到Excel

             我们知道数据库是我们存放数据的场所,我们要想得到数据库中的数据只要写几个简单的SQL语句就可以办到。在这里我们假设你已经具有一定的数据库知识,已经成功的从数据库中取得了数据。

             在成功取得数据库数据之后,我们要做的就是数据保存。这一回我们的数据不再是保存到数据库中而是保存到Excel文件中。你会问我这样能够做到嘛,经过程序证明,用程序来实现十分简单的事情。

               1.  定义一个模板连接

               定一个模版连接就像定义一个数据库连接一样,是为了告诉程序我们要找的数据源在什么地方。只有定义了连接,我们才能成功的找到模版。

                objConn = new System.Data.OleDb.OleDbConnection(

                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelFileName +

                 ";Extended Properties=Excel 8.0;");

                其中strExcelFileName是我们的模版文件名称。这样我们就完成了对数据库连接的定义。

                 2.  定义Command来执行插入指令

                 System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();

                 md.Connection = objConn;

                 写过SQL的人都知道要向数据库中新规一条数据用到最多的就是insert语句,使用这条语句我们可以成功的向数据库表中添加一条数据。在这里我们也利用insert语句来实现。

                  String commandText = “insert into [sheet$](a,b,c,d,e)” +”value(‘data1’,‘data2 ,‘data3 ,‘data4 ,‘data5);

                  其中[sheet$]是我们Excel模版中保存数据的Sheet名称。

                  (a,b,c,d,e是Excel模版中字段名称。       Data1是我们要保存数据的值。)

                  3.  命令执行

                  写过SQL语句后我们就可以执行存储操作了。

                   objCmd.CommandText = commandText;

                   objCmd.ExecuteNonQuery();

                   如果顺利做到以上几个步骤,Excel文件中就已经保存了我们插入的数据了。


                  二 Excel模版


                   Excel具有很强大的宏处理功能,在我们的日常办公中宏的应用已经比比皆是。拿我们公司以前的日报系统来说。就是一个经过简单宏处理的模版。在这里我们正是利用了Excel这个功能特性来实现的。

                       1.  录制宏

                       新建一个excel文件,alt+F11我们就可以看见宏编写的面板了。在这里编写一个宏程序是依靠VB语言环境的。要想用宏处理,我们必须把Excel软件的安全度设为高以下,如果设为高那么我们的宏程序将不会被执行。

                       2.  程序入口

                       当我们打开我们已经插入好数据的Excel文件的时候,需要立刻执行宏命令,只有这样经过处理的数据格式才是我们最终想要的看见的和有用的数据。

                       VBA为我们提供了一个函数,可以做到。

                       Public Sub Auto_Open()这个函数在我们打开文件后选择宏命令执行后将被立刻执行,所以我们使用这个函数作为我们的程序入口。

                       3.  向Excel中任意单元格赋值

                       Set curCell = Worksheets("Sheet1”row,col)

                        Worksheets("Sheet2").Cells(row,col).Value = curCell.Value(Row代表行数,col代表列数)

                       curCell是从Excel文件中Sheet1中取得的数据,然后向Sheet2中赋值。通过这样简单的语句处理我们就可以从临时的Sheet页中把数据取出来然后在向最终显示的Sheet页中写入值。我们只要重复这样的采集到写入的操作,就可以完成操作。

                       4.  Sheet页隐藏

                       一般我们可以利用最为简单的公式来确定我们的模版到底需要几个Sheet页来完成我们的多Sheet页导出的功能。

                       假设我们最后希望呈现给用户的Sheet页数是N ,那么我们至少让我们的模版需要2N个Sheet页来完成我们的程序。

                       Worksheets("Groups").Visible = false;

                       通过这样简单的命令我们就可以让一个名为Groups的Sheet页隐藏起来,我之所以用到隐藏是因为有一部分Sheet页我们是用来存储数据用的,就向数据库中的表一样只是一个数据结构并不是我们最终想要得到的数据。只有经过程序的处理过的数据才是我们最后想要得到的。所以这部分Sheet页是我们不想呈现个用户的我们需要把他们隐藏起来。

                       5.  Excel式样外观

                       我们希望最后呈现个用户的Excel能够拥有赏心悦目的外观,那么我们就需要像处理网页的样式表一样来为Excel增加外观。在这里我想介绍一个容易上手的方法。利用自动录制宏的功能来实现。

                       当我们要自动宏录制的时候,我们选择工具菜单下的录制新宏。然后我们可以在Excel文件中设置我们的字体,颜色,背景等等。在处理完毕之后我们所需要的VB代码也就制作完成了。同样通过ALT+F11我们就可以看见我们想要的样式代码了。这样的设置的好处在于,不会出错完全不用编写代码,而且效率十分高。 经过以上步骤我们的宏模版就编写完毕了。就可以把它放置在服务器上等待拷贝下载了。

                        三     客户端下载和临时文件删除
                       编写好的宏模版放置在服务器上,当用户想要下载时,我们不会让用户直接去下载这个模版,因为宏模版是让所有用户使用的,所以我们需要提供这个模版的拷贝让每个用户下载。

                       1.  文件拷贝

                       File.Copy(sourcefile,newfile);

                       使用文件拷贝函数可以轻而易举的办到。在这里不再多说,但是值得注意的是我们拷贝的Excel文件也是放在服务器上的,这就存在了一个命名的问题的。如果多用户同时操作的时候,都会生成各自的模版文件的复制文件。当这些文件的名称相同的时候,将会出现异常。因为在同一个目录下不能同时拥有重名的文件。要想解决这个问题我们可以采纳以下2个方案

                       第一 利用SessionID来命名文件名称。IIS为每个使用用户提供不同的SessionID来执行操作。我们可以利用这一点来命名。

                       第二 利用GUID来命名文件名称。

                       任一选择其中一种方法我们就可以保证拷贝出来的文件具有独一无二的文件名,可以提供给用户下载。

                       2.  文件下载

                       利用流媒体的形式向客户端提供输出流,提供下载。

                       context.Response.AppendHeader("Content-Disposition","filename=" + strFileName);

                        context.Response.ContentType = "application/vnd.ms-excel";   context.Response.WriteFile(strExcelFileName);

                       3.  临时文件删除

                       当用户下载完毕之后,存放在服务器上的模版文件将不在有任何意义。为了减轻服务器端的压力我们需要把他们删除。删除他们也十分简单利用File.Delete()函数就可以办到。到这里我们的全部工作都已经完成,打开下载后的EXCEL文件看看最后的成果吧。

posted @ 2007-07-26 15:39  stu_acer  阅读(474)  评论(0编辑  收藏  举报