ExcelManager--基于.Net的Excel读写管理类库(一)
1.0
初稿
林付国
<chsdate isrocdate="False" islunardate="False" day="27" month="5" year="2006" w:st="on"><span>2006-5-27</span></chsdate>
1.1
增加约束及注意事项
林付国
?
?
?
?
?
?
?
?
目录
一、目标... 2
二、功能... 2
三、约束... 2
四、注意事项... 2
六、适用范围... 3
五、性能测试... 3
六、使用方法... 3
七、版权... 6
一、目标ExcelManager的目标,便是设计一个基于.Net的通用的Excel读写管理类库,以简化基于.Net平台的Excel应用开发。
二、功能?????? 目前,ExcelManager主要关注以下几个方面:
1.????? 文件读取
2.????? 文件某单元格读取
3.????? 文件写入
4.????? 包括样式的某单元格写入
三、约束1.????? 执行导出机器上需要装有Office组件,且Excel文件版本在2000以上
2.????? 读取Excel文件,在第一行必须依次存储二个范围,用于限定参数状态位,依次为:需要读取的起始单元格名称,结束单元格名称
3.????? 需读取的每个Excel数据文件,必须有于之配对的同名XML架构文件(扩展项可支持不同文件名,不推荐此项)
4.????? 写文件时,推荐先建立空Excel文件(扩展项可支持自动创建Excel文件,不推荐此项)
5.????? 当前版本主要实现大数据量的读写操作,对逐Cell读写及Cell格式设置方面暂不涉及
6.????? 其它约束按照.Net框架及Microsoft Office Excel相关约定。
四、注意事项1.??????? Excel读文件目前仅支持单工作簿,单工作表读取
2.??????? 使用读写功能时需要指定当前操作Sheet表(默认为Sheet1),请使用索引枚举EnumType.SheetIndex方式
3.??????? 写Excel文件,提供(普通,ReWrite重写,Append追加)三种操作方式;普通方式为正常情况下对新文件写入,重写是对原数据进行覆盖性重写,追加则是在指定Sheet之后追加数据,若进行大数据量写入操作,请用此项。 “重写”和“追加”操作中,若写入时超过当前Sheet最大容量则自动创建Sheet表继续写入
4.??????? 写入数据量的大小要求单次写入:60000行以内,255列以内,Cell值长度1-255字符,目前写操作仅支持单工作簿,最大存在32个Sheet,每Sheet最大存储量为60000行
5.??????? 写入数据时,若不对Sheet重命名,请设置SheetName属性为空值,按照Excel约定SheetName的名称不能超过32字符
6.??????? 本版本暂不提供数据插入功能
六、适用范围?????? 此操作类库适用与.NET平台下的Windows应用程序及Web应用程序
五、性能测试?????? 环境:WindowsXP、Pentium(R)4 CPU 2.8GHZ、512MB内存。
Excel单文件追加测试结果:
数据量?????????? 时间
5W??????? ?????? 7S
15W????????????? 26S
25W????????????? 41S
40W????????????? 59S
50W????????????? 1:24S
60W????????????? 1:39S
60W????????????? 1:52S
100W??????????? 3:27S
六、使用方法引用 las.foundation.Interfaces,las.foundation.ExcelManager,las.foundation.SmartExcel
?????? 1.读取Excel文件
?DataSet?ds?=?new?DataSet();
????????????????????????????IExcelManager?iex?=?null;
????????????????????????????try
????????????????????????????
{?
?????????????????????????????????????iex?=?ExcelManagerFactory.Instance().CreateExcelManager();
?????????????????????????????????????iex.FilePath?=需读取文件名;
?????????????????????????????????????if?(Xml架构文件?!=?"")
?????????????????????????????????????
{
???????????????????????????????????????????????iex.XMLFilePath?=Xml架构文件;
?????????????????????????????????????}
?????????????????????????????????????iex.Open();
?????????????????????????????????????//?指定当前读取的工作表,用索引方式(Sheet1—Sheet32)
?????????????????????????????????????iex.ActiveSheet(EnumType.SheetIndex.Sheet1);
?????????????????????????????????????ds?=?iex.Read();
????????????????????????????}
????????????????????????????catch(Exception?ex)
????????????????????????????
{
?????????????????????????????????????MessageBox.Show(ex.Message.ToString());
????????????????????????????}
????????????????????????????finally
????????????????????????????
{
?????????????????????????????????????if(iex?!=?null)
?????????????????????????????????????
{
???????????????????????????????????????????????iex.Close();
?????????????????????????????????????}
????????????????????????????}

