51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3025|回复: 0
打印 上一主题 下一主题

[转贴] C#如何定制Excel界面并实现与数据库交互(上)

[复制链接]
  • TA的每日心情
    擦汗
    前天 08:59
  • 签到天数: 1021 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2015-12-30 10:49:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    Excel是微软办公套装软件的一个重要的组成部分,它可以进行各种数据的处理、统计分析和辅助决策操作,广泛地应用于管理、统计财经、金融等众多领域。(另外,Excel还是伦敦一所会展中心的名称)。.NET可以创建Excel Add-In对Excel进行功能扩展,这些扩展的功能包括自定义用户函数,自定义UI,与数据库进行数据交互等。
      一 主要的Excel开发方式
      1 VBA
      VBA是一种Visual Basic的宏语言,它是最早的Office提供定制化的一种解决方案,VBA是VB的一个子集,和Visual Basic不同,VBA是一种宿主型语言,无论是专业的开发人员,还是刚入门的非开发人员,都可以利用VBA完成简单或复杂的需求。
      2 Excel Addin
      Excel Addin,就像Visual Studio外接插件一样,也可以使用一些技术为Office开发一些插件。对VBA的一些问题,一些专业的开发人员,可以使用 VisualBasic或者VisualC++等工具来引用Office的一些dll,来针对Office进行开发。开发的时候将dll注册为com组 件,并在注册表里面进行注册,这样就可以在Excel里直接调用这些插件。
      3 VSTO (Visual Studio Tools for Office)
      VSTO主要是对Office的一些dll进行了.NET封装,使得我们可以使用.NET上的语言来方便的对Office的一些方法进行调用。所 以,Office开发跨入了一个新的时代,开发人员可以使用更加高级的语言和熟悉的技术来更容易的进行Office开发。 对于企业及的应用和开发,VSTO或许是首要选择,他极大地扩展了Office应用程序的能力,使用.NET平台支持的编程语言,能够直接访问.NET上面众多的类库。具有较好的安全机制。简化了Office插件的开发和部署。
      4 XLL
      XLL是Excel的一种外接应用程序,他使用C和C++开发,程序通过调用Excel暴漏的C接口来实现扩展功能。这种方式开发的应用程序效率高,但是难度大,对开发者自身的要求较高。开源项目Excel-DNA就是使用XLL技术开发的,能够帮助.NET 开发人员来极大地简化RTD函数,同步、异步UDF函数的编写和开发。
      5 OpenXML
      如果用户没有安装Excel应用程序,或者在服务器端需要动态生成Excel文件的时候。我们可能需要直接读取或者生成Excel文件,这种情况下,如果要对Excel文件进行各种定制化开发的话,建议使用OpenXML。NPOI开源项目可以直接读写Excel文件,而且兼容多个版本。
      二 使用Excel Add-In构建扩展
      开发环境: 操作系统为Windows Server 2008R2 x64;Excel为Excel 2010 x64;开发工具为Visual Studio 2012旗舰版x64;数据库为SQL Server 2008R2 x64.
      1 程序结构
      用Visual Studio 2012新建一个ExcelAddInDemo的Excel Add-In项目,并添加若干文件,程序结构如下图:

      其中,RibbonAddIn可以定制2010的UI面板,SqlHelper.cs是一个简单的数据库访问帮助类,UClog.cs,UCPaneLeft.cs,UCTaskGrid.cs,UCTaskPane.cs都为添加的自定义控件,并通过程序添加到EXCEL界面中.运行起来的界面如下:

      程序可以通过在Excel界面中输入ID,First,Last,Email的值(对应标签的后一个单元格),单击用户列表面板上的保存按钮,将数据保存到数据库中.
      2 RibbonAddIn设计
      我们通过RibbonAddIn.cs给Excel的Ribbon添加了一个名为CUMT的插件.RibbonAddIn面板可以通过工具条控件方便的拖放到设计界面上.RibbonAddIn.cs的属性设置如下图所示:

    1. 后台代码如下:
    2.   1 using System;
    3.   2 using System.Collections.Generic;
    4.   3 using System.Linq;
    5.   4 using System.Text;
    6.   5 using Microsoft.Office.Tools.Ribbon;
    7.   6
    8.   7 namespace ExcelAddInDemo
    9.   8 {
    10.   9     public partial class RibbonAddIn
    11.   10     {
    12.   11
    13.   12         private void RibbonAddIn_Load(object sender, RibbonUIEventArgs e)
    14.   13         {
    15.   14
    16.   15         }
    17.   16
    18.   17         private void btnAbout_Click(object sender, RibbonControlEventArgs e)
    19.   18         {
    20.   19             System.Windows.Forms.MessageBox.Show("JackWangCUMT!");
    21.   20         }
    22.   21
    23.   22         private void btnShow_Click(object sender, RibbonControlEventArgs e)
    24.   23         {
    25.   24             if (Globals.ThisAddIn._MyCustomTaskPane != null)
    26.   25             {
    27.   26                 Globals.ThisAddIn._MyCustomTaskPane.Visible = true;
    28.   27             }
    29.   28         }
    30.   29
    31.   30         private void btnHide_Click(object sender, RibbonControlEventArgs e)
    32.   31         {
    33.   32             if (Globals.ThisAddIn._MyCustomTaskPane != null)
    34.   33             {
    35.   34                 Globals.ThisAddIn._MyCustomTaskPane.Visible = false;
    36.   35             }
    37.   36         }
    38.   37     }
    39.   38 }
    40.   3 ThisAddIn逻辑编写
    41.   1 using System;
    42.   2 using System.Collections.Generic;
    43.   3 using System.Linq;
    44.   4 using System.Text;
    45.   5 using System.Xml.Linq;
    46.   6 using Excel = Microsoft.Office.Interop.Excel;
    47.   7 namespace ExcelAddInDemo
    48.   8 {
    49.   9     using Microsoft.Office.Tools;
    50.   10     public partial class ThisAddIn
    51.   11     {
    52.   12         public CustomTaskPane _MyCustomTaskPane = null;
    53.   13
    54.   14         private void ThisAddIn_Startup(object sender, System.EventArgs e)
    55.   15         {
    56.   16             UCTaskPane taskPane = new UCTaskPane();
    57.   17             _MyCustomTaskPane = this.CustomTaskPanes.Add(taskPane, "我的任务面板");
    58.   18             _MyCustomTaskPane.Width = 30;//height有问题,此处width ==height
    59.   19             _MyCustomTaskPane.Visible = true;
    60.   20             _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionTop;
    61.   21
    62.   22             UCPaneLeft panLeft = new UCPaneLeft();
    63.   23             _MyCustomTaskPane = this.CustomTaskPanes.Add(panLeft, "组织");
    64.   24             _MyCustomTaskPane.Width = 200;
    65.   25             _MyCustomTaskPane.Visible = true;
    66.   26             _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft;
    67.   27
    68.   28             UCTaskGrid panRight = new UCTaskGrid();
    69.   29             _MyCustomTaskPane = this.CustomTaskPanes.Add(panRight, "用户列表");
    70.   30             _MyCustomTaskPane.Width = 200;
    71.   31             _MyCustomTaskPane.Visible = true;
    72.   32             _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionRight;
    73.   33
    74.   34             UCLog panLog = new UCLog();
    75.   35             _MyCustomTaskPane = this.CustomTaskPanes.Add(panLog, "日志列表");
    76.   36             _MyCustomTaskPane.Width = 60;
    77.   37             _MyCustomTaskPane.Visible = true;
    78.   38             _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionBottom;
    79.   39
    80.   40             //Hook into the workbook open event
    81.   41             //This is because Office doesn't always have a document ready when this method is run
    82.   42             this.Application.WorkbookActivate += Application_WorkbookActivate;
    83.   43             //test
    84.   44             //this.Application.SheetSelectionChange += Application_SheetSelectionChange;
    85.   45         }
    86.   46
    87.   47         void Application_SheetSelectionChange(object Sh, Excel.Range Target)
    88.   48         {
    89.   49             if (this.Application != null)
    90.   50             {
    91.   51                 this.Application.Caption = this.Application.ActiveCell.Address.ToString();//$A$1
    92.   52                 //+ this.Application.ActiveCell.AddressLocal.ToString();//$A$1
    93.   53                 //this.Application.ActiveCell.Formula = "=sum(1+2)";
    94.   54
    95.   55             }
    96.   56         }
    97.   57
    98.   58         void Application_WorkbookActivate(Excel.Workbook Wb)
    99.   59         {
    100.   60             //using Microsoft.Office.Tools.Excel 和 using Microsoft.Office.Interop.Excel 都有worksheet等,容易混淆
    101.   61             //string path = this.Application.ActiveWorkbook.FullName;
    102.   62             Excel._Worksheet ws = (Excel._Worksheet)this.Application.ActiveWorkbook.ActiveSheet;
    103.   63             ws.Cells[2, 2] = "ID2";
    104.   64             //如何设置只读等有待研究
    105.   65             int r=2,c=2;
    106.   66            //((Excel.Range)ws.Cells[r, c]).NumberFormat = format;
    107.   67             ((Excel.Range)ws.Cells[r, c]).Value2 = "ID";
    108.   68             ((Excel.Range)ws.Cells[r, c]).Interior.Color =System.Drawing. ColorTranslator.ToOle(System.Drawing.Color.Red);
    109.   69             //((Excel.Range)ws.Cells[r, c]).Style.Name = "Normal";
    110.   70             ((Excel.Range)ws.Cells[r, c]).Style.Font.Bold = true;
    111.   71
    112.   72             #region format
    113.   73             ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A2", "E10")).Font.Bold = true;
    114.   74             ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A2", "E10")).Font.Italic = true;
    115.   75             ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A2", "E10")).Font.Color = System.Drawing.Color.FromArgb(96, 32, 0).ToArgb();
    116.   76             ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A2", "E10")).Font.Name = "Calibri";
    117.   77             ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A2", "E10")).Font.Size = 15;
    118.   78
    119.   79             //border
    120.   80             Excel.Range range = ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("B2", "E3"));
    121.   81             Excel. Borders border = range.Borders;
    122.   82             border[Excel.XlBordersIndex.xlEdgeBottom].LineStyle =Excel. XlLineStyle.xlContinuous;
    123.   83             border.Weight = 2d;
    124.   84             border[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous;
    125.   85             border[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous;
    126.   86             border[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous;
    127.   87             #endregion
    128.   88             ws.Cells[2, 4] = "First";
    129.   89             ws.Cells[3, 2] = "Last";
    130.   90             ws.Cells[3, 4] = "Email";
    131.   91         }
    132.   92         private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    133.   93         {
    134.   94         }
    135.   95
    136.   96         #region VSTO 生成的代码
    137.   97
    138.   98         /// <summary>
    139.   99         /// 设计器支持所需的方法 - 不要
    140.   100         /// 使用代码编辑器修改此方法的内容。
    141.   101         /// </summary>
    142.   102         private void InternalStartup()
    143.   103         {
    144.   104             this.Startup += new System.EventHandler(ThisAddIn_Startup);
    145.   105             this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
    146.   106         }
    147.   107
    148.   108         #endregion
    149.   109     }
    150.   110 }
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-21 22:19 , Processed in 0.068622 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表