首页 > 代码库 > Excel处理神器Spire.XLS,我的第一节封装
Excel处理神器Spire.XLS,我的第一节封装
正文
前言:最近项目里面有一些对Excel操作的需求,博主想都没想,NPOI呗,简单、开源、免费,大家都喜欢!确实,对于一些简单的Excel导入、导出、合并单元格等,它都没啥太大的问题,但是这次的需求有两点是NPOI搞不定的:
- 导入Excel后,需要切割Excel的Sheet页,然后每个Sheet页单独生成一个PDF文件。
- 导出Excel的时候,项目里面需要将一些数据表格以图表的形式在Excel里面展示。
一、组件介绍
Spire.XLS是E-iceblue开发的一套基于企业级的专业Office文档处理的组件之一,全称Spire.Office for .NET。旗下有Spire.Doc,Spire XLS,Spire.PDF,Spire.BarCode等多款专业组件,为各种Office文档在程序处理上提供了很大的方便,官方为各种功能提供了大量的在线api,简化了使用组件的难度。组件使用时不需要本地Office组件的支持。Spire.Office是一款企业级组件,它提供了收费版本和免费版本两种级别,一般来说,对于个人的应用,免费版本已足够用。比如对于上文博主遇到的问题,Spire.XLS组件就提供了很好的实现机制,如果你也遇到了NPOI解决不了的问题,不妨试试这个。
“XLS”是Excel文件的后缀之一,顾名思义,Spire.XLS当然就是针对Excel表格处理的组件喽,本篇,博主将结合上文遇到的问题来看看Spire.XLS组件的强大功能。
二、组件安装使用
对于组件的安装,在此还是提供两种方式:
1、官方下载安装
下载地址。官方下载的安装包是msi结尾的,安装时需要选择支持的VS版本等信息,软件的安装就不做过多说明,有兴趣的可以下载试试。
2、Nuget安装
大家最喜欢的应该还是Nuget方式吧,简单,方便,并且易于管理。博主也是不太喜欢为了一个组件而去单独下载一个安装包。
Spire.XLS也提供了Nuget的方式,只需要搜索Spire,选择免费版的组件即可:
安装完成后自动引用了需要的dll
三、组件功能介绍
关于Excel的一些常用操作,比如取值、赋值、设置单元格样式等,这里就不做过多介绍,无论是Com组件、NPOI还是Aspose,这些都是最基础的功能。下面就针对上文提出的几个问题着重说明下。
四、写个程序试一试
今天,我大致封装了下
简介:本程序用到了三个关联的类,分别为:SpireInfo.cs 和 FlexPaperConfig.cs 和 LoadConfig.cs
SpireInfo.cs 主要用于操作Excel文件,例如,创建Excel文件、 加载Excel文件、 创建带有密码保护的Excel文件 、释放资源、消除Excel密码等,FlexPaperConfig.cs、LoadConfig.cs 这两个类主要操作一个配置文件,我们利用配置文件存放Excel路径,利用XML 读取配置文件等
下面分别贴出代码:
namespace CommonCS { /// <summary> /// 20170425陈卧龙创建 office版本为2010 扩展名为xlsx 在此不作重复说明 /// </summary> public class SpireInfo { LoadConfig config = new LoadConfig(); Workbook workbook = new Workbook(); #region 创建并保存Excel /// <summary> /// 简单保存一个Excel文件 /// <param name="pwd">是否加密 如果加密 pwd为Excel文件打开的密码</param> /// </summary> public void SavaXls(string pwd = "") { string Pth = config.configManager.getConfig("path.xls") + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xlsx"; if (!string.IsNullOrEmpty(pwd)) { workbook.Protect(pwd);//设置保护加密的 密码 :pwd } //将Excel文件保存到指定文件,还可以指定Excel版本 workbook.SaveToFile(Pth, ExcelVersion.Version2010); } /// <summary> /// 保存详细属性的Excel文件 /// </summary> /// <param name="xls"></param> /// <param name="pwd">如果是加密的Excel 文件的详情将不会显示</param> public void SavaXls(XlsInfo xls, string pwd = "") { string Pth = xls.xlsFileName; //修改文档属性信息,这样在发布的时候,可以通过文档显示公司以及文件人的信息 workbook.DocumentProperties.Author = xls.xlsAuthor; //作者 workbook.DocumentProperties.Subject = xls.xlsSubject; //主题 workbook.DocumentProperties.Title = xls.xlsTitle; //标题 workbook.DocumentProperties.Company = xls.xlsCompany; //单位 workbook.DocumentProperties.Comments = xls.xlsComments; //备注 workbook.DocumentProperties.Keywords = xls.xlsKeywords; //标记 workbook.DocumentProperties.CreatedTime = xls.xlsCreatedTime; //创建时间 if (!string.IsNullOrEmpty(pwd)) { workbook.Protect(pwd);//设置保护加密的 密码 :pwd } //创建Excel sheet的保护机制 //Worksheet sheet = workbook.Worksheets[0]; //sheet.Protect("test", SheetProtectionType.All); //保护结束 //将Excel文件保存到指定文件,还可以指定Excel版本 workbook.SaveToFile(Pth, ExcelVersion.Version2010); } #endregion #region 消除加密的Excel密码 /// <summary> /// /// </summary> public void UnProtect() { workbook.UnProtect(); } /// <summary> /// 消除加密的Excel /// </summary> /// <param name="pwd"></param> public void UnProtectWorkbook(string pwd) { workbook.UnProtectWorkbook(pwd); } #endregion #region 加载Excel文件 /// <summary> /// 加载已存在的Excel文件 不能加载受密码保护的文件 /// </summary> /// <param name="fileName">文件名称</param> /// <param name="version"></param> public void LoadFromFile(string fileName, ExcelVersion version = ExcelVersion.Version2010) { workbook.LoadFromFile(config.configManager.getConfig("path.xls") + fileName, version); } /// <summary> /// /// </summary> /// <param name="fileName">加载有密码保护的Excel文档</param> /// <param name="separator">密码</param> public void LoadFromFile(string fileName, string separator) { workbook.LoadFromFile(config.configManager.getConfig("path.xls") + fileName, separator); } #endregion #region 释放资源 /// <summary> /// 释放资源 /// </summary> public void Dispose() { workbook.Dispose(); } #endregion } public class XlsInfo { public string xlsFileName { get; set; }//xls名称 如:2011.xlsx office版本 2010 即:ExcelVersion.Version2010 public string xlsAuthor { get; set; }//Excel文件属性 Excel文件的作者 右键 详情展示 public string xlsSubject { get; set; }//Excel文件属性 Excel文件的主题 右键 详情展示 public string xlsTitle { get; set; }//Excel文件属性 Excel文件的标题 右键 详情展示 public string xlsCompany { get; set; }//Excel文件属性 Excel文件的单位 右键 详情展示 public string xlsComments { get; set; }//Excel文件属性 Excel文件的备注 右键 详情展示 public string xlsKeywords { get; set; }//Excel文件属性 Excel文件的标记 右键 详情展示 public DateTime xlsCreatedTime { get; set; }//Excel文件属性 Excel文件的创建时间 右键 详情展示 /// <summary> /// 初始化xls文件路径 属性 /// </summary> /// <param name="dic"></param> public XlsInfo(Dictionary<string,string> dic) { LoadConfig config = new LoadConfig(); if (dic.Keys.Contains("xlsFileName")) { xlsFileName = config.configManager.getConfig("path.xls") + dic["xlsFileName"];// 2011.xlsx 此处版本为office 2010 } // if (dic.Keys.Contains("xlsAuthor")) { xlsAuthor = dic["xlsAuthor"]; } // if (dic.Keys.Contains("xlsSubject")) { xlsSubject = dic["xlsSubject"]; } // if (dic.Keys.Contains("xlsTitle")) { xlsTitle = dic["xlsTitle"]; } // if (dic.Keys.Contains("xlsCompany")) { xlsCompany = dic["xlsCompany"]; } // if (dic.Keys.Contains("xlsComments")) { xlsComments = dic["xlsComments"]; } // if (dic.Keys.Contains("xlsKeywords")) { xlsKeywords = dic["xlsKeywords"]; } // if (dic.Keys.Contains("xlsCreatedTime")) { try { xlsCreatedTime = Convert.ToDateTime(dic["xlsCreatedTime"]); } catch { xlsCreatedTime = DateTime.Now; } } if (dic.Keys.Contains("FileName")) { xlsFileName = dic["xlsFileName"]; } } } }
下一个:
namespace CommonCS { public class FlexPaperConfig { private XmlDocument _doc; private XmlNode _rootNode; public FlexPaperConfig(String mapPath) { _doc = new XmlDocument(); _doc.Load(mapPath + @"FlexPaper.config"); _rootNode = _doc.DocumentElement; } public void setConfig(String key, String value) { if (value =http://www.mamicode.com/= null || (value != null && value.Length == 0)) { return; } if (_rootNode.SelectSingleNode(key) == null || (_rootNode.SelectSingleNode(key) != null && _rootNode.SelectSingleNode(key).ChildNodes.Count == 0)) { XmlElement newNode = _doc.CreateElement(key); newNode.InnerText = value; _rootNode.AppendChild(newNode); } else { _rootNode.SelectSingleNode(key).ChildNodes[0].InnerText = value; } } public String getConfig(String key) { if (_rootNode.SelectSingleNode(key) != null) if (_rootNode.SelectSingleNode(key).ChildNodes.Count > 0) return _rootNode.SelectSingleNode(key).ChildNodes[0].Value; else return ""; else return null; } public Boolean SaveConfig(String mapPath) { try { _doc.Save(mapPath + @"FlexPaper.config"); return true; } catch { return false; } } } }
下一个:
namespace CommonCS { public class LoadConfig { public FlexPaperConfig configManager; public LoadConfig() { string mapPath = HttpContext.Current.Server.MapPath(VirtualPathUtility.GetDirectory("~")); this.configManager = new FlexPaperConfig(mapPath); } } }
最后,贴出咱们简单的配置文件,这个配置文件的作用主要是配置文件保存路径,在本程序中,文件保存不会保存在项目中,而是存放在 D:\FlexPaper\Xls\ 因此,执行本程序你需要根据配置文件配置的路径,在D盘创建对应的文件夹:
配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <config> <!-- General Settings --> <allowcache>true</allowcache> <splitmode>true</splitmode> <path.pdf>D:\FlexPaper\PDF\</path.pdf> <path.doc>D:\FlexPaper\Doc\</path.doc> <path.xls>D:\FlexPaper\Xls\</path.xls> <path.swf>D:\FlexPaper\Working\</path.swf> </config>
程序调用案例:
public void HelloExcel() { Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("xlsFileName", DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xlsx"); dic.Add("xlsAuthor", "Jack.Chen"); dic.Add("xlsSubject", "主题"); dic.Add("xlsTitle", "标题"); dic.Add("xlsCompany", "河南城建学院计算机系"); dic.Add("xlsComments", "备注"); dic.Add("xlsKeywords", "标记"); dic.Add("xlsCreatedTime", DateTime.Now.ToString()); XlsInfo xls = new XlsInfo(dic); SpireInfo SpireModel = new SpireInfo(); SpireModel.SavaXls(xls); SpireModel.Dispose(); }
这样就在D盘相应的文件夹中创建了一个Excel文件:
我们右键这个Excel,然后查看他的属性:
这样我们就成功创建一个Excel文件,至于Excel文件的加密,加载,解密等,请参照本篇代码注释,在此不作说明,代码中已经实现,大家自我测试。
至此,本节的内容就结束了!
参考文献:http://www.cnblogs.com/landeanfen/p/5888973.html
参考文献:http://www.cnblogs.com/asxinyu/p/4346907.html
@陈卧龙的博客
Excel处理神器Spire.XLS,我的第一节封装