亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#定制Excel界面并實現與數據庫交互的方法

2020-01-24 01:21:57
字體:
來源:轉載
供稿:網友

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的屬性設置如下圖所示:

  后臺代碼如下:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Office.Tools.Ribbon; namespace ExcelAddInDemo {   public partial class RibbonAddIn   {     private void RibbonAddIn_Load(object sender, RibbonUIEventArgs e)     {     }     private void btnAbout_Click(object sender, RibbonControlEventArgs e)     {       System.Windows.Forms.MessageBox.Show("JackWangCUMT!");     }     private void btnShow_Click(object sender, RibbonControlEventArgs e)     {       if (Globals.ThisAddIn._MyCustomTaskPane != null)       {         Globals.ThisAddIn._MyCustomTaskPane.Visible = true;       }     }     private void btnHide_Click(object sender, RibbonControlEventArgs e)     {       if (Globals.ThisAddIn._MyCustomTaskPane != null)       {         Globals.ThisAddIn._MyCustomTaskPane.Visible = false;       }     }   } }

  3 ThisAddIn邏輯編寫

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Xml.Linq;  using Excel = Microsoft.Office.Interop.Excel;  namespace ExcelAddInDemo  {    using Microsoft.Office.Tools;   public partial class ThisAddIn   {     public CustomTaskPane _MyCustomTaskPane = null;     private void ThisAddIn_Startup(object sender, System.EventArgs e)     {       UCTaskPane taskPane = new UCTaskPane();       _MyCustomTaskPane = this.CustomTaskPanes.Add(taskPane, "我的任務面板");       _MyCustomTaskPane.Width = ;//height有問題,此處width ==height       _MyCustomTaskPane.Visible = true;       _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionTop;       UCPaneLeft panLeft = new UCPaneLeft();       _MyCustomTaskPane = this.CustomTaskPanes.Add(panLeft, "組織");       _MyCustomTaskPane.Width = ;       _MyCustomTaskPane.Visible = true;       _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft;       UCTaskGrid panRight = new UCTaskGrid();       _MyCustomTaskPane = this.CustomTaskPanes.Add(panRight, "用戶列表");       _MyCustomTaskPane.Width = ;       _MyCustomTaskPane.Visible = true;       _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionRight;       UCLog panLog = new UCLog();       _MyCustomTaskPane = this.CustomTaskPanes.Add(panLog, "日志列表");       _MyCustomTaskPane.Width = ;       _MyCustomTaskPane.Visible = true;       _MyCustomTaskPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionBottom;       //Hook into the workbook open event       //This is because Office doesn't always have a document ready when this method is run        this.Application.WorkbookActivate += Application_WorkbookActivate;       //test        //this.Application.SheetSelectionChange += Application_SheetSelectionChange;     }     void Application_SheetSelectionChange(object Sh, Excel.Range Target)     {       if (this.Application != null)       {         this.Application.Caption = this.Application.ActiveCell.Address.ToString();//$A$         //+ this.Application.ActiveCell.AddressLocal.ToString();//$A$         //this.Application.ActiveCell.Formula = "=sum(+)";       }     }     void Application_WorkbookActivate(Excel.Workbook Wb)     {       //using Microsoft.Office.Tools.Excel 和 using Microsoft.Office.Interop.Excel 都有worksheet等,容易混淆       //string path = this.Application.ActiveWorkbook.FullName;       Excel._Worksheet ws = (Excel._Worksheet)this.Application.ActiveWorkbook.ActiveSheet;       ws.Cells[, ] = "ID";       //如何設置只讀等有待研究       int r=,c=;       //((Excel.Range)ws.Cells[r, c]).NumberFormat = format;       ((Excel.Range)ws.Cells[r, c]).Value = "ID";       ((Excel.Range)ws.Cells[r, c]).Interior.Color =System.Drawing. ColorTranslator.ToOle(System.Drawing.Color.Red);       //((Excel.Range)ws.Cells[r, c]).Style.Name = "Normal";       ((Excel.Range)ws.Cells[r, c]).Style.Font.Bold = true;       #region format       ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A", "E")).Font.Bold = true;       ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A", "E")).Font.Italic = true;       ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A", "E")).Font.Color = System.Drawing.Color.FromArgb(, , ).ToArgb();       ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A", "E")).Font.Name = "Calibri";       ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("A", "E")).Font.Size = ;       //border       Excel.Range range = ((Microsoft.Office.Interop.Excel.Range)ws.get_Range("B", "E"));       Excel. Borders border = range.Borders;       border[Excel.XlBordersIndex.xlEdgeBottom].LineStyle =Excel. XlLineStyle.xlContinuous;       border.Weight = d;       border[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous;       border[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous;       border[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous;       #endregion       ws.Cells[, ] = "First";       ws.Cells[, ] = "Last";       ws.Cells[, ] = "Email";     }     private void ThisAddIn_Shutdown(object sender, System.EventArgs e)     {     }     #region VSTO 生成的代碼     /// <summary>     /// 設計器支持所需的方法 - 不要     /// 使用代碼編輯器修改此方法的內容。     /// </summary>     private void InternalStartup()     {       this.Startup += new System.EventHandler(ThisAddIn_Startup);       this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);     }     #endregion   } }

   ThisAddIn_Startup事件中,初始化四個面板,并對其基本屬性進行設置,??吭谏系拿姘逦以O置其Height無效,改成Width后其效果和Height預期的一樣(不知道這個底層開發人員是怎么想的,哈哈!)另外 Excel._Worksheet ws = (Excel._Worksheet)this.Application.ActiveWorkbook.ActiveSheet;是非常關鍵的一句,我這里足足折騰了很久,原因是using Microsoft.Office.Tools.Excel 和 using Microsoft.Office.Interop.Excel 都有worksheet元素,結構混淆了,運行時老是獲取不到Excel的ActiveWorkbook.

  4 UCTaskGrid設計

  UCTaskGrid是一個用戶控件,包含一個工具條和一個dataGridView1控件,其設計界面如下:

  后臺代碼如下:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace ExcelAddInDemo {   using Excel = Microsoft.Office.Interop.Excel;   public partial class UCTaskGrid : UserControl   {     public UCTaskGrid()     {       InitializeComponent();     }     private void UCTaskGrid_Load(object sender, EventArgs e)     {       //load data       System.Data.DataTable dt = SqlHelper.getDateTable("select * from ACT_ID_USER", null);       this.dataGridView.DataSource = dt;     }     private void 保存SToolStripButton_Click(object sender, EventArgs e)     {       //核心代碼,獲取當前的worksheet       Excel._Worksheet ws = (Excel._Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;       string name = ws.Name;       string ID = ((string)(ws.Cells[, ] as Excel.Range).Value).ToString();       string First = ((string)(ws.Cells[, ] as Excel.Range).Value).ToString();       string Last = ((string)(ws.Cells[, ] as Excel.Range).Value).ToString();       string Email = ((string)(ws.Cells[, ] as Excel.Range).Value).ToString();       string sql = string.Format("insert into ACT_ID_USER ([ID_],[FIRST_],[LAST_],[EMAIL_]) values('{}','{}','{}','{}')", ID, First, Last, Email);       int rows= SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionStringLocalTransaction, System.Data.CommandType.Text,sql,null);       if (rows == )       {         System.Windows.Forms.MessageBox.Show("saved");       }       else       {         System.Windows.Forms.MessageBox.Show("error");       }     }     private void 打開OToolStripButton_Click(object sender, EventArgs e)     {       //refresh       System.Data.DataTable dt = SqlHelper.getDateTable("select * from ACT_ID_USER", null);       this.dataGridView.DataSource = dt;     }   } }

  5 Add-In強簽名

  通過設置程序的屬性中的簽名頁,讓VS自動生成一個簽名即可(需設置密碼)

三 最終效果演示

  為了直觀的展示,看下面的動畫:

四 猜想 Excel Service

  現在功能很強大的Excel服務器,其中一個亮點就是在Excel中進行界面設計和數據操作,然后就數據持久化到數據庫中,那么我的猜想是,能不能通過AddIn的方式實現一個excel service功能呢,將界面設計序列化保存到數據庫中,并給一個路徑(唯一),但用戶單擊菜單(確定了路徑)后將界面設計呈現到excel中,然后用戶操作完成后,通過后臺程序將數據庫保存到數據庫中.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品免费一区豆花| 欧美多人乱p欧美4p久久| 国产日韩在线亚洲字幕中文| 26uuu另类亚洲欧美日本老年| 日韩欧美一区二区在线| 亚洲视频在线视频| 中文字幕亚洲一区二区三区| 久久久免费精品| 欧美日韩国产专区| 日韩电影大全免费观看2023年上| 国内精品久久久久影院 日本资源| 欧美成人激情图片网| 岛国视频午夜一区免费在线观看| 亚洲欧洲在线看| 亚洲午夜激情免费视频| 国产精品6699| www.精品av.com| 色婷婷av一区二区三区久久| 永久免费精品影视网站| 夜夜嗨av一区二区三区免费区| 国产精品大片wwwwww| 亚洲网在线观看| 久久精品99久久香蕉国产色戒| 欧美国产一区二区三区| 精品久久中文字幕| 97精品国产aⅴ7777| 亚洲精品美女视频| 欧美猛交ⅹxxx乱大交视频| 久久天天躁狠狠躁夜夜av| 人妖精品videosex性欧美| 91精品国产色综合久久不卡98口| 国产亚洲精品91在线| 成人a在线观看| 亚洲激情视频在线| 国产精品免费久久久久影院| 亚洲第一区中文99精品| 亚洲影院高清在线| 欧美日韩中文字幕在线视频| 欧美激情2020午夜免费观看| 亚洲va电影大全| 久久影视电视剧免费网站| 欧美激情图片区| 成人福利视频在线观看| 精品国产一区二区三区四区在线观看| 成人激情视频在线播放| 在线观看欧美视频| 日韩av影视综合网| 国产精品com| 成人免费自拍视频| 国产精品久久中文| 欧美精品一区二区三区国产精品| 免费91麻豆精品国产自产在线观看| 亚洲欧美成人在线| 国产日韩一区在线| 成人午夜黄色影院| 高清一区二区三区日本久| 一区二区三区www| 中文字幕少妇一区二区三区| 中文字幕日韩av综合精品| 国产精品成久久久久三级| 亚洲人成绝费网站色www| 亚洲美女精品久久| 国产成人拍精品视频午夜网站| 久久精品视频亚洲| 国产a∨精品一区二区三区不卡| 欧美国产日韩一区二区| 91精品国产综合久久久久久蜜臀| 国内精品小视频| 成人黄色免费看| 北条麻妃久久精品| 亚洲a中文字幕| 欧美午夜视频一区二区| 最好看的2019的中文字幕视频| 96精品久久久久中文字幕| 国产亚洲精品久久久优势| 97视频com| 亚洲精品美女网站| 日韩欧美高清在线视频| 亚洲男人天堂视频| 成人做爽爽免费视频| 欧美天堂在线观看| 欧美美最猛性xxxxxx| 91极品女神在线| 久久久免费在线观看| 日韩精品极品视频免费观看| 欧美做爰性生交视频| 精品久久国产精品| 亚洲日本成人女熟在线观看| 国产精品黄视频| 国产成人精品免费久久久久| 91精品综合视频| 欧美多人爱爱视频网站| 91在线|亚洲| 这里只有精品久久| 亚洲91精品在线观看| 国产精品尤物福利片在线观看| 九九久久久久久久久激情| 午夜免费在线观看精品视频| 国产亚洲精品久久久久动| 欧美与黑人午夜性猛交久久久| 色综合久久中文字幕综合网小说| 不卡av电影院| 日韩电影免费在线观看| 国产精品久久久久久久久久99| 日产精品久久久一区二区福利| 精品国产网站地址| 夜夜嗨av色一区二区不卡| 最近2019年中文视频免费在线观看| 26uuu另类亚洲欧美日本老年| 欧美有码在线观看视频| 亚洲欧美综合精品久久成人| 91精品国产综合久久香蕉的用户体验| 国产精品视频网| 久久久女人电视剧免费播放下载| 欧美午夜激情小视频| 亚洲综合中文字幕在线观看| 亚洲第一网中文字幕| 亚洲最大中文字幕| 久久国产精品电影| 欧美丰满老妇厨房牲生活| 久久精品国产2020观看福利| 亚洲女同性videos| yw.139尤物在线精品视频| 久久精视频免费在线久久完整在线看| 精品视频久久久久久久| 欧美日韩国产在线看| 日韩性xxxx爱| 亚洲网站在线播放| 九九精品在线播放| 久久亚洲私人国产精品va| 97视频色精品| 日韩av手机在线看| 69精品小视频| 国产精品久久久久久久av电影| 成人性生交大片免费观看嘿嘿视频| 亚洲福利视频网站| 伊人青青综合网站| 国产婷婷色综合av蜜臀av| 伊人伊成久久人综合网小说| 亚洲国产精久久久久久| 国产精品jizz在线观看麻豆| 国产成人啪精品视频免费网| 精品久久久久久亚洲精品| 国产精品成人在线| 亚洲欧美在线看| 欧美另类69精品久久久久9999| 在线播放国产精品| 狠狠色香婷婷久久亚洲精品| 久久九九全国免费精品观看| 成人午夜激情网| 精品国产区一区二区三区在线观看| 欧美激情一级精品国产| 国自在线精品视频| 国产美女精品视频免费观看| 亚洲欧美中文日韩v在线观看| 国产精品盗摄久久久| 国产主播欧美精品| 国产精品影片在线观看| 日韩性xxxx爱| 亚洲国产三级网| 欧美老女人xx| 国产精品人人做人人爽| 久久精品成人欧美大片古装| 日韩欧美中文免费|