循序渐进,探寻Excel二次开发.NET源码(4)-WorkBooks类

循序渐进,探寻Excel二次开发.NET源码(4)-WorkBooks类
--Excel打开关闭打印预览
作者:长江支流

关键字:.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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值