zoukankan      html  css  js  c++  java
  • Spire.XLS,生成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

    3、程序撰写

    3.1、创建、加载 Excel文件

    using Spire.Xls;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using Spire.Pdf;
    using Spire.Xls.Converter;
    
    namespace CommonCS
    {
        public class SpireInfos : IDisposable
        {
            private LoadConfig config = new LoadConfig();
            public string ExcelFilePth { get; set; }//Excel保存路径
            public string PdfFilePth { get; set; }//Pdf保存路径
            public string wordFilePth { get; set; }//Word Doc保存路径
            public string swfFilePth { get; set; }//swf Flash文件保存路径
    
            public SpireInfos()
            {
                ExcelFilePth = config.configManager.getConfig("path.xls");
                PdfFilePth = config.configManager.getConfig("path.pdf");
                wordFilePth = config.configManager.getConfig("path.doc");
                swfFilePth = config.configManager.getConfig("path.swf");
            }
    
            #region 保存Excel文件
            /// <summary>
            /// 保存Excel文件
            /// </summary>
            /// <param name="workbook">workBook</param>
            /// <param name="FileName">文件名称</param>
            public void SavaXls(Workbook workbook,string FileName="")
            {
                if (!string.IsNullOrEmpty(FileName))
                {
                    workbook.SaveToFile(ExcelFilePth + FileName + ".xlsx", ExcelVersion.Version2010);
                }
                else
                {
                    workbook.SaveToFile(ExcelFilePth + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xlsx", ExcelVersion.Version2010);
                }
            }
            #endregion 
    
            #region 加载Excel文件 常用于加载模板
            /// <summary>
            /// 加载已存在的Excel文件 不能加载受密码保护的文件
            /// </summary>
            /// <param name="fileName">文件名称</param>
            /// <param name="version"></param>
            public void LoadFromFile(Workbook workbook,string fileName, ExcelVersion version = ExcelVersion.Version2010,string Pth="")
            {
                if (string.IsNullOrEmpty(Pth))
                {
                    workbook.LoadFromFile(config.configManager.getConfig("path.xls") + fileName + ".xlsx", version);
                }
                else
                {
                    workbook.LoadFromFile(Pth + fileName + ".xlsx", version);
                }
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="fileName">加载有密码保护的Excel文档</param>
            /// <param name="separator">密码</param>
            public void LoadFromFile(Workbook workbook, string fileName, string separator, string Pth = "")
            {
                if (string.IsNullOrEmpty(Pth))
                {
                    workbook.LoadFromFile(config.configManager.getConfig("path.xls") + fileName + ".xlsx", separator);
                }
                else
                {
                    workbook.LoadFromFile(Pth + fileName + ".xlsx", separator);
                }
                
            }
            #endregion
    
            #region Spire.Xls 导入与导出 
            /// <summary>
            /// 读取Excel数据 并导入到数据库
            /// </summary>
            /// <param name="workbook"></param>
            /// <param name="fileName"></param>
            /// <param name="sheetIndex"></param>
            /// <param name="version"></param>
            /// <param name="Pth"></param>
            /// <returns></returns>
            public DataTable ReportToDataTable(Workbook workbook, string fileName,int sheetIndex=0, ExcelVersion version = ExcelVersion.Version2010, string Pth = "")
            {
                LoadFromFile(workbook, fileName, version, Pth);
                Worksheet sheet = workbook.Worksheets[sheetIndex];
                DataTable dt = sheet.ExportDataTable();
                return dt;
    
            }
    
            /// <summary>
            /// 读取数据库 并导入到Excel
            /// </summary>
            /// <param name="workbook"></param>
            /// <param name="dt">从数据库中获取</param>
            /// <param name="sheetIndex">索引值</param>
            public void ReportToExcel(Workbook workbook, DataTable dt, int sheetIndex = 0)
            {
                Worksheet sheet = workbook.Worksheets[sheetIndex];
                int rowscount = sheet.InsertDataTable(dt, true, 1, 1);
                SavaXls(workbook);
    
            }
            #endregion
    
            #region 将 Excel 转化为PDF 
            /// <summary>
            /// 将 Excel 转化为PDF  免费应用 会生成广告
            /// </summary>
            /// <param name="workbook"></param>
            /// <param name="ExcelfileName">加载的Excel文件名 不带扩展名</param>
            /// <param name="PdffileName">要保存的Pdf文件名 不带扩展名</param>
            /// <param name="version"></param>
            /// <param name="Pth">加载的Excel文件路径</param>
            public void ExcelToPdf(Workbook workbook, string ExcelfileName, string PdffileName, ExcelVersion version = ExcelVersion.Version2010, string Pth = "")
            {
                LoadFromFile(workbook, ExcelfileName, version, Pth);
                PdfDocument pdfDocument = new PdfDocument();
                pdfDocument.PageSettings.Orientation = PdfPageOrientation.Landscape;
                pdfDocument.PageSettings.Width = 970;
                pdfDocument.PageSettings.Height = 850;
    
                PdfConverter pdfConverter = new PdfConverter(workbook);
                PdfConverterSettings settings = new PdfConverterSettings();
                settings.TemplateDocument = pdfDocument;
                pdfDocument = pdfConverter.Convert(settings);
                pdfDocument.SaveToFile(PdfFilePth + PdffileName + ".pdf", Spire.Pdf.FileFormat.PDF);
            }
            #endregion
    
            #region xls 与 xlsx 之间的相互转化 向下兼容
            //Excel 97-2003与Excel 2007在C#中的转换
    
            public void XlsConvertXlsx(Workbook workbook, string OldFileName, string NewFileName="", ExcelVersion version = ExcelVersion.Version97to2003, string Pth = "")
            {
                if (string.IsNullOrEmpty(Pth))
                {
                    workbook.LoadFromFile(config.configManager.getConfig("path.xls") + OldFileName + ".xls", version);
                }
                else
                {
                    workbook.LoadFromFile(Pth + OldFileName + ".xls", version);
                }
                SavaXls(workbook, NewFileName);
            }
    
            public void XlsxConvertXls(Workbook workbook,  string OldFileName, string NewFileName="", ExcelVersion version = ExcelVersion.Version2010, string Pth = "")
            {
                LoadFromFile(workbook, OldFileName);
                if (!string.IsNullOrEmpty(NewFileName))
                {
                    workbook.SaveToFile(ExcelFilePth + NewFileName + ".xlsx", ExcelVersion.Version2010);
                }
                else
                {
                    workbook.SaveToFile(ExcelFilePth + DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xlsx", ExcelVersion.Version2010);
                }
            }
            #endregion
    
            #region Excel sheet操作
            public void RemoveAllSheet()
            {
    
            }
            #endregion
    
            #region 释放资源
            /// <summary>
            /// 释放资源
            /// </summary>
            public void Dispose(Workbook workbook)
            {
                workbook.Dispose();
            } 
            
            public void Dispose()
            {
                throw new NotImplementedException();
            }
            #endregion
        }
    }

    大家不要被LoadConfig迷惑,我只是把文件保存的路径放在Config文件里了,上述程序中 config.configManager.getConfig("path.xls");只是返回一个路径,例如:C://Test/ 

    以上便是创建、加载Excel文件的代码,现在我们作一个简单的调用,代码如下:

    public class IndexModel
        {
            Workbook workbook = new Workbook();
            SpireInfos SpireInfosModel = new SpireInfos();
            public void HelloExcel()
            {
                SpireInfosModel.SavaXls(workbook,"第一次简单测试");
            }
        }

    这样就会生成一个简单的Excel文件:

    现在我们右键这个Excel文件,并选择属性~详细信息选项卡,如下:

    我们看到,‘第一次简单测试.xlsx’文件属性~详细信息中的标题,主题,作者等信息没有值,我们如果通过程序修改这些属性的值呢?

    修改Excel属性的代码如下:

    public class IndexModel
        {
            Workbook workbook = new Workbook();
            SpireInfos SpireInfosModel = new SpireInfos();
            public void HelloExcel()
            {
                workbook.DocumentProperties.Author = "Jack.Chen";            //作者
                workbook.DocumentProperties.Subject = "Excel文档属性主题";   //主题
                workbook.DocumentProperties.Title = "Excel文档属性标题";    //标题
                workbook.DocumentProperties.Company = "Excel文档所属单位";     //单位
                workbook.DocumentProperties.Comments = "Excel文档备注";  //备注
                workbook.DocumentProperties.Keywords = "Excel文档标记";   //标记
                workbook.DocumentProperties.CreatedTime = DateTime.Now; //创建时间
                workbook.DocumentProperties.Category = "Excel文档分类";//类别
                workbook.DocumentProperties.Manager = "EXcel管理员";//管理员
                workbook.DocumentProperties.LastSaveTime = DateTime.Now;//最后一次保存时间
                workbook.DocumentProperties.RevisionNumber = "V1.0";//版本修订号
                workbook.DocumentProperties.ApplicationName = "ApplicationName";//程序名称
                SpireInfosModel.SavaXls(workbook,"我是修改属性后的Excel文件");
            }
        }

    执行程序,会得到如下的Excel文件:

    对于保密性较高的文件,我们有必要对Excel文件进行加密,那么,我们如何实现Excel文件的加密呢?

    加密Excel文件,代码如下:

        public class IndexModel
        {
            Workbook workbook = new Workbook();
            SpireInfos SpireInfosModel = new SpireInfos();
            public void HelloExcel()
            {
                //Excel 加密  如果文档加密  属性设置是无效的...
                workbook.Protect("123456");//设置Excel文档的打开密码
                SpireInfosModel.SavaXls(workbook,"我是加密的Excel文件");
            }
        }

    效果图如下:

    代码备注中有这么一句话:加密后,属性设置无效,大家可以吧属性设置和加密放在一起试试,在此不作实验了!

    如果仅仅加密文件不能满足安全性的要求?那么我们还可以加密文档中的Sheet!如果实现加密Sheet呢?

    代码如下:

        public class IndexModel
        {
            Workbook workbook = new Workbook();
            SpireInfos SpireInfosModel = new SpireInfos();
            public void HelloExcel()
            {
                //Excel 加密  如果文档加密  属性设置是无效的...
                workbook.Protect("123456");//设置Excel文档的打开密码
                //继续对Sheet加密
                Worksheet sheet = workbook.Worksheets[0];
                sheet.Range["A1"].Text = "锁定";
                sheet.Range["B1"].Text = "未锁定";
                sheet.Protect("654321", SheetProtectionType.All);//密码 654321
                SpireInfosModel.SavaXls(workbook,"我是双重加密的Excel文件");
            }
        }

    当我们尝试编辑Excel单元格时,会出现如下提醒:

    那么,我们可以按照上述提示,输入密码进行解锁,在此不作演示。

    项目中的需求不仅仅是创建Excel文件,很多时候会使用加载一个已经存在的文件,特别是加载模板Excel文件。那么,如何加载已经存在的Excel文件呢?

     现在,我们选择加载我们第一次测试时生成的Excel文件,即文件:第一次简单测试.Xlsx

    代码示例如下:

        public class IndexModel
        {
            Workbook workbook = new Workbook();
            SpireInfos SpireInfosModel = new SpireInfos();
            public void HelloExcel()
            {
                SpireInfosModel.LoadFromFile(workbook, "第一次简单测试");
                Worksheet sheet = workbook.Worksheets[0];
                for (int j = 1; j < 11; j++)
                {
                    sheet.Range["A" + j].Text = j.ToString();
                    sheet.Range["B" + j].Text = j.ToString();
                }
                SpireInfosModel.SavaXls(workbook);
            }
        }

    程序中演示过程如下:加载Excel文件:第一次简单测试.Xlsx,然后操作文件单元格,分别对单元格A1~A10/B1~B10赋值。赋值完毕后,并保存为新的文件

    新文件如下:

     

    以上便是加载Excel文件。

    在本节案例中,都是些简单的案例,以后我还会深入学习这个插件,会持续写关于本插件的使用!

    注:以上程序撰写的过程中,忘记了释放资源,大家可在自己的程序中添加上,这样程序会更加完善!

    参考文献:http://www.cnblogs.com/asxinyu/p/4374015.html

    官网文献:https://www.e-iceblue.com/Tutorials/Spire.XLS/Spire.XLS-Program-Guide/Spire.XLS-Program-Guide-Content.html

    @陈卧龙的博客

  • 相关阅读:
    css优化总结
    几种常用的图片格式
    css布局总结
    第四章复习题
    4.9,4.10
    4.8
    4.7指针
    libffi
    代理模式
    Redis 汇总
  • 原文地址:https://www.cnblogs.com/chenwolong/p/Spire.html
Copyright © 2011-2022 走看看