原文:.net core下对于Excel的一些操作及使用

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。


在上一篇[.net core下配置、数据库访问等操作实现]主要介绍了读取配置,数据库操作的一些方法实例,本篇主要介绍下 .net core下针对Excel的相关操作。

对于后台相关的管理系统,Excel导出是基本的功能,下面就简单说下实现该功能的代码实现吧

EPPlus与NPOI的选择

相对于大名鼎鼎的NPOI来说,EPPlus的API更加友好,导出数据的能力也比NPOI更强大点,但在操作Excel的功能上还是NPOI强一点,如果你想导出比较复杂的Excel的话可以使用NPOI,但对于常规需求的话EPPlus基本满足了。

网上也有些两者对比的文章,可以参考下,比如[C# NPOI导出Excel和EPPlus导出Excel比较]

NPOI和EPPlus均已支持 .net core,看不同需求自行选择,这里主要讲下EPPlus的使用。

EPPlus的基本介绍

EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组件,在导出Excel的时候不需要电脑上安装office。官网地址:http://epplus.codeplex.com/

使用的话直接NuGet上获取对应的dll即可。

但有一点注意,EPPlus不支持2003版本的Excel。

创建保存Excel
using (ExcelPackage package=new ExcelPackage())
{
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");//创建worksheet
package.Save();
}
  • 1
  • 2
  • 3
  • 4
  • 5
单元格赋值

单元格赋值很简单,指定对应的单元格就可以直接赋值,价格遍历循环就可以进行批量的操作了

worksheet.Cells[1, 1].Value = "测试";//直接指定行列数进行赋值
worksheet.Cells["A1"].Value = "赋值";//直接指定单元格进行赋值
  • 1
  • 2
设置单元格样式
worksheet.Cells[1, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;//水平居中
worksheet.Cells[1, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;//垂直居中
worksheet.Cells[1, 4, 1, 5].Merge = true;//合并单元格
worksheet.Cells.Style.WrapText = true;//自动换行
  • 1
  • 2
  • 3
  • 4
  • 5
设置字体
worksheet.Cells[1, 1].Style.Font.Bold = true;//字体为粗体
worksheet.Cells[1, 1].Style.Font.Color.SetColor(Color.White);//字体颜色
worksheet.Cells[1, 1].Style.Font.Name = "微软雅黑";//字体
worksheet.Cells[1, 1].Style.Font.Size = 12;//字体大小
  • 1
  • 2
  • 3
  • 4
设置单元格边框
worksheet.Cells[1, 1].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191));//设置单元格所有边框
worksheet.Cells[1, 1].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;//单独设置单元格底部边框样式和颜色(上下左右均可分开设置)
worksheet.Cells[1, 1].Style.Border.Bottom.Color.SetColor(Color.FromArgb(191, 191, 191));
  • 1
  • 2
  • 3
设置单元格高和宽
worksheet.Cells.Style.ShrinkToFit = true;//单元格自动适应大小
worksheet.Row(1).Height = 15;//设置行高
worksheet.Row(1).CustomHeight = true;//自动调整行高
worksheet.Column(1).Width = 15;//设置列宽
  • 1
  • 2
  • 3
  • 4
设置单元格格式
worksheet.Cells[1, 1].Style.Numberformat.Format = "#,##0.00";//这是保留两位小数
  • 1
设置sheet背景
worksheet.View.ShowGridLines = false;//去掉sheet的网格线
worksheet.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid;
worksheet.Cells.Style.Fill.BackgroundColor.SetColor(Color.LightGray);//设置背景色
worksheet.BackgroundImage.Image = Image.FromFile(@"firstbg.jpg");//设置背景图片
  • 1
  • 2
  • 3
  • 4
隐藏sheet
worksheet.Hidden = eWorkSheetHidden.Hidden;//隐藏sheet
worksheet.Column(1).Hidden = true;//隐藏某一列
worksheet.Row(1).Hidden = true;//隐藏某一行
  • 1
  • 2
  • 3
图片操作

有时候需求会将某个图片保存至Excel中,代码如下:

ExcelPicture picture = worksheet.Drawings.AddPicture("picture", Image.FromFile(@"firstbg.jpg"));//插入图片
picture.SetPosition(100, 100);//设置图片的位置
picture.SetSize(100, 100);//设置图片的大小
  • 1
  • 2
  • 3
Excel加密和锁定

有时候导出的Excel不希望别人修改,可对Excel进行加密,代码如下:

worksheet.Protection.IsProtected = true;//设置是否进行锁定
worksheet.Protection.SetPassword("123");//设置密码
worksheet.Protection.AllowAutoFilter = false;//下面是一些锁定时权限的设置
worksheet.Protection.AllowDeleteColumns = false;
worksheet.Protection.AllowDeleteRows = false;
worksheet.Protection.AllowEditScenarios = false;
worksheet.Protection.AllowEditObject = false;
worksheet.Protection.AllowFormatCells = false;
worksheet.Protection.AllowFormatColumns = false;
worksheet.Protection.AllowFormatRows = false;
worksheet.Protection.AllowInsertColumns = false;
worksheet.Protection.AllowInsertHyperlinks = false;
worksheet.Protection.AllowInsertRows = false;
worksheet.Protection.AllowPivotTables = false;
worksheet.Protection.AllowSelectLockedCells = false;
worksheet.Protection.AllowSelectUnlockedCells = false;
worksheet.Protection.AllowSort = false;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

实际demo

首先定义一个通用创建ExcelPackage的方法:

/// <summary>
/// 创建ExcelPackage
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="datas">数据实体</param>
/// <param name="columnNames">列名</param>
/// <param name="outOfColumns">排除列</param>
/// <param name="sheetName">sheet名称</param>
/// <param name="title">标题</param>
/// <param name="isProtected">是否加密</param>
/// <returns></returns>
private static ExcelPackage CreateExcelPackage<T>(List<T> datas, Dictionary<string, string> columnNames, List<string> outOfColumns, string sheetName = "Sheet1",string title="",int isProtected=0)
{
var package = new ExcelPackage();
var worksheet = package.Workbook.Worksheets.Add(sheetName);
if(isProtected==1)
{
worksheet.Protection.IsProtected = true;//设置是否进行锁定
worksheet.Protection.SetPassword("xiangzhidaomimama");//设置密码
worksheet.Protection.AllowAutoFilter = false;//下面是一些锁定时权限的设置
worksheet.Protection.AllowDeleteColumns = false;
worksheet.Protection.AllowDeleteRows = false;
worksheet.Protection.AllowEditScenarios = false;
worksheet.Protection.AllowEditObject = false;
worksheet.Protection.AllowFormatCells = false;
worksheet.Protection.AllowFormatColumns = false;
worksheet.Protection.AllowFormatRows = false;
worksheet.Protection.AllowInsertColumns = false;
worksheet.Protection.AllowInsertHyperlinks = false;
worksheet.Protection.AllowInsertRows = false;
worksheet.Protection.AllowPivotTables = false;
worksheet.Protection.AllowSelectLockedCells = false;
worksheet.Protection.AllowSelectUnlockedCells = false;
worksheet.Protection.AllowSort = false;
} var titleRow = 0;
if(!string.IsNullOrWhiteSpace(title))
{
titleRow = 1;
worksheet.Cells[1, 1, 1, columnNames.Count()].Merge = true;//合并单元格
worksheet.Cells[1, 1].Value = title;
worksheet.Cells.Style.WrapText = true;
worksheet.Cells[1, 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;//水平居中
worksheet.Cells[1, 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;//垂直居中
worksheet.Row(1).Height = 30;//设置行高
worksheet.Cells.Style.ShrinkToFit = true;//单元格自动适应大小
} //获取要反射的属性,加载首行
Type myType = typeof(T);
List<PropertyInfo> myPro = new List<PropertyInfo>();
int i = 1;
foreach (string key in columnNames.Keys)
{
PropertyInfo p = myType.GetProperty(key);
myPro.Add(p); worksheet.Cells[1+ titleRow, i].Value = columnNames[key];
i++;
} int row = 2+ titleRow;
foreach (T data in datas)
{
int column = 1;
foreach (PropertyInfo p in myPro.Where(info => !outOfColumns.Contains(info.Name)))
{
worksheet.Cells[row, column].Value = p == null ? "" : Convert.ToString(p.GetValue(data, null));
column++;
}
row++;
}
return package;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

然后将ExcelPackage转换成Byte类型,以流的方式进行导出:

public static Byte[] GetByteToExportExcel<T>(List<T> datas, Dictionary<string, string> columnNames, List<string> outOfColumn, string sheetName = "Sheet1",string title="",int isProtected=0)
{
using (var fs = new MemoryStream())
{
using (var package = CreateExcelPackage(datas, columnNames, outOfColumn, sheetName, title, isProtected))
{
package.SaveAs(fs);
return fs.ToArray();
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

最后就可以直接进行导出了:

public async Task<IActionResult> GetExcel(UserModel entity,int isProtected=0)
{
var result = await ReportServices.GetAttendance(entity);
var columns = new Dictionary<string, string>() {
{ "Id","序号"},
{ "UserName","用户名"},
{ "Remark","备注"}
};
var fs = ExcelHelper.GetByteToExportExcel(result.Collection.ToList(), columns, new List<string>(),"Sheet1","", isProtected);
return File(fs, "application/vnd.android.package-archive", $"ExcelDemo.xlsx");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

总结

EPPlus总的来说还是比较好用的,也能满足基本需求,导出效率也不错,大家可以尝试下

.net core下对于Excel的一些操作及使用的更多相关文章

  1. 在 .NET Core 下的 Swagger UI 自定义操作

    1.Swagger UI 是什么? Swagger UI 是一个在线的 API 文档生成与测试工具,你可以将其集成在你的 API 项目当中. 支持 API 自动同步生成文档 高度自定义,可以自己扩展功 ...

  2. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  3. 七、.net core下配置、数据库访问等操作实现

    配置读取 .net core下读取配置还是有点麻烦的,本身没有System.Configuration.dll,所以在进行配置前需要自行引用Microsoft.Extensions.Configura ...

  4. # .NET Core下操作Git,自动提交代码到

    .NET Core下操作Git,自动提交代码到 转自博客园(阿星Plus) .NET Core 3.0 预览版发布已经好些时日了,博客园也已将其用于生产环境中,可见 .NET Core 日趋成熟 回归 ...

  5. Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作

    前言 前段时间写了EF core实现多租户的文章,实现了根据数据库,数据表进行多租户数据隔离. 今天开始写按照Schema分离的文章. 其实还有一种,是通过在数据表内添加一个字段做多租户的,但是这种模 ...

  6. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  7. [转]C#对Excel报表进行操作(读写和基本操作)

    //1.添加引用-〉com-〉microsoft excel 11.0 //2.若出现错误:命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”(是缺少程序集引用吗 ...

  8. .NET Core下使用gRpc公开服务(SSL/TLS)

    一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇 ...

  9. 利用C#实现对excel的写操作

    一.COM interop 首先我们要了解下何为COM Interop,它是一种服务,可以使.NET Framework对象能够与COM对象通信.Visual Studio .NET 通过引入面向公共 ...

随机推荐

  1. Mac -- pkg-config: exec: "pkg-config": executable file not found in $PATH

    just run: brew install pkg-config

  2. Hvie SQL 修改表名 注释 列名注释

    一.修改hive表注释 ALTER TABLE 数据库名.表名 SET TBLPROPERTIES('comment' = '新的表备注'); 二.修改hive表字段注释 ALTER TABLE 数据 ...

  3. windows7 10 windows2008 windws2012 nfs客户端的安装

    servermanagercmd.exe -install FS-NFS-Services   for windows2008 windows2012 在添加功能角色-添加文件打印服务选择nfs客户端 ...

  4. LC 375. Guess Number Higher or Lower II

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  5. Android:状态栏禁用时蓝牙多文件传输弹窗及进度显示

    一.蓝牙文件传输弹窗 Android原生蓝牙传输文件时,会弹出蓝牙文件接收的确认框且默认是以notification的形式显示在状态栏,当用户点击之后才会弹出一个dialog.那么当状态栏被禁用时,如 ...

  6. Webservice初体验:axis调用wsdl和document解析

    Neo君遇到了需要调用webservice接口的情况,然而作为一只小白对这方面了解困乏,经过摸索,完成了一个小的Demo,记录下. 一:背景 同事给了我一个webservice地址,打开后后缀是&qu ...

  7. Greenwich.SR2版本的Spring Cloud Feign实例

    前面我们了解了Spring Cloud Ribbon和Hystrix,在使用上它们基本上会成队出现,那么是不是可以把它们组合起来使用?而且我们发现,在服务消费方a-beautiful-client里通 ...

  8. javascript——语法 && 结构

    原文链接:Understanding Syntax and Code Structure

  9. 123457123457#0#-----com.yimeng.wangZheChengYu01--前拼后广--成语头脑王者

    com.yimeng.wangZheChengYu01--前拼后广--成语头脑王者

  10. 雨田家园 delphi 拆分字符串

    最近在使用Delphi开发一种应用系统的集成开发环境.其中需要实现一个字符串拆分功能,方法基本原型应该是:procedure SplitString(src: string ; ch: Char; v ...