KiMoGiGi 技术文集

不在乎选择什么,而在乎坚持多久……

IT博客 首页 联系 聚合 管理
  185 Posts :: 14 Stories :: 48 Comments :: 0 Trackbacks

文章的使用范围

   运行环境 .net Framework 1.1 ,Excel 2003

   开发语言: C#

 

目录

1.0 简要说明

    2.0 Excel 编程模型的说明。

3.0 Excel 进程在程序中处理。

4.0 Excel 编程中常用一些功能。

               4.1 给单元格赋值

               4.2 Excel 报表添加图片

               4.3 报表的打印

               4.4 通过服务在系统间传输报表

           5.0 总结。

简要说明

         报表对于好多程序员来讲是个头疼的事情。在开始使用了 Report Server 生成报表的服务,但在导出成 Excel 文件的时候,样式总是 the See is Not the get 。后来慢慢的接触到用 Excel dll 直接生成报表。就做了一个 Web 服务专门生成 Office 报表。从实际的运行情况下,总体来讲还是可以的。但是还是有一些问题

     1 .在编辑和部署的环境中必须安装 office 这样给系统增加了成本 。(还好政府采购中有 Office ,无锡的永中 Office 不知道能不能提供类似的功能)

2 报表中显示内容的单元格 只能通过已经处在的单元格拆分和合并得到的,这样在

报表的形式上有变化的话, 整个报表的显示内容的单元格的位置也需要同时发生改变。这样给编程带来不小的挑战。

         3 .在 Web 系统和 Web 服务中 Excel 进程杀不掉的问题。

但是在固定格式的报表方面还是很方便的,可以将报表的放置数据的位置和取数据的原则保存起来就可以自动的生成报表,在添加新的报表的时候也不要重新的修改的程序,只要提供上述的信息就可以拉。下面是我对于 Excel 编程方面的一些经验的总结。

 

Excel 编程模型的说明


framework.JPG

在这里 ,就大概描述了在 Excel 编程中常用的对象的层次关系。

Excel Application   代表整个 Microsoft Excel 应用程序,

WorkBook            代表 Microsoft Excel 工作簿

Range                    代表某一单元格、某一行、某一列、某一选定区域(该区域可包含一个或若干连续单元格区域),或者某一三维区域。

Areas                       选定区域内的子区域或连续单元格块的集合。

Borders                 代表对象的边框。

Characters             代表包含文本的对象中的字符。可用 Characters 对象修改包含在完整文本字符串中的任意字符序列。

Font                        包含对象的字体属性(字体名称、字体大小、字体颜色等)。

ListRow                 代表列表对象中的一行。

Errors                     表示区域的电子表格错误。

 

Excel 进程在程序中处理

Excel 编程中,一开始的时候需要生成一个 Excel 进程。我们往往在生成报表后将其删除掉 ,在 Web 程序中 往往 dot net 的垃圾回收器不能够将 Excel 进程回收。下面是我写的一段代码

            //create the Application of Excel Note : record the Process's Create Period

            Process_BeforeTime= DateTime.Now ;

            Excel.Application oXL=new Excel.ApplicationClass();

            Process_AfterTime =DateTime.Now ;

 

                      。。。。。。。。 the report Created

     

                    // call the way to kill the Process ,next is  the Way to Kill Excel Process

 

              /// <summary>

              /// the ways to Kill the Excel Process which In the period Between  Process_BeforeTime and Process_AfterTime

              /// </summary>

              /// <param name="Process_BeforeTime">the time before The Excel Process Created</param>

              /// <param name="Process_AfterTime">the time after the Excel Process Created </param>

              public static void KillExcelProcess(DateTime Process_BeforeTime,DateTime Process_AfterTime)

              {

                    foreach(Process pro in System.Diagnostics.Process.GetProcessesByName("EXCEL"))

                     {

                            DateTime ProcessBeginTime =pro.StartTime ;

                            if ((ProcessBeginTime>=Process_BeforeTime)&&(ProcessBeginTime<=Process_AfterTime))

                            {

                                   pro.Kill();

                            }

                     }

              }

 

  上面的一段代码在一般的情况下是没有问题 ,在系统运行时是可以有效地删除 Excel 进程。

但在同一时刻用户过多的情况下,可能出现误删的情况。也有其他的一种方法来解决 Excel 进程的问题,在系统初始化时,先 New 数个 Excel 对象,建立一个池,供用户循环使用。

(现在还没有实践过)

 

Window 程序里面可以不考虑 Excel 进程的问题 ,在零引用的情况下 ,垃圾回收器能回收 Excel 进程。

 

 

