C#定制Excel界面並完成與數據庫交互的辦法。本站提示廣大學習愛好者:(C#定制Excel界面並完成與數據庫交互的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#定制Excel界面並完成與數據庫交互的辦法正文
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事宜中,初始化四個面板,並對其根本屬性停止設置,停靠在上的面板我設置其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中,然後用戶操作完成後,經由過程後台法式將數據庫保留到數據庫中.