首页 > 代码库 > Excel处理神器Spire.XLS,我的第一节封装

Excel处理神器Spire.XLS,我的第一节封装

正文

前言:最近项目里面有一些对Excel操作的需求,博主想都没想,NPOI呗,简单、开源、免费,大家都喜欢!确实,对于一些简单的Excel导入、导出、合并单元格等,它都没啥太大的问题,但是这次的需求有两点是NPOI搞不定的:

  1. 导入Excel后,需要切割Excel的Sheet页,然后每个Sheet页单独生成一个PDF文件。
  2. 导出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,我的第一节封装