?????? 2.读取Cell单元格
IExcelManager?iex?=?null;??????????
?????????????????????try
?????????????????????
{?
????????????????????????????iex?=?ExcelManagerFactory.Instance().CreateExcelManager();
????????????????????????????iex.FilePath?=?读取的文件名;
if?(Xml架构文件?!=?"")
?????????????????????????????????????
{
???????????????????????????????????????????????iex.XMLFilePath?=Xml架构文件;
?????????????????????????????????????}
????????????????????????????iex.Open();
?????????????????????????????????????//?指定当前读取的工作表,用索引方式(Sheet1—Sheet32)
?????????????????????????????????????iex.ActiveSheet(EnumType.SheetIndex.Sheet1);
????????????????????????????strRet?=?iex.ReadCell(单元格名称);
?????????????????????}
?????????????????????catch(Exception?ex)
?????????????????????
{
????????????????????????????MessageBox.Show(ex.Message.ToString());
?????????????????????}
?????????????????????finally
?????????????????????
{
????????????????????????????if(iex?!=?null)
????????????????????????????
{
???????????????????????????????????iex.Close();???
????????????????????????????}
?????????????????????}

?????? 3.写入文件
?IExcelManager?iex?=?null;??????????
?????????????????????string?strPa?=?"";
?????????????????????strPa?=?this.txtFileName.Text;??????????????????????????????????????????????????????????
?????????????????????try
?????????????????????
{
????????????????????????????iex?=?ExcelManagerFactory.Instance().CreateExcelManager();
????????????????????????????iex.FilePath?=?strPa;
????????????????????????????iex.DataSource?=?数据源;
????????????????????????????iex.WriteType?=?EnumType.WriteType.None;
????????????????????????????iex.SheetName?=?设置Sheet名称
????????????????????????????iex.OpenCreate();
?????????????????????????????????????//?指定当前读取的工作表,用索引方式(Sheet1—Sheet32)
?????????????????????????????????????iex.ActiveSheet(EnumType.SheetIndex.Sheet1);
????????????????????????????iex.Write();
????????????????????????????//?重写数据
//iex.ReWrite(重写开始行);
?????????????????????}
?????????????????????catch(Exception?ex)
?????????????????????
{
????????????????????????????MessageBox.Show(ex.Message.ToString());
?????????????????????}
?????????????????????finally
?????????????????????
{
????????????????????????????if(iex?!=?null)
????????????????????????????
{
???????????????????????????????????iex.Close();
????????????????????????????}
?????????????????????}

?????? 4.写入数据至某单元格
IExcelManager?iex?=?null;??????????
?????????????????????string?strPa?=?写入的文件名;
?????????????????????try
?????????????????????
{
????????????????????????????iex?=?ExcelManagerFactory.Instance().CreateExcelManager();
????????????????????????????iex.FilePath?=?strPa;
????????????????????????????iex.BackColor?=背景颜色;
????????????????????????????iex.ForeColor?=字体颜色
????????????????????????????iex.Font?=?字体样式;
???????????????????????????iex.OpenCreate();?????????????????????
???????????????????????????????????????????????//?指定当前读取的工作表,用索引方式(Sheet1—Sheet32)
???????????????????????????????????????????????iex.ActiveSheet(EnumType.SheetIndex.Sheet1);??????
????iex.WriteCell(行,列,写入值);
????????????????????????????}
?????????????????????catch(Exception?ex)
?????????????????????
{
????????????????????????????MessageBox.Show(ex.Message.ToString());
?????????????????????}
?????????????????????finally
?????????????????????
{
????????????????????????????if(iex?!=?null)
????????????????????????????
{
???????????????????????????????????iex.Close();???
????????????????????????????}
?????????????????????}
??????????????????????????????????????????????????????????????????????
?
五、参考:?
1.??????? .NET操作Excel COM对象
2.??????? Microsoft MSDN
3.??????? http://support.microsoft.com/default.aspx?scid=kb;zh-cn;306023
4.??????? http://support.microsoft.com/kb/283667/zh-cn
5.??????? 文件创建部分参考博客园灵感之源vb.net SmartExcel及鞠强C#SmartExcel两位朋友的方法,感谢两位朋友所付出的劳动,谢谢!
??????????? (个人意见:鉴于此方法使用组件的问题,不建议用此方法)??如有兴趣的朋友可以查看
ExcelManager的技术,思想都来自于网络,鉴于人人为我,我为人人,基于网络,服务于网络的原则,大家可以自由借鉴其中好的部分。当然由于各种原因,此版本仅到1.1版本,其中内部还有很多地方存在不足,需要完善,有时间我会继续完善,有机会参考java中的javaExcelAPI的进行更好的实现。
如果你有更好的想法,请不吝赐教,其它相关服务可以与我联系(MSN:linfuguo@hotmail.com)。
八、设计图
1.User Case
2.基本类图
3.写入文件序列图
4.读取文件序列图
