前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用NPOI生成Excel级联列表

使用NPOI生成Excel级联列表

作者头像
雪雁-心莱科技
发布于 2018-12-27 06:10:24
发布于 2018-12-27 06:10:24
1.3K0
举报
文章被收录于专栏:magicodesmagicodes
  1. 概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解。另外Word发博代码格式显示凌乱,因此相关代码均使用图片替代

很久没发博客了,因为实在是太忙了(请允许我找个借口)。最近沉淀了很多内容,当然很多都差不多忘记了,不过我还是会在有时间的前提下逐步一一道来吧。最近做了一个批量下单的模板导出,因为订单中有商品大类和小类的概念,而且类型非常多,为了方便用户选择以及确保数据的合法性,因此级联选择势在必行。不过,在此之前,本人就算是在Excel中操作都不会设置下拉,跟别说级联下拉了,并且关于使用代码生成级联下拉这块,网上并没有相关的可以值得借鉴的内容,但是无论如何,Excel小白还是要挑战挑战的。折腾了一下午,总算搞定,而且顺便学会了Excel中的序列和级联。还是挺有成就感的。鉴于网上这块有价值的内容不多,于是在此分享此内容以及相关核心代码。

官方博客:http://www.cnblogs.com/codelove/

相关开源库地址:https://github.com/xin-lai

交流QQ群(.NET 1群):85318032

交流QQ群(Magicodes开源库交流群):346487194

Nuget包地址:https://www.nuget.org/packages?q=magicodes

  1. 磨刀不误砍柴工——先学会Excel中的操作

首先,我们可以参考这个教程(来自百度经验):

http://jingyan.baidu.com/article/5553fa82035ce565a23934ba.html

这里有一点需要特别注意的,因为开发人员用的Excel版本都比较高,比如我的是2016,估计一般也是2013吧,特别坑爹的是,网上大部分教程是2010或者以下版本的,而在2013或以上版本微软将某个菜单的文字改了,如下图所示的地方:

这个有效性菜单你会发现在高版本无法找到,我找了半天,终于找到了:

就是这个图标!!!现在叫"数据验证"!!!

通过以上教程,我们可以学会配置了Excel级联列表:

数据源如下:

名称管理如下:

级联效果如下:

搞定了Excel,我们学到了以下几个概念:

  1. 通过名称管理器,我们可以定义序列,或者叫列表和数据源吧
  2. 通过数据验证,我们可以设置当单元格所绑定的序列
  1. 通过INDIRECT函数,我们可以实现下拉级联效果:

其实这个级联的实现的思路很有意思,通过INDIRECT获取到关联单元格的值,然后这个值就是关联列表的序列名称。 搞懂了以上理论,然后我们再开车。没有理论,很多时候就是瞎折腾!所以老司机开车不能瞎开,得有理论。

  1. 利用NPOI生成导入模板

其实用NPOI还是用Aspose.Cells,这个都没关系。毕竟我们掌握了理论,我们有理由相信,这两位都是好同志。在有RMB的前提下,我们愿意支持商业的,没RMB,开源的也能玩得飞起。好了,至于为什么选择NPOI,很简单,因为我们没钱,而且不喜欢盗版。

现在我来说说思路(思路是高于开发的,很多时候如果做一个东西没有思路,那就很容易"作死",在开发过程中要有意识的培养自己的思路,一方面是思路的形成可以在很多场景迁移借鉴,另一方面是既保障灵活性、扩展性和严谨性的前提下,又少走弯路。最后,思路是自己的,代码是靠抄的。):

  1. 设置workbook&sheet

NOPI操作Workbook和Sheet的代码网上很多,我这里就不过多搬运了,核心代码为:

HSSFWorkbook workbook = new HSSFWorkbook();//创建workbook

ISheet sheet = workbook.CreateSheet("sheet1");//创建sheet

IRow row = sheet.CreateRow(0);//添加行

row.CreateCell(0).SetCellValue("Test");//单元格写值

  1. 生成数据Sheet,并按规则列好

根据上面的代码,我们根据我们的业务逻辑很容易生成以下内容:

注意这个逻辑!一定要正确,而且对应上!

  1. 添加名称,并指定数据范围(绑定数据源)

核心代码为:

IName range = workbook.CreateName();//创建名称

range.NameName = bigCategory.CategoryName;//设置名称

var colName = GetExcelColumnName(colIndex);//根据序号获取列名,具体代码见下文

range.RefersToFormula = string.Format("{0}!${3}${2}:${3}${1}",

sheetName,

smallList.Count.ToString(),

2,

colName);

//设置引用位置

