当前位置: 首页 > news >正文

C# net8生成excel,并设置列规则导出文件

安装 依赖库:NPOI
在这里插入图片描述

创建XSSFWorkbook和Sheet
设置表头行
添加数据验证:
身份证列用COUNTIF公式确保唯一
地址相关列锁定固定值
学段列设置三级下拉
固定值通过单元格赋值实现
输出

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.Util;
using System.IO;/// <summary>
/// 下载模板
/// </summary>
/// <returns></returns>
public ActionResult DownloadTemplate(DownloadTemplateDto input) {if (input.total< 1) throw new UserFriendlyException("人数不能为0");var stream = GenerateExcel(input.total);var data= stream.ToArray();return new FileContentResult(data, "application/octet-stream");//application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
}private MemoryStream GenerateExcel(int rowTotal)
{rowTotal = rowTotal + 10;//总行数// 1. 创建工作簿和工作表IWorkbook workbook = new XSSFWorkbook();ISheet sheet = workbook.CreateSheet("基础信息");// 2. 创建列名行// 2. 设置列名(共12列)string[] headers = { "姓名", "身份证号", "现住省", "现住市", "现住区", "联系电话","详细地址", "学校名称", "学校编号", "学段", "年级", "班级" };IRow headerRow = sheet.CreateRow(0);for (int i = 0; i < headers.Length; i++){headerRow.CreateCell(i).SetCellValue(headers[i]);}// 3. 设置数据验证规则IDataValidationHelper validationHelper = sheet.GetDataValidationHelper();// 规则1:身份证号列唯一性验证CellRangeAddressList idRange = new CellRangeAddressList(1, rowTotal, 1, 1); // B列IDataValidationConstraint idConstraint = validationHelper.CreateCustomConstraint("COUNTIF(B:B, B1)=1");IDataValidation idValidation = validationHelper.CreateValidation(idConstraint, idRange);idValidation.CreateErrorBox("重复错误", "身份证号必须唯一!");sheet.AddValidationData(idValidation);// 规则2:固定值验证(省、市、区、学校名称、学校编号)SetFixedValue(sheet, 2, "北京市", rowTotal); // C列:现住省SetFixedValue(sheet, 3, "昌平区", rowTotal); // D列:现住市SetFixedValue(sheet, 4, "A街道", rowTotal); // E列:街道SetFixedValue(sheet, 7, deptName, rowTotal); // H列:学校名称SetFixedValue(sheet, 8, deptId, rowTotal); // I列:学校编号// 规则3:学段下拉选择(小学/初中/高中)CellRangeAddressList stageRange = new CellRangeAddressList(1, rowTotal, 9, 9); // J列IDataValidationConstraint stageConstraint = validationHelper.CreateExplicitListConstraint(new string[] { "小学", "初中", "高中", "高三", "中专", "技校", "大学" });IDataValidation stageValidation = validationHelper.CreateValidation(stageConstraint, stageRange);stageValidation.CreateErrorBox("输入错误", "请选择下拉选中对应值!");sheet.AddValidationData(stageValidation);// 规则4:年级CellRangeAddressList grade = new CellRangeAddressList(1, rowTotal, 10, 10); // K列IDataValidationConstraint gradeConstraint = validationHelper.CreateExplicitListConstraint(new string[] { "一年级", "二年级", "三年级", "四年级", "五年级", "六年级","初一", "初二", "初三", "高一", "高二", "高三", "大一", "大二", "大三", "大四" });IDataValidation gradeValidation = validationHelper.CreateValidation(gradeConstraint, grade);gradeValidation.CreateErrorBox("输入错误", "请选择下拉选中对应值!");sheet.AddValidationData(gradeValidation);// 5. 流式输出MemoryStream stream = new MemoryStream();workbook.Write(stream, true);stream.Position = 0; // 重置流位置 return stream;
}// 辅助方法:为整列设置固定值
private void SetFixedValue(ISheet sheet, int columnIndex, string value,int rowTotal)
{for (int rowIndex = 1; rowIndex <= 10000; rowIndex++){IRow row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);row.CreateCell(columnIndex).SetCellValue(value);}
}

测试
在这里插入图片描述
修改下载后的文件后缀为xlsx格式即可打开
在这里插入图片描述


文章转载自:

http://xpZAGNEu.Lkhfm.cn
http://o0qSzX3f.Lkhfm.cn
http://n6UzmREK.Lkhfm.cn
http://LtFX6OQZ.Lkhfm.cn
http://KyjD0XMX.Lkhfm.cn
http://M99zJjDZ.Lkhfm.cn
http://4p1d5U0x.Lkhfm.cn
http://pCTh5WAk.Lkhfm.cn
http://2Ny3Auy2.Lkhfm.cn
http://DIDcPGph.Lkhfm.cn
http://0YiNt845.Lkhfm.cn
http://LP2Laa8w.Lkhfm.cn
http://sOkkEvYF.Lkhfm.cn
http://pjjrBRna.Lkhfm.cn
http://fIAz9BDZ.Lkhfm.cn
http://yKEcdONb.Lkhfm.cn
http://OBSk4mEn.Lkhfm.cn
http://rBoiHasR.Lkhfm.cn
http://b5DK1drL.Lkhfm.cn
http://63lFRy5y.Lkhfm.cn
http://17xYRCZN.Lkhfm.cn
http://b717JMmm.Lkhfm.cn
http://oLbZLs94.Lkhfm.cn
http://Gs3bYylo.Lkhfm.cn
http://qmBS6eut.Lkhfm.cn
http://56tGcUb0.Lkhfm.cn
http://8xHtMA8l.Lkhfm.cn
http://3nGP0SfV.Lkhfm.cn
http://Phynrhi4.Lkhfm.cn
http://kjHq0cFp.Lkhfm.cn
http://www.dtcms.com/a/246359.html

相关文章:

  • 深入剖析 Spring @Bean 注解:灵活定义与掌控你的 Bean
  • ABAP 上传 excel 报表
  • get_attribute的使用方法
  • ThreadPoolTaskExecutor+CompletableFuture实现多线程异步数据同步和自定义线程池监控和动态调整实现
  • UE5 学习系列(九)光照系统介绍
  • stm32cubeide中编译非flash起始地址开始的程序
  • 【ARMv7-A】——CLZ 指令
  • Swift 解法详解:如何在二叉树中寻找最长连续序列
  • 怎么轻松实现报表跨库移植
  • 前端Vue3国际化开发 :使用vue-i18n库和Element Plus 组件实现
  • slam--高斯分布
  • 4、程序的固化和下载(一)
  • 基于 SpringBoot + Vue 在线点餐系统(前后端分离)
  • Eplan2022更改用户界面颜色
  • 文档测试发送
  • 目标检测我来惹2-SPPNet
  • 5分钟玩转Swagger UI:Docker部署+静态化实战
  • LatentSync V8版 - 音频驱动视频生成数字人说话视频 更新V1.6版模型 支持50系显卡 支持批量 一键整合包下载
  • ViT架构所需的大型训练集
  • ROS2的RViz里面,利用navigation2 导航包,在Rviz中添加静态障碍物是否容易?
  • FEMFAT许可有效期
  • 如何用AI赋能学习
  • CHI 总线协议及一致性总线相关的 NOC
  • 深度解析关键词价值,实现精准流量匹配
  • RabbitMQ实现异步消息监听机制
  • 【玄机】日志分析-ssh日志分析
  • 2025.uexp、.uasset文件、.ubulk如何打开
  • byte数组变量转int变量
  • 使用COMSOL生成数据与DeepONet学习静电场电势分布
  • Day52打卡 @浙大疏锦行