WeihanLi.Npoi 1.16.0 Release Notes

Intro

最近有网友咨询如何设置单元格样式,在之前的版本中是不支持的,之前主要考虑的是数据,对于导出的样式并没有支持,这个 issue 也让我觉得目前还不是足够的灵活,于是进行了一些探索,增加了更多扩展的可能性,一起来看一下吧

Sheet Setting

因为导入导出是针对某一个 Sheet 而言的,所以支持为不同的 Sheet 设置不同的配置,如果所有 Sheet 的配置都是一样的,则只配置默认的 Sheet 配置就可以了,新版本中增加了三个委托,进一步的增强的导出的灵活性

/// <summary>
/// Cell Action on export
/// </summary>
public Action<ICell>? CellAction { get; set; } /// <summary>
/// Row Action on export
/// </summary>
public Action<IRow>? RowAction { get; set; } /// <summary>
/// Sheet Action on export
/// </summary>
public Action<ISheet>? SheetAction { get; set; }

可以不同的 Level 扩展自己想要的功能,这些扩展会在写入数据之后执行,可以借此来设置特殊单元格的样式,如果你想也可以重新设置导出的数据,来看下面的示例:

Sample1

首先来看一个设置 Header 字体样式的一个示例,完整代码参考:https://github.com/WeihanLi/WeihanLi.Npoi/blob/310d7637e82210f7558b2a60a637b43485c0e562/samples/DotNetCoreSample/Program.cs#L157

var setting = FluentSettings.For<TestEntity>();
// ExcelSetting
setting.HasAuthor("WeihanLi")
.HasTitle("WeihanLi.Npoi test")
.HasDescription("WeihanLi.Npoi test")
.HasSubject("WeihanLi.Npoi test"); setting.HasSheetSetting(config =>
{
config.StartRowIndex = 1;
config.SheetName = "SystemSettingsList";
config.AutoColumnWidthEnabled = true; config.RowAction = row =>
{
if (row.RowNum == 0)
{
var style = row.Sheet.Workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
var font = row.Sheet.Workbook.CreateFont();
font.FontName = "JetBrains Mono";
font.IsBold = true;
font.FontHeight = 200;
style.SetFont(font);
row.Cells.ForEach(c => c.CellStyle = style);
}
};
}); setting.Property(_ => _.SettingId)
.HasColumnIndex(0); setting.Property(_ => _.SettingName)
.HasColumnTitle("SettingName")
.HasColumnIndex(1); setting.Property(_ => _.DisplayName)
.HasOutputFormatter((entity, displayName) => $"AAA_{entity?.SettingName}_{displayName}")
.HasInputFormatter((entity, originVal) => originVal?.Split(new[] { '_' })[2])
.HasColumnTitle("DisplayName")
.HasColumnIndex(2); setting.Property(_ => _.SettingValue)
.HasColumnTitle("SettingValue")
.HasColumnIndex(3); setting.Property(_ => _.CreatedTime)
.HasColumnTitle("CreatedTime")
.HasColumnIndex(4)
.HasColumnWidth(10)
.HasColumnFormatter("yyyy-MM-dd HH:mm:ss"); setting.Property(_ => _.CreatedBy)
.HasColumnInputFormatter(x => x += "_test")
.HasColumnIndex(4)
.HasColumnTitle("CreatedBy"); setting.Property(x => x.Enabled)
.HasColumnInputFormatter(val => "Enabled".EqualsIgnoreCase(val))
.HasColumnOutputFormatter(v => v ? "Enabled" : "Disabled"); setting.Property("HiddenProp")
.HasOutputFormatter((entity, val) => $"HiddenProp_{entity?.PKID}"); setting.Property(_ => _.PKID).Ignored();
setting.Property(_ => _.UpdatedBy).Ignored();
setting.Property(_ => _.UpdatedTime).Ignored();
}

导出代码:

var entities = new List<TestEntity>()
{
new TestEntity()
{
PKID = 1,
SettingId = Guid.NewGuid(),
SettingName = "Setting1",
SettingValue = "Value1",
DisplayName = "dd\"d,1"
},
new TestEntity()
{
PKID=2,
SettingId = Guid.NewGuid(),
SettingName = "Setting2",
SettingValue = "Value2",
Enabled = true,
CreatedBy = "li\"_"
},
};
entities.ToExcelFile("test.xlsx");

导出结果如下:

可以看得出来,我们导出的结果中第一行的样式和别的样式会不同

Another Sample

除了直接导出到 excel 文件之外,还可以支持导出到某一个 sheet 中,我在我的另外一个 DbTool 的项目中也在使用,将原来的一大坨代码做了很大的简化,详细修改可以参考这个 commit: https://github.com/WeihanLi/DbTool/commit/7c7b980714af11e5fec3f8b3babac0904f94cff3#diff-d0ef24afd15ae6aa4ead43fbe31a895c1c051ab9c6e50f4ff4c7544a9592f958R8

最后实际使用的导出代码:

var workbook = ExcelHelper.PrepareWorkbook(FileExtension.EndsWith(".xls") ? ExcelFormat.Xls : ExcelFormat.Xlsx);
foreach (var tableEntity in tableInfo)
{
//Create Sheet
var sheet = workbook.CreateSheet(tableEntity.TableName); //create title
var titleRow = sheet.CreateRow(0);
var titleCell = titleRow.CreateCell(0);
titleCell.SetCellValue(tableEntity.TableDescription); // export list data to excel
sheet.ImportData(tableEntity.Columns);
}
return workbook.ToExcelBytes();

相比之前的代码,大大简化了,原来的代码可以参考https://github.com/WeihanLi/DbTool/commit/7c7b980714af11e5fec3f8b3babac0904f94cff3#diff-d0ef24afd15ae6aa4ead43fbe31a895c1c051ab9c6e50f4ff4c7544a9592f958L17-L121, 100 多行代码,太长了不方便截图

大部分的代码都变成了配置,部分配置代码可以参考下面的代码,具体配置可以参考:https://github.com/WeihanLi/DbTool/blob/wpf-dev/src/DbTool/ExcelDbDocExporter.cs

var settings = FluentSettings.For<ColumnEntity>();
settings.HasExcelSetting(x =>
{
x.Author = "DbTool";
})
.HasSheetSetting(x =>
{
x.StartRowIndex = 2;
x.AutoColumnWidthEnabled = true;
x.RowAction = row =>
{
// apply header row style
if (row.RowNum == 1)
{
var headerStyle = row.Sheet.Workbook.CreateCellStyle();
headerStyle.Alignment = HorizontalAlignment.Center;
var headerFont = row.Sheet.Workbook.CreateFont();
headerFont.FontHeight = 180;
headerFont.IsBold = true;
headerFont.FontName = "微软雅黑";
headerStyle.SetFont(headerFont);
row.Cells.ForEach(c => c.CellStyle = headerStyle);
}
};
x.SheetAction = sheet =>
{
// set merged region
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 6));
// apply title style
var titleStyle = sheet.Workbook.CreateCellStyle();
titleStyle.Alignment = HorizontalAlignment.Left;
var font = sheet.Workbook.CreateFont();
font.FontHeight = 200;
font.FontName = "微软雅黑";
font.IsBold = true;
titleStyle.SetFont(font);
titleStyle.FillBackgroundColor = IndexedColors.Black.Index;
titleStyle.FillForegroundColor = IndexedColors.SeaGreen.Index;
titleStyle.FillPattern = FillPattern.SolidForeground;
sheet.GetRow(0).GetCell(0).CellStyle = titleStyle;
};
});
// ...

上面的代码通过 RowAction 配置了 Header 行的单元格的样式,通过 SheetAction 配置了 Title 行的单元格合并和 Title 单元格的样式,导出结果如下图所示:

More

WeihanLi.Npoi 通过 Fluent API 的方式提供了非常灵活的导入导出配置,如果你也有导入导出 Excel 的需求,可以了解一下,如果不能满足的地方或者使用过程中有遇到任何问题欢迎给我提 issue https://github.com/WeihanLi/WeihanLi.Npoi/issues/new/choose

其他介绍文章:

更多的使用文档可以参考项目示例项目,单元测试以及文档

References

WeihanLi.Npoi 1.16.0 Release Notes的更多相关文章

  1. WeihanLi.Npoi 1.14.0 Release Notes

    WeihanLi.Npoi 1.14.0 Release Notes Intro 周末更新了一下项目,开始使用可空引用类型,并且移除了 net45 的支持,仅支持 netstandard2.0 Cha ...

  2. WeihanLi.Npoi 1.11.0/1.12.0 Release Notes

    WeihanLi.Npoi 1.11.0/1.12.0 Release Notes Intro 最近 NPOI 扩展新更新了两个版本,感谢 shaka chow 的帮忙和支持,这两个 Feature ...

  3. Git for Windows v2.11.0 Release Notes

    homepage faq contribute bugs questions Git for Windows v2.11.0 Release Notes Latest update: December ...

  4. WeihanLi.Npoi 1.13.0 更新日志

    WeihanLi.Npoi 1.13.0 更新日志 Intro 在 Github 上收到 Issue 收到网友反馈希望支持自动分 Sheet 导出,有兴趣的可以参考 Issue https://git ...

  5. ASP.NET Core 1.1.0 Release Notes

    ASP.NET Core 1.1.0 Release Notes We are pleased to announce the release of ASP.NET Core 1.1.0! Antif ...

  6. Yasm 1.3.0 Release Notes

    Yasm 1.3.0 Release Notes http://yasm.tortall.net/releases/Release1.3.0.html Target Audience Welcome ...

  7. WeihanLi.Npoi 1.7.0 更新

    WeihanLi.Npoi 1.7.0 更新介绍 Intro 昨天晚上发布了 WeihanLi.Npoi 1.7.0 版本,增加了 ColumnInputFormatter/ColumnOutputF ...

  8. WeihanLi.Npoi 1.10.0 更新日志

    WeihanLi.Npoi 1.10.0 更新日志 Intro 上周有个网友希望能够导入Excel时提供一个 EndRowIndex 来自己控制结束行和根据字段过滤的,周末找时间做了一下这个 feat ...

  9. MongoDB 3.0 Release Notes

    MongoDB 3.0支持WiredTiger存储引擎,提供可插拔存储引擎API,新增SCRAM-SHA-1认证机制,改进explain功能. 可插拔存储引擎API 允许第三方为MongoDB开发存储 ...

随机推荐

  1. HTTP笔记1--Web及网络基础

    web页面如何呈现? 客户端:通过发送请求获取服务器资源的 Web 浏览器 web是建立在 HTTP 协议上通信的   WWW(万维网/web)的构建技术 把 SGML(StandardGeneral ...

  2. Linux系统SCSI磁盘扫描机制解析及命令实例

    介绍Linux系统扫描SCSI磁盘有几种方式?Linux新增LUN之后,能否不重启主机就认出设备?如果安装了PowerPath,动态添加/删除LUN的命令是什么?本文总结了Linux主机对磁盘设备进行 ...

  3. Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制

    本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...

  4. JavaScript事件:事件处理模型(冒泡、捕获)、取消冒泡、阻止默认事件

    (一)事件处理模型---事件冒泡.捕获 (1)事件冒泡 24 <body> 25 <div class="warpper"> 26 <div clas ...

  5. Google Tag Manager

    Google Tag Manager SEO https://www.wappalyzer.com/technologies/tag-managers/google-tag-manager/ UTM ...

  6. 「NGK每日快讯」11.24日NGK公链第22期官方快讯!

  7. RocketMq灰皮书(二)------本地部署启动MQ

    RocketMq灰皮书(二)------本地部署启动MQ Windows10本地部署RocketMQ 在上一篇文章中,我们对rocket的几个基本概念进行了介绍,也了解了业内几大消息中间件的区别.在本 ...

  8. 让 gRPC 提供 REST 服务

    让 gRPC 提供 REST 服务 Intro gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部 ...

  9. 算法图解:Python笔记代码

    二分查找 选择排序 递归 快速排序 广度优先搜索 狄克斯特拉算法 贪婪算法 二分查找 def binary_search(lst,item): low = 0 high = len(lst)-1 wh ...

  10. linux下安装mysql8.0.x步骤

    1.下载mysql mysql官网:https://dev.mysql.com/downloads/mysql/ 将下载的mysql上传打linux 2.解压并重命名 [root@rsyncClien ...