循序渐进,探寻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