//参数1为引用的Sheet名称

//参数2为行数(数据行数)

//参数3为起始行数(从第二行开始,忽略列头,列头是给我们看的)

//参数4为列名(比如A、B、AA、AB这种)

获取列名的代码为:

/// <summary>

/// 获取Excel列名

/// </summary>

/// <param name="columnNumber">列的序号</param>

/// <returns></returns>

private string GetExcelColumnName(int columnNumber)

{

int dividend = columnNumber;

string columnName = String.Empty;

int modulo;

while (dividend > 0)

{

modulo = (dividend - 1) % 26;

columnName = Convert.ToChar(65 + modulo).ToString() + columnName;

dividend = (int)((dividend - modulo) / 26);

}

return columnName;

}

通过以上代码,就可以定义Excel中的名称了,对应如图所示:

  1. 写入大类和小类的数据验证

基于我们的理解,然后结合NPOI的API,我们很快就可以写出一下代码了:

//定义Cell范围,参数1:起始行数,参数2:结束行数,参数3:起始列数,参数4:结束列数

CellRangeAddressList regions = new CellRangeAddressList(1, 65535, lastBigIndex, lastBigIndex);

//绑定序列地址

DVConstraint constraint = DVConstraint.CreateFormulaListConstraint("产品大类");

//定义数据验证

HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);

//添加数据验证

sheet.AddValidationData(dataValidate);

如上面代码所示,这里是设置大类的数据验证。如图:

效果:

设置级联的数据验证:

var smallColIndex = i - 1;

//与大类关联

var colName = GetExcelColumnName(lastBigIndex + 1);

//这里只设置了该列的500行,可以按自己的情况来写入

for (int j = 1; j <= 500; j++)

{

//定义Cell范围,参数1:起始行数,参数2:结束行数,参数3:起始列数,参数4:结束列数

//这里的范围是单个单元格,因为我们的公式用到了具体的单元格地址

CellRangeAddressList regions = new CellRangeAddressList(j, j, smallColIndex, smallColIndex);

//使用INDIRECT函数,这里指定了具体地址

DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(string.Format("INDIRECT(${0}${1})", colName, j + 1));

HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);

sheet.AddValidationData(dataValidate);

}

效果如图:

好了,整个导出的主要逻辑就是这些。理解了思想,再结合官方API就可以很快搞定了。

整个分享就到这里了,如此看来,Excel还是大有可为的,不通过宏就可以做很多事情。而且Excel还可以直接连接外部数据源,包括OData服务等,有兴趣的小伙伴可以研究研究。

本次开车到此结束。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java中poi导出模板下拉框实现二级联动
代码实现如下: 需要加入的jar包: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version>
崔笑颜
2020/06/08
3.6K0
POI 导出excel文件下拉框问题
今天捣鼓那个下拉框呢 这个Workbook有三个实现类 首先po一个xssf的下拉框实现工具类: import org.apache.poi.ss.util.CellRangeAddress
周杰伦本人
2023/10/12
6030
POI 导出excel文件下拉框问题
注解+反射优雅的实现Excel导入导出(通用版),飘了!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/28
6740
npoi批量导入实现及相关技巧
  批量导入功能对于大部分后台系统来说都是不可或缺的一部分,常见的场景-基础数据的录入(部门,用户),用批量导入方便快捷。最近项目需要用到批量导入,决定花点时间写套比较通用的Excel导入功能。经过考
