MOSS的Excel Services相信大家都聽說過.我們可以創建一個引用了外部數據的Excel文件,然后發布到Excel Services中,然后就可以讓用戶在網頁上看到數據庫中的數據的實時的狀態.
我們會有這樣的設想,我在Excel中設計一個計算邏輯,然后從數據庫中取一些值出來,填到Excel中,然后讓Excel 自動去計算,然后我們可以把計算分析后的結果呈現給擁護.恩,這個設想很好!我們要實現這個想法需要做三件事情:
1)我們要能從數據庫中取出特定的數,可能需要取到某一個數
2)我們需要Excel Services能支持我們直接查數據庫
3)我們把設計好的Excel發布出去
第一件事情我們自然想到了SQL語句比如"Select value From table..."之類.
很遺憾,Excel Services不支持直接查詢數據庫,只支持SQL Server Analysis Services等間接的方式,可能是處于安全或者其他考慮,對于不了解SQL Server Analysis Services的兄弟來說就很難了 : (
這么一個好的設想,難道就實現不了嗎?慶幸的是,Excel Services支持Udf用戶自定義函數,我們可以通過用戶自定義函數開發一個直接查數據庫的Udf,使用我們熟悉的SQL語句.
Udf的開發過程:
1)VS2005新建一個類工程,應用經典目錄下 12/ISAPI/Microsoft.Office.Excel.Server.Udf.dll
2)編寫自定義的函數
3)注冊Udf
關于Udf中的支持的返回值類型等可以參考:
http://officeblogs.net/excel/UDFs%20for%20Excel%20client%20and%20server.doc
SQLExcuteUdf是為實現了一個方法取數據庫中的某個值而設計的:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Microsoft.Office.Excel.Server.Udf;
using System.Data.SqlClient;

namespace SQLExcuteUdf


{
[UdfClass]
public class SQLExcute

{

/**//// <summary>
/// 取SQL Server數據庫中的單個值
/// </summary>
/// <param name="constr">數據庫鏈接</param>
/// <param name="comstr">SQl語句</param>
/// <returns></returns>
[UdfMethod]
public string GetSingleDataFromSQL(string constr, string comstr)

{
try

{
string tempstring = "無數據";
SqlConnection mycon = new SqlConnection(constr);
mycon.Open();
SqlCommand mycom = new SqlCommand(comstr, mycon);
SqlDataReader myreader = mycom.ExecuteReader();
if (myreader.Read())

{
tempstring = myreader[0].ToString();
}
mycon.Close();
mycon.Dispose();
return tempstring;
}
catch (Exception ex)

{
return "運行錯誤,錯誤:"+ex.Message;
}
}
}
}
編譯把dll進行注冊

根據Udf的設計,需要給函數提供一個數據庫連接和SQL語句,在Excel中我是需要用這個Udf查數據庫中某個值,直接在某個單元格輸入函數"=GetSingleDataFromSQL($A$1,B4)".因為Excel不知道這個函數所以在這里會顯示"#Name!"之類的東西,如果把Udf作成xll放到Excel中就能直接在Excel中用了,這里就不做介紹了.

然后,我把這個發布到Excel Services中.
當我在瀏覽器中訪問的時候,Excel Services就會利用Udf去數據庫中查到一個值,顯示出來,當數據庫中數據有更新的時候,刷新頁面會實時更新數據.
在
這里下載源代碼.
預告:
如何利用Excel Services取實數據作為KPI列表數據源