Excel 编程中常用一些功能

4.1 给单元格赋值

Excel._Worksheet oSheet;

oSheet =(Excel._Worksheet)oWB.Sheets.get_Item(1);

    Excel.Range oRg=null ;

    oRg=oSheet.get_Range("C2",Type.Missing);

oRg.Value2 =UserName;

    oRg.Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle=Excel.XlLineStyle.xlContinuous;

oRg.Borders[Excel.XlBordersIndex.xlEdgeTop].Weight =Excel.XlBorderWeight.xlThin;

oRg.Borders[Excel.XlBordersIndex.xlEdgeTop].ColorIndex=Excel.XlColorIndex.xlColorIndexAutomatic;

 

 

本代码的含义是选择单元格 C2 ,并给单元格中赋值 UserName ,并控制单元格的上边框的样式

 

4.2 Excel 报表添加图片

从原有文件中创建图片。返回一个 Shape 对象,该对象代表新图片。

方法的语法

expression.AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)

expression      必需。该表达式返回“应用于”列表中的对象之一。

FileName      String 类型,必需。要创建的 OLE 对象的源文件。

LinkToFile      MsoTriState 类型,必需。要链接至的文件。

SaveWithDocument      MsoTriState 类型,必需。将图片与文档一起保存。

Left      Single 类型,必需。相对于文档的左上角,以磅为单位给出图片左上角的位置。

Top      Single 类型,必需。相对于文档的顶部,以磅为单位给出图片左上角的位置。

Width      Single 类型,必需。以磅为单位给出图片的宽度。

Height      Single 类型,必需。以磅为单位给出图片的高度。

 

举例

oSheet.Shapes.AddPicture(filename,Microsoft.Office.Core.MsoTriState.msoCTrue ,Microsoft.Office.Core.MsoTriState.msoCTrue,photoLeft,photoTop,photowidth,photoheight);

 

4.3 报表的打印

打印指定对象。

方法的语法

expression.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)

expression      必需。该表达式返回“应用于”列表中的一个对象。

From      Variant 类型,可选。打印的开始页号。如果省略该参数,将从起始位置开始打印。

To      Variant 类型,可选。打印的终止页号。如果省略该参数,将打印至最后一页。

Copies      Variant 类型,可选。要打印的份数。如果省略该参数,将只打印一份。

Preview      Variant 类型,可选。如果该值为 True ,则 Microsoft Excel 打印指定对象之前进行打印预览。如果该值为 False (或者省略此参数),则立即打印该对象。

ActivePrinter      Variant 类型,可选。设置活动打印机的名称。

PrintToFile      Variant 类型,可选。如果该值为 True ,则打印输出到文件。如果没有指定 PrToFileName ,则 Microsoft Excel 将提示用户输入要输出文件的文件名。

Collate      Variant 类型,可选。如果该值为 True ,则逐份打印每份副本。

PrToFileName      可选, Variant 类型。如果 PrintToFile True ,则本参数指定要打印到的文件名。

举例:

oSheet.PrintOut(1,10,"1","False","HPLaserJ","False","True","");

 

4.4 通过服务在系统间传输报表

     

flow.JPG
   
            
生成用户报表的数据流程图

      Web 服务程序

        [WebMethod]

         public byte[] GetFamilyMember(string PersonIdentifier)

         {

              return FamilyMember.GetReport(PersonIdentifier); //The Bussiness of Create the

                                                //report File and Return as The type

                                                //of byte[]

         }

 

Web 服务器段的主要的功能就是 提供一个接口供其他系统引用来获取他需要的数据。

 

Web 程序 将取得的报表二进制流发送给请求的客户

      string ReportName ; //the created Report Name

      byte[] result ;      //the date which Tanslate from Web Server

      HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";

      HttpContext.Current.Response.AppendHeader("Content-disposition","inline;filename="+Server.UrlEncode(ReportName+".xls"));

                      //define the header of Web pages

                          

                    result= Server. GetFamilyMember (TemplateName,PersonID);   //get the date                                                                                                     //from Web server 

                    HttpContext.Current.Response.BinaryWrite(result);

                    HttpContext.Current.Response.End();

 

  

  

  

  总结

      我们可以通过录制宏 来了解 Excel 的操作的实现,并将代码转化成 C# 代码,对于大多数的 Excel 功能都可以实现。       

------ 徐文兵 2006-11-19

posted on 2007-01-11 00:23 KiMoGiGi 阅读(565) 评论(0)  编辑 收藏 引用 所属分类: C# / Winforms
只有注册用户登录后才能发表评论。