用户1168362
2018/01/05
1.7K0
npoi批量导入实现及相关技巧
xlsx-excel多级联动
注意数据起始位置在GHI这三列,第二行!import org.apache.poi.ss.usermodel.*;import org.apache.poi.ss.util.CellRangeAddressList;import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XS
在下是首席架构师
2023/04/01
7810
xlsx-excel多级联动
POI导出excel多级联动
2007版本的多级联动public static void threeLevelLinkage(Workbook book) {// 查询所有的省名称List<String> provNameList = new ArrayList<String>();provNameList.add("安徽省");provNameList.add("浙江省");// 整理数据,放入一个Map中,mapkey存放父地点,value 存放该地点下的子区域Map<String, List<String>> siteMap =
在下是首席架构师
2022/08/18
9341
poi设置单元格下拉下表
poi是读写excel最常用的一个开源中间件,实际使用中我们可能会遇到这样的需求:限制某列单元格只能输入特定的内容,这就是excel的下拉列表特性,以下是wps中excel的一个截图:
johnhuster的分享
2022/03/28
1.1K0
poi设置单元格下拉下表
免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
彭泽0902
2018/01/04
4.8K0
免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
EasyExcel自定义下拉注解的三种实现方式
在使用EasyExcel设置下拉数据时,每次都要创建一个SheetWriteHandler组件确实比较繁琐。为了优化这个过程,我们可以通过自定义注解来简化操作,使得只需要在需要添加下拉数据的字段上添加注解即可。
冬天vs不冷
2025/01/20
2210
EasyExcel自定义下拉注解的三种实现方式
Java 导出Excel增加下拉框选项
excel对于下拉框较多选项的,需要使用隐藏工作簿来解决,使用函数取值来做选项 选项较少(一般少于5个): private static DataValidation setFewDataValidation(Sheet sheet, String[] textList, int firstRow, int endRow, int firstCol, int endCol) { DataValidationHelper helper = sheet.getDataValidationHelper()
星辰sea
2022/10/29
1.6K0
.NET Core使用NPOI导出复杂,美观的Excel详解
  这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做数据导出Excel文档(当时想想真香,网上随便搜一搜教程一大堆),但是当自己真正的实践起来才知道原来想要给不同的单元格设置相关的字体样式、边框样式以及单元格样式一个简单的样式需要写这么多行代码来实现。作为一个喜欢编写简洁代码的我而言肯定是受不了的,于是乎提起袖子说干就干,我自己根据网上的一些资料自己封装了一个通用的NPOI导出Excel帮助类,主要包括行列创建,行内单元格常用样式封装(如:字体样式,字体颜色,字体大小,单元格背景颜色,单元格边框,单元格内容对齐方式等常用属性),希望在以后的开发中能够使用到,并且也希望能够帮助到更多有需要的同学。
追逐时光者
2020/03/31
3.9K0
.NET Core使用NPOI导出复杂,美观的Excel详解
通过xlrd和xlwt模块读写excel文件
xlrd模块用于读取excel文件,xlwt模块用于写入excel文件,二者搭配,可以灵活的操作excel文件。相比openpyxl模块,xlrd和xlwt可以操作不仅可以操作后缀为xlsx的文件,也可以操作后缀为xls的文件。
生信修炼手册
2020/11/25
6920
C# 使用 NPOI 库读写 Excel 文件
NPOI 是开源的 POI 项目的.NET版,可以用来读写Excel,Word,PPT文件。在处理Excel文件上,NPOI 可以同时兼容 xls 和 xlsx。官网提供了一份 Examples,给出了很多应用场景的例子,打包好的二进制文件类库,也仅有几MB,使用非常方便。
跟着阿笨一起玩NET
2018/09/19
9K1
Python处理excel的强大工具-openpyxl
首先,Python处理excel的第三方库有:xlrd,xlwt,openpyxl等。
吾非同
2020/10/13
2.1K0
NPOI操作EXCEL
------------------------------------------------------------------------
zls365
2020/10/30
1.8K0
NPOI操作EXCEL
C# NOPI 项目实战(经典)(可下载项目源码)
这篇文章主要介绍了如何安装NPOI,以及NPOI具体如何使用,并且用具体实例介绍了excel导入到datagridview以及 datagridview如何导出到excel并保存。如果不清楚这块的去我公众号去搜索这篇文章阅读。
zls365
2021/02/26
2.3K0
NPOI简述与运用
最近想把项目中Excel中的操作部分改成NPOI ,由于2.0版本已经支持office07/10格式,但还处于测试版不稳定,于是封装如下代码
跟着阿笨一起玩NET
2018/09/19
8900
使用NPOI导出,读取EXCEL(可追加功能)
使用NPOI导出,读取EXCEL,具有可追加功能 看代码 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.IO; 5 using System.Data; 6 using NPOI.SS.UserModel; 7 using NPOI.XSSF.UserModel; 8 using NPOI.HSSF.UserModel; 9 10 name
冰封一夏
2019/09/11
1.9K0
Npoi导入导出Excel操作
    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求。 在winform上面实现excel操作:http://www.cnblogs.com/CallmeYhz/p/4920293.html,NPOI的主页:http://npoi.codeplex.com/ 简介 NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目, 使用 NPOI 你就可以在没有安装 Office 或者相应
用户1055830
2018/01/18
3.7K2
Npoi导入导出Excel操作
生成带下拉选项的excel(xls、xlsx)
原理:当我们需要生成带下拉框的excel,我们可以把需要下拉选择的数据放到sheet2,将sheet2的这些存放待绑定数据的单元格绑定到sheet1的需要下拉的单元格,而sheet2可以根据需求是否隐藏
用户9236851
2023/02/23
1K0
相关推荐
java中poi导出模板下拉框实现二级联动
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档