一、组件介绍

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=, 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 = )
{
Worksheet sheet = workbook.Worksheets[sheetIndex];
int rowscount = sheet.InsertDataTable(dt, true, , );
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 = ;
pdfDocument.PageSettings.Height = ; 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("");//设置Excel文档的打开密码
SpireInfosModel.SavaXls(workbook,"我是加密的Excel文件");
}
}

效果图如下:

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

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

代码如下:

    public class IndexModel
{
Workbook workbook = new Workbook();
SpireInfos SpireInfosModel = new SpireInfos();
public void HelloExcel()
{
//Excel 加密 如果文档加密 属性设置是无效的...
workbook.Protect("");//设置Excel文档的打开密码
//继续对Sheet加密
Worksheet sheet = workbook.Worksheets[];
sheet.Range["A1"].Text = "锁定";
sheet.Range["B1"].Text = "未锁定";
sheet.Protect("", 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[];
for (int j = ; j < ; 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

@陈卧龙的博客

Spire.XLS,生成Excel文件、加载Excel文件的更多相关文章

  1. java_基础——用代码编译.java文件+加载class文件

    [本文介绍] 本文不是深入理解和使用java编译器,只是在代码里编译.java文件的helloWorld.这种技术还是蛮有意思的,说不定在将来的某些只能化项目会运用到!^_^ [简单编译的流程] [j ...

  2. xml文件 加载properties文件的两种方法与注意事项

    1.遇到的问题: 配置redisSpringContext.xml 时,遇到 properties加载失败,提示BeanDefinitionStoreException  和   java.lang. ...

  3. 二十:jinja2之加载静态文件

    静态文件: flask默认指定的静态文件路径为根目录下的static,可以自定义路径,并指定,使用url_for('文件夹', filename='文件名')引用 加载css文件 加载js文件 其他文 ...

  4. 从excel表格加载数据返回DataSet

    添加命名空间:using System.Data.OleDb; /// <summary> /// 从excel表格加载数据返回DataSet /// </summary> / ...

  5. SQL Server ->> 自动创建表并从文件加载数据

    这个存储过程自动创建表并从文件加载数据. 有一点需要说明的是Excel 12.0驱动是兼容了Excel 97-2003和Excel 2007两者格式的Excel文件. CREATE PROCEDURE ...

  6. Java提高篇——JVM加载class文件的原理机制

    在面试java工程师的时候,这道题经常被问到,故需特别注意. 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后 ...

  7. assets 加载资源文件

    引用:http://abc20899.iteye.com/blog/1096620 1.获取资源的输入流 资源文件 sample.txt 位于 $PROJECT_HOME/assets/ 目录下,可以 ...

  8. 如何在SCENEKIT使用SWIFT RUNTIME动态加载COLLADA文件

    问题:今天接到一个项目,负责弄需求的美眉跟我讲能不能做一个原型能够加载Collada文件,流程如下: 用户用app下载Collada 压缩包(如内购项目) 压缩包解压 展示Collada文件里的内容 ...

  9. ios – 使用UINib加载xib文件实现UITableViewCell

    xib文件的实质是xml,描述界面对象,每个对象都有一个很重要的属性,identity inspector面板中class属性,加载xib文件的时候实际上是实例化界面对象相对应的这些class. xi ...

随机推荐

  1. 从 RegExp 构造器看 JS 字符串转义设计

    多年前我第一次入职腾讯的时候,DC 从杭州给我寄来了一本他刚翻译出炉的<高性能 JavaScript>.那段时间为了帮忙校对,我仔细阅读了书中的每一个段落,结果积累了不少 JavaScri ...

  2. 彻底关闭windows10自动更新解决方案

    window10的自动更新其实和window7和window8都有所不同,有些人认为只要停止了windows updates 就可以了,不会再开始了! 但是往往不是这样的,因为微软在window up ...

  3. 聊聊分布式开发 Spring Cloud

    概述 本文章只是简单介绍了微服务开发的一些关键词,如果需要知道具体实现和可以评论留言 我会及时的增加连接写出具体实现(感觉没人看 就没写具体实现). 持续更新中...... SpringCloud和D ...

  4. linux-Navicat 连接数据库 报错10060 & Navicat连接报错1146

    1.mysql数据库设置远程连接权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;[回 ...

  5. spring的核心组件及作用(一)

    Spring的核心组件有: Context     Core     Bean. 如果要在这三个核心组件上挑出一个最核心的组件,那就是Bean组件了. Spring的特性功能有:WEB ORM AOP ...

  6. RIpng配置(GNS3)(第九组)

    一.拓扑图 二.路由器配置 路由器R1的配置(配置RIP静态路由协议,路由器对应接口配置相对应的ipv6地址,并给每个接口配置RIP 1 enable) 路由器R2的配置(配置RIP静态路由协议,路由 ...

  7. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十五║初探SSR服务端渲染(个人博客二)

    缘起 时间真快,现在已经是这个系列教程的下半部 Vue 第 12 篇了,昨天我也简单思考了下,可能明天再来一篇,Vue 就基本告一段落了,因为什么呢,这里给大家说个题外话,当时写博文的时候,只是想给大 ...

  8. 【一套代码小程序&Native&Web阶段总结篇】可以这样阅读Vue源码

    前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 在实际代码过程中我们发现,我们可能又要做H5站又要做小程序同时还要做个APP,这里会造成很大的资源浪费,如果设定一 ...

  9. 【设计模式+原型理解】第三章:javascript五种继承父类方式

    [前言] 我们都知道,面向对象(类)的三大特征:封装.继承.多态 继承:子类继承父类的私有属性和公有方法 封装:把相同的代码写在一个函数中 多态: ->重载:JS严格意义上是没有重载,但可以通过 ...

  10. 简单介绍shell编程四剑客之grep

    概要:分别的作用 grep:文本过滤(模式:pattern)工具,grep,egrep,fgrep,擅长过滤. sed:stream editor 文本编辑工具:(流编辑器),擅长取行.替换. awk ...