• Office编程在dot Net环境中总结(Excel篇)


    文章的使用范围

       运行环境 .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.2Excel报表添加图片

    从原有文件中创建图片。返回一个 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功能都可以实现。      

  • 相关阅读:
    关于题目中的内存限制
    手动实现最小堆和最大堆(优先队列)
    线性筛素数(欧拉筛)+前缀和优化
    并查集
    快速排序

    字典按中文姓名排序
    oc程序代码
    学生字典计算年龄差 随机50个数
    nsset
  • 原文地址:https://www.cnblogs.com/levin/p/570651.html
Copyright © 2020-2023  润新知