程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#定制Excel界面並完成與數據庫交互的辦法

C#定制Excel界面並完成與數據庫交互的辦法

編輯:C#入門知識

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中,然後用戶操作完成後,經由過程後台法式將數據庫保留到數據庫中.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved