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