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. Leetcode(53)-最大子序和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...

  2. select函数详细用法解析

    1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set ...

  3. Spring-cloud-netflix-hystrix

    服务注册中心eureka-server已经搭好,并且SPRING-CLOUD-NETFLIX-EUREKA-CLIENT-APPLICATION提供一个hello服务 畏怯还编写一个eureka-cl ...

  4. Python对excel的基本操作

    Python对excel的基本操作 目录 1. 前言 2. 实验环境 3. 基本操作 3.1 安装openpyxl第三方库 3.2 新建工作簿 3.2.1 新创建工作簿 3.2.2 缺省工作表 3.2 ...

  5. SVG in Action

    SVG in Action HTML5 semantic HTML5 Semantic Elements / HTML5 Semantic Tags figure object <figure& ...

  6. 微信小程序 UI 组件库

    微信小程序 UI 组件库 Vant Weapp 需要注意的是 package.json 和 node_modules 必须在 miniprogram 目录下 $ yarn add @vant/weap ...

  7. CI / CD in Action

    CI / CD in Action Continuous Integration (CI) & Continuous Delivery (CD) https://github.com/mark ...

  8. express+mongodb开发网站

    准备工作: 1安装git 进入官网  使用方法:使用git教程 2安装node.js 进入官网 3安装mongodb 进入官网 需要技术: 1.基础知识:html .css. js .jquery 2 ...

  9. Techme INC:红光和近红外光疗法有效加速肌肉恢复,美国橄榄球队已采用

    Techme INC创始人兼董事长MADELEINE VAUGHAN表示:在运动结束后,肌肉纤维因为细微损伤造成酸痛情形,即是延迟性肌肉酸痛-DOMS.这类酸痛发生时,需要适度的恢复,避免造成肌肉拉伤 ...

  10. LinkedList 的实现原理

    本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类就直接说了.LinkedList 的底层结构是一个带头/尾指针的双向链表,可以 ...