#眉標=Enterprise Library、ASP.NET、OpenXML #副標=設計模型套件系列(17) #大標=把資料寫入OpenXML格式的Excel文件 #作者=文/圖 王寧疆 ===<反灰>============= using Microsoft.Practices.Unity; ================ ===<反灰>============= using Microsoft.Practices.Unity; namespace UnityWebApplication { interface IUnity //定義IUnity介面 { IUnityContainer Container { get; //取得Container屬性 } } } ================ ===<反灰>============= public interface ILogger {   void Write(string message, string FileName); } ================ ===<反灰>============= using System.Xml; using System.Text; ================ ===<反灰>============= namespace UnityWebApplication { public class XmlLogger : ILogger { #region ILogger 成員 public void Write(string message, string FileName) { if (!File.Exists(FileName)) //若存放資訊的XML文件不存在 { File.Create(FileName); //建立負責存放資訊的XML文件 } using (XmlTextWriter xw = new XmlTextWriter(FileName, Encoding.Default)) //建立XmlTextWriter類別的物件 { xw.WriteStartDocument(); //寫入XML文件的標準開頭內容 xw.WriteStartElement("Messages"); //寫入XML文件的根項目 xw.WriteStartElement("Message"); //寫入項目 xw.WriteStartElement("ID"); //於項目中加入項目 xw.WriteString("1"); //寫入項目的內容 xw.WriteEndElement(); //寫入項目的結尾標籤 xw.WriteStartElement("Content"); //於項目中加入< Content >項目 xw.WriteString(message); //寫入項目的內容 xw.WriteEndElement(); //寫入項目的結尾標籤 xw.WriteEndElement(); //寫入項目的結尾標籤 xw.WriteEndElement(); //寫入根項目的結尾標籤 xw.WriteEndDocument(); //寫入XML文件的結尾內容 } } #endregion } } ================ ===<反灰>============= using Microsoft.Practices.Unity; ================ ===<反灰>============= IUnityContainer IUnity.Container { get { return Container;} //傳回Unity Container類別的物件 } ================ ===<反灰>============= private static UnityContainer _container = null; //管理Unity Container類別物件的變數 public static IUnityContainer Container //負責取得Unity Container的static屬性 { get { return _container; } //傳回Unity Container類別的物件 } ================ ===<反灰>============= private static void Initialize() { if (_container == null) //判斷Unity Container是否已經建立? { _container = new UnityContainer(); //建立負責存放相依性 }    _container.RegisterType(); //將XmlLogger類別註冊到Unity Container中 } ================ ===<反灰>============= protected void Application_Start(object sender, EventArgs e) { Initialize(); //呼叫Initial方法執行初始化負責存放相依性設定的Unity Container的動作 } ================ ===<反灰>============= public class Global : System.Web.HttpApplication, IUnity { private static UnityContainer _container = null; //管理物件的變數 public static IUnityContainer Container { get { return _container; } //傳回Unity Container類別的物件   } IUnityContainer IUnity.Container { get { return Container; } //傳回Unity Container類別的物件 } protected void Application_Start(object sender, EventArgs e) { Initialize(); //呼叫Initial方法執行初始化負責存放相依性設定的Unity Container的動作 } private static void Initialize() { if (_container == null) //判斷Unity Container是否已經建立?   { _container = new UnityContainer(); //建立負責存放相依性的Unity Container } _container.RegisterType(); //將XmlLogger類別註冊到Unity Container中 } } ================ ===<反灰>============= protected void btnXmlLogger_Click(object sender, EventArgs e) { IUnity UnityCtx = Context.ApplicationInstance as IUnity; //取得網頁程式並轉型成IUnity介面的變數 ILogger logger = UnityCtx.Container.Resolve< XmlLogger>(); //從IUnity介面的變數取出事先註冊的XmlLogger類別的物件 logger.Write("Hello", Server.MapPath("~/Hello.xml")); //利用XmlLogger類別的物件寫入資訊到XML文件 } ================ ===<反灰>============= 1 Hello ================ ===<反灰>============= using System.IO; using System.Collections; using System.Data; ================ ===<反灰>============= namespace UnityWebApplication { public class ExcelLogger : ILogger //繼承自ILogger介面 { #region ILogger 成員 public void Write(string message, string FileName) //實作ILogger介面的Write方法 { if (!File.Exists(FileName)) //如果欲寫入資料的檔案不存在 { File.Create(FileName); //執行建立檔案的動作 } string TempDir = HttpContext.Current.Server.MapPath("~/TEMP"); //取得TEMP資料夾的路徑 string TemplateFile = HttpContext.Current.Server.MapPath("~/Template.xlsx"); //取得Template.xlsx檔案的路徑 ExcelRW.DeleteDirectoryContents( TempDir); //刪除放置Excel文件預設內容的資料夾內的所有檔案 ExcelRW.UnzipFile(TemplateFile, TempDir); //將Template.xlsx檔案的內容解壓縮到TEMP資料夾 Hashtable lookupTable; //準備加快搜尋速度的lookupTable集合 DataTable dt = new DataTable(); //建立DataTable類別的物件 dt.Columns.Add("Column1", typeof(int)); //加入名稱為Column1,型態為int的欄位 dt.Columns.Add("Column2", typeof(string)); //加入名稱為Column1,型態為string的欄位 DataRow dr = dt.NewRow(); //建立DataRow類別的物件 dr["Column1"] = 1; //填入1當做Column1欄位的內容 dr["Column2"] = message; //填入message參數的內容當做Column2欄位的內容 dt.Rows.Add(dr); //將準備好的DataRow物件加入到DataTable的Rows集合中 ArrayList stringTable = ExcelRW.CreateStringTables(dt, out lookupTable); //依據欲寫入到EXCEL文件的資料建立lookupTable和字串集合 FileStream fs = new FileStream(TempDir + @"\xl\sharedStrings.xml", FileMode.Create); //建立XML檔案 ExcelRW.WriteStringTable(fs,stringTable);//將存放在stringTable集合的內容寫入到XML文件中 fs = new FileStream(TempDir + @"\xl\worksheets\sheet1.xml", FileMode.Create); //建立代表第一個工作表的XML文件 ExcelRW.WriteWorksheet(fs, dt, lookupTable); //將存放在DataTable中的資料寫入到第一個工作表 ExcelRW.ZipDirectory(TempDir, FileName); //將TEMP資料夾底下的所有XML文件壓縮成Excel 2007的文件. } #endregion } } ================ ===<反灰>============= private static void Initialize() { if (_container == null) { _container = new UnityContainer(); } _container.RegisterType(); _container.RegisterType(); //將ExcelLogger類別註冊到Unity Container中 } ================ ===<反灰>============= protected void btnExcelLogger_Click(object sender, EventArgs e) { IUnity UnityCtx = Context.ApplicationInstance as IUnity; //取得網頁程式並轉型成IUnity介面的變數 ILogger logger = UnityCtx.Container.Resolve< ExcelLogger>(); //從IUnity介面的變數取出事先註冊的ExcelLogger類別的物件 logger.Write("Hello", Server.MapPath("~/Hello.xlsx")); //利用XmlLogger類別的物件寫入資訊到XML文件 } ================