循序渐进,探寻Excel二次开发.NET源码(4)-WorkBooks类
关键字:.NET、Excel、Excel打开、Excel关闭、Excel打印预览、Excel二次开发、面向对象、设计模式
前面已创建Excel实例、能对Excel做操作保存并打印,现在,我们将再封装WorkBooks类的使用,方便获对Excel工作薄的操作,以实现工作表的增删改定位等操作。
using System;using GoldPrinter.ExcelExpert.Exceptions;using GoldPrinter.ExcelExpert.Constants;namespace GoldPrinter.ExcelExpert{/// <summary>/// Excel工作薄的工作表集,作为Workbook的访问者,可以对其工作表集增删改定位等操作,方便扩展。/// 注意这里索引遵从C#从0开始,而Excel本身是从1开始的。////// 作 者:长江支流(周方勇)/// Email:MisGoldPrinter@163.com QQ:150439795/// 网 址:www.webmis.com.cn/// ★★★★★您可以免费使用此程序,但是请您完整保留此说明,以维护知识产权★★★★★/// /// </summary>public class WorkBooks:System.Collections.IEnumerable {private Excel.Application _xlApp;//Excel应用程序。private Object oMissing = System.Reflection.Missing.Value; //实例化对象时缺省参数#region Application 字段属性/// <summary>/// 获取Excel应用程序/// </summary>public Excel.Application Application{get{return _xlApp;}}#endregion/// <summary>/// 创建类的新实体,并指定其所依附的工作薄。/// </summary>/// <param name="application"></param>public WorkBooks(Excel.Application application){_xlApp = application;}/// <summary>/// 获取工作表数量。/// </summary>/// <returns></returns>public int Count{get{return GetWorkbooksCount();}}#region 打开(增加)/// <summary>/// 新增一个新的工作薄,并打开返回。/// </summary>/// <returns></returns>public Excel.Workbook Add(){try{//创建并返回Excel工作薄return _xlApp.Workbooks.Add(oMissing);}catch(System.Exception ex){throw new OpenExcelException("打开Excel时错误,详细信息:" + ex.Message);}}/// <summary>/// 根据现有工作薄模板新增并打开返回,如果指定的模板不存在,则用默认的空模板。/// </summary>/// <param name="templateFileName">用作模板的工作薄文件名</param>public Excel.Workbook Add(string templateFileName){if (System.IO.File.Exists(templateFileName)){//用模板打开//Workbooks.Add Template:="C:\tpt.xlt"try{return _xlApp.Workbooks.Add(templateFileName);}catch(System.Exception ex){throw new OpenExcelException("打开Excel时错误,详细信息:" + ex.Message);}}else{return Add();}}/*/// <summary>/// 从指定行开始读取指定文本文件到Excel,文本项用逗号分隔,用双引号界定,如"A","B","C"/// </summary>/// <param name="textFileName"></param>/// <param name="startRow"></param>/// <returns></returns>public Excel.Workbook AddTextFile(string textFileName,int startRow){if (System.IO.File.Exists(textFileName)){try{Excel.Workbook xlWorkbook = null;_xlApp.Workbooks.OpenText(textFileName, Type.Missing, startRow, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);return xlWorkbook;}catch(System.Exception ex){throw new OpenExcelException("打开Excel时错误,详细信息:" + ex.Message);}}else{return Add();}}*/#endregion/// <summary>/// 关闭所有打开的工作簿,与Clear()方法相同点为都关闭所有工作薄窗口,/// 但后者不会有任何提示,本方法会根据Application.DisplayAlerts的值是否提示。/// </summary>public void Close(){//与大多数的集合不同,这个集合允许您一次性地关闭所有的成员try{_xlApp.Workbooks.Close();}catch{//用户手动从界面上关闭了本程序的Excel窗口}}/// <summary>/// 获取当前激活的工作薄/// </summary>public Excel.Workbook ActiveWorkbook{get{return (Excel.Workbook)_xlApp.ActiveWorkbook;}}/// <summary>/// 获取集合中指定索引的工作薄,没有则返回null。/// 必须使用在标题栏看到的名称,即在保存该文件之前,这个名称不包括“.xls”扩展名。/// </summary>public Excel.Workbook this[string name]{get{Excel.Workbook bookReturn = null;object obj = null;try{//没有即会出错try{//在保存该文件之前,这个名称不包括“.xls”扩展名。obj = _xlApp.Workbooks[name];}catch{//保存该文件之后,这个名称包括“.xls”扩展名。obj = _xlApp.Workbooks[name + ".xls"];}}catch{} if (obj != null){bookReturn = (Excel.Workbook)obj;}return bookReturn;}}/// <summary>/// 获取集合中指定索引的工作薄,索引太大会返回最后一个,太小则返回第一个工作薄。/// </summary>public Excel.Workbook this[int index]{get{Excel.Workbook bookReturn = null;int count = GetWorkbooksCount();int i = index + 1;//注意这里索引从0开始,而Excel本身是从1开始的,所以加1。 if (i < 1){i = 1;}else if(i > count){i = count;}//取得第i个工作薄激活并返回(索引从1开始)bookReturn = (Excel.Workbook)_xlApp.Workbooks[i];return bookReturn;}}/// <summary>/// 强制重新计算所有打开的工作簿、特定的工作簿或者特定的范围/// </summary>/// <returns></returns>public void Calculate(){_xlApp.Calculate();}/// <summary>/// 强制重新计算所有打开的工作簿、特定的工作簿或者特定的范围/// </summary>/// <returns></returns>public void Calculate(Excel.Worksheet sheet){sheet.Calculate();}/// <summary>/// 强制重新计算所有打开的工作簿、特定的工作簿或者特定的范围/// </summary>/// <returns></returns>public void Calculate(Excel.Range range){range.Calculate();}/// <summary>/// 激活指定索引的工作薄并返回。索引太大会返回最后一个,太小则返回第一个工作薄。/// </summary>/// <param name="index">有效索引,索引太大会返回最后一个,太小则返回第一个工作薄。</param>/// <returns></returns>public Excel.Workbook Activate(int index){Excel.Workbook bookReturn = null;bookReturn = this[index];bookReturn.Activate();return bookReturn;}/// <summary>/// 激活指定的工作薄并返回。不存则返回null。/// </summary>/// <param name="name">工作薄名,如果保存了则要带.xls,没保存则不带</param>/// <returns></returns>public Excel.Workbook Activate(string name){Excel.Workbook bookReturn = null;bookReturn = this[name];if (bookReturn != null){bookReturn.Activate();}return bookReturn;}/// <summary>/// 删除指定位置的工作薄/// </summary>/// <param name="index">指定要删除的位置</param>/// <returns></returns>public void Remove(int index){Excel.Workbook book = this[index];if (book != null){//保存是否有关闭窗口时的提示开关bool blnTmp = _xlApp.DisplayAlerts;_xlApp.DisplayAlerts = false;book.Saved = true;book.Close(oMissing,oMissing,oMissing);_xlApp.DisplayAlerts = blnTmp;}}/// <summary>/// 删除指定名称的工作薄/// </summary>/// <param name="name">指定要删除的工作薄名</param>/// <returns></returns>public void Remove(string name){Excel.Workbook book = this[name];if (book != null){//保存是否有关闭窗口时的提示开关bool blnTmp = _xlApp.DisplayAlerts;_xlApp.DisplayAlerts = false;book.Saved = true;book.Close(oMissing,oMissing,oMissing);_xlApp.DisplayAlerts = blnTmp;}}/// <summary>/// 清除所有工作薄,与Close()方法相同点为都关闭所有工作薄窗口,但本方法不会有任何提示。/// </summary>public void Clear(){//保存是否有关闭窗口时的提示开关bool blnTmp = _xlApp.DisplayAlerts;_xlApp.DisplayAlerts = false;foreach(Excel.Workbook book in this){book.Saved = true;book.Close(oMissing,oMissing,oMissing);}_xlApp.DisplayAlerts = blnTmp;}/// <summary>/// 可以用foreach访问每一个工作薄。/// </summary>/// <returns></returns>public System.Collections.IEnumerator GetEnumerator(){int count = GetWorkbooksCount();Excel.Workbook[] arr = new Excel.Workbook[count];for(int i = 0 ; i < count ; i++){arr[i] = (Excel.Workbook)_xlApp.Workbooks[i+1];//Excel索引从1开始}return arr.GetEnumerator();}/// <summary>/// 获取工作薄数量/// </summary>/// <returns></returns>private int GetWorkbooksCount(){int booksCount = _xlApp.Workbooks.Count;return booksCount;}/// <summary>/// 获取本程序的开发者信息。如果您在开发使用过程中遇到什么困难或有新的想法或建议,请您与作者联系。/// 我们的宗旨是:普及.NET教育推广常用技术分享实用源码/// </summary>public void PrintDeveloperInfoToConsole(){string authorInfo = "\n\r" +"作 者:长江支流(周方勇)" + "\n\r" +"Email:MisGoldPrinter@163.com QQ:150439795" + "\n\r" +"网 址:www.webmis.com.cn";Console.WriteLine(authorInfo);}}//End class}//End Namespace
相关源码下载信息请访问:
http://blog.csdn.net/flygoldfish
声明:本文版权为周方勇所有,欢迎转载,请保留完整的内容及出处。
flygoldfish@163.com