文章目录

  • 一、读取Excel中的数据到DataTable
  • 二、将数据保存到Excel

EPPlus官方文档: https://www.epplussoftware.com/zh/Developers

Excel模板格式如下:

一、读取Excel中的数据到DataTable

// 需要引用的命名空间
using OfficeOpenXml;
using LicenseContext = OfficeOpenXml.LicenseContext;
using System.Data;/// <summary>
/// 窗体中的全局变量,用于创建dt的列
/// </summary>
DataColumn dc = null;
/// <summary>
/// 窗体中的全局变量,用于存储从excel中读取的数据
/// </summary>
DataTable dt = new DataTable();/// <summary>
/// 读取Excel中的数据到DataTable
/// </summary>
public void ReadExcelData(FileInfo fileInfo)
{// 读取注册码excel的数据dc = null;dt = new DataTable();using (var pck = new ExcelPackage(fileInfo)) // 打开注册码excel文件{ExcelWorksheet ws = pck.Workbook.Worksheets.Where(x => x.Name.ToLower() == "sheet1").FirstOrDefault();int minColumnNum = ws.Dimension.Start.Column;//工作区开始列int maxColumnNum = ws.Dimension.End.Column; //工作区结束列int minRowNum = ws.Dimension.Start.Row; //工作区开始行号int maxRowNum = ws.Dimension.End.Row; //工作区结束行号try{// Excel的工作区中有多少列就给DataTable添加多少列if (dc == null){for (int j = 1; j <= maxColumnNum; j++){vC = new DataColumn($"Column{j}", typeof(string));dt.Columns.Add(vC);}}// 将Excel中的数据放入DataTable,之所以从第3行开始循环,是因为前两行是表头,第3行开始才是数据for (int n = 3; n <= maxRowNum; n++){DataRow vRow = dt.NewRow();for (int m = 1; m <= maxColumnNum; m++){ws.Cells[n, 1].Value = n;if (ws.Cells[n, m].Value != null){vRow[m - 1] = ws.Cells[n, m].Value;}}dt.Rows.Add(vRow);}pck.Save();}catch (Exception ex){MessageBoxEx.Show($"读取Excel文件数据时发生错误:{ex.ToString()}", "错误", MessageBoxButtonsEx.OK, MessageBoxIconEx.Error);}}
}

二、将数据保存到Excel

/// <summary>
/// 保存H1码按钮点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSaveParam_Click(object sender, EventArgs e)
{#region <测试数据>//txtNumber.Text = "F58672AN3020006";//byte[] h1CodeBytes = new byte[] { 0xD1,0x65,0x77,0x53,0x83,0x13,0x36,0x66,0x0F,0xF5,0x13,0xF7,0x1D,0x93,0x9E,//    0x0E,0xB0,0x8D,0xC3,0x5C,0xF2,0x8A,0xA0,0x70,0x86,0xFA,0x99,0x4F,0x43,0x7A,0x26,0xB4 };//txtH1Code.Text = ToHexString(h1CodeBytes);#endregion// 校验文本框是否为空if (string.IsNullOrEmpty(txtNumber.Text) || string.IsNullOrEmpty(txtH1Code.Text)){MessageBoxEx.Show($"序列号或H1码为空!无法保存!", "提示", MessageBoxButtonsEx.OK, MessageBoxIconEx.Information);return;}if (fileInfo == null){MessageBoxEx.Show($"文件路径为空!无法保存!", "提示", MessageBoxButtonsEx.OK, MessageBoxIconEx.Information);return;}// 将读取的序列号和H1码保存到Excel文件if (dt.Rows.Count > 0) // Excel有数据的情况{DataRow[] drArr = dt.Select($"Column4 = '{txtNumber.Text}'");if (drArr.Length > 0){var msg = $"Excel文件中已存在该序列号:{txtNumber.Text},无需重复保存!";AppendLog(LogType.None, msg); // 自定义函数,用于打印信息到richtextboxMessageBoxEx.Show(msg, "提示", MessageBoxButtonsEx.OK, MessageBoxIconEx.Information);}else{var rowsCount = dt.Rows.Count;DataRow dataRow = dt.NewRow();DataRow lastRow = dt.Rows[rowsCount - 2];int curr3ColValue = Convert.ToInt32(lastRow["Column3"].ToString()) + 1;dataRow["Column1"] = rowsCount + 2 + 1; // +2是因为表头占2行,所以新增加的倒数第二行数据应该+2+1dataRow["Column2"] = "";dataRow["Column3"] = curr3ColValue;dataRow["Column4"] = txtNumber.Text;dataRow["Column5"] = txtH1Code.Text;dt.Rows.Add(dataRow);dataRow = dt.NewRow();dataRow["Column1"] = rowsCount + 2 + 2; // +2是因为表头占2行,所以新增加的最后一行数据应该+2+2dataRow["Column2"] = "";dataRow["Column3"] = "对应生成注册码";dataRow["Column4"] = "";dataRow["Column5"] = "";dt.Rows.Add(dataRow);using (var pck = new ExcelPackage(fileInfo)) // 打开注册码excel文件{ExcelWorksheet ws = pck.Workbook.Worksheets.Where(x => x.Name.ToLower() == "sheet1").FirstOrDefault();ws.Cells["C1"].Value = $"美泰   申请日期:{DateTime.Now.ToString("yyyy年MM月dd日")}   设备:MNV403S  数量:{curr3ColValue}";ws.Cells["A3"].LoadFromDataTable(dt);pck.Save();}var msg = $"已成功保存序列号为:{txtNumber.Text},H1码为:{txtH1Code.Text}的数据!";AppendLog(LogType.None, msg);MessageBoxEx.Show(msg, "提示", MessageBoxButtonsEx.OK, MessageBoxIconEx.Information);}}else // Excel无数据的情况{DataRow dataRow = dt.NewRow();dataRow["Column1"] = 1; // +2是因为表头占2行,所以新增加的倒数第二行数据应该+2+1dataRow["Column2"] = "";dataRow["Column3"] = 1;dataRow["Column4"] = txtNumber.Text;dataRow["Column5"] = txtH1Code.Text;dt.Rows.Add(dataRow);dataRow = dt.NewRow();dataRow["Column1"] = 2; // +2是因为表头占2行,所以新增加的最后一行数据应该+2+2dataRow["Column2"] = "";dataRow["Column3"] = "对应生成注册码";dataRow["Column4"] = "";dataRow["Column5"] = "";dt.Rows.Add(dataRow);using (var pck = new ExcelPackage(fileInfo)) // 打开注册码excel文件{ExcelWorksheet ws = pck.Workbook.Worksheets.Where(x => x.Name.ToLower() == "sheet1").FirstOrDefault();ws.Cells["C1"].Value = $"美泰   申请日期:{DateTime.Now.ToString("yyyy年MM月dd日")}   设备:MNV403S  数量:{1}";ws.Cells["A3"].LoadFromDataTable(dt);pck.Save();}var msg = $"已成功保存序列号为:{txtNumber.Text},H1码为:{txtH1Code.Text}的数据!";AppendLog(LogType.None, msg);MessageBoxEx.Show(msg, "提示", MessageBoxButtonsEx.OK, MessageBoxIconEx.Information);}
}

C# EPPlus根据Excel模板读取与保存数据相关推荐

  1. POI读取Excel模板并导出大量数据

    POI读取Excel模板并导出大量数据 我在使用XSSFWorkbook读取Excel模板并导出大量数据(百万级)时,发现很长时间没有响应,debugger模式发现在读取第三四十万条数据时,程序直接停 ...

  2. python缺失值与异常值处理_pandas学习(常用数学统计方法总结、读取或保存数据、缺省值和异常值处理)...

    pandas学习(常用数学统计方法总结.读取或保存数据.缺省值和异常值处理) 目录 常用数学统计方法总结 读取或保存数据 缺省值和异常值处理 常用数学统计方法总结 count 计算非NA值的数量 de ...

  3. java hutool poi 基于excel模板文件,填充数据的思路

    需求 用户可下载excel模板文件,填充数据后上传,也可以下载已上传所有数据的excel,模板文件和含数据excel,都有列头及列说明:由此想到模板文件和含数据excel共用一份excel模板,下载数 ...

  4. TensorFlow学习笔记02:使用tf.data读取和保存数据文件

    TensorFlow学习笔记02:使用tf.data读取和保存数据文件 使用`tf.data`读取和写入数据文件 读取和写入csv文件 写入csv文件 读取csv文件 读取和保存TFRecord文件 ...

  5. python创建Excel文件及写入保存数据

    python创建Excel文件及写入保存数据 创建Excel文件及写入保存数据 文章目录 python创建Excel文件及写入保存数据 一. 创建并保存Excel文档 二.工作表的创建 三.完整代码 ...

  6. poi读取excel模板,并填充数据

    一.POI介绍 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 基本功能: HSSF - 提供读写 ...

  7. Java jxl在excel模板中动态加入数据,及前端下载excel的例子

    写了一个小demo,把这样一个流程跑通,前端通过点击一个下载按钮,根据前端显示的数据,下载Excel文件到本地. 先分析一下整个流程 前端通过ajax的post请求,传递json字符串到后台. 后台接 ...

  8. 向EXCEL模板文件中写入数据和插入新行

    在很多情况下,我们需要将程序产生的一些数据按照一些用户要求的EXCEL文件模板格式进行填写,将指定的数据项写入指定的单元格.在某些特定的情况下,可能还需要进行动态的行插入,比如数量不确定的点坐标信息, ...

  9. Python之数据分析(Numpy中读取与保存数据文件、将数据文件制成K线图)

    文章目录 一.读取与保存文件 二.将数据文件制成K线图 一.读取与保存文件 1.读取文件格式 numpy.loadtxt(文件名,delimiter = 分割符,usecols = 选择列,unpac ...

最新文章

  1. Kubectl get pods 一直处于 Status:containerCreating
  2. vue的指令绑定、事件、冒泡
  3. python画图小房子代码-python少儿编程-turtle 基本绘图
  4. Paper:Xavier参数初始化之《Understanding the difficulty of training deep feedforward neural networks》的翻译与解读
  5. matplotlib - ax.bar()ax.pie()
  6. java xssf的背景色,poi xssf背景颜色对照表 java生成excel文件
  7. yum 下载RPM包而不进行安装
  8. java编译器分析_Java反编译器的剖析
  9. java se的api下载_API specification for java SE 1.7
  10. 阿里云各个地域节点速度测试(测试点到阿里云各站点)
  11. 「SCOI2015」小凸玩密室 解题报告
  12. 有DMX512协议控制的整套硬件解决方案吗?来看一下,舞台灯光同步视频播放DMX控制台
  13. PHP目录函数 opendir (打开目录句柄)
  14. xLua(一)——介绍
  15. Linux机器24项安全合规设置
  16. 一机玩转docker之六:搭建crucible
  17. keras.models导入Sequential错误
  18. 利用matlab将三维数据画成三维立体图
  19. 机器学习系列(三)——EM算法
  20. 2023最新猕猴桃影视系统源码/影视APP源码+安卓/苹果双端

热门文章

  1. Django高级特性之django-apscheduler定时任务,给Django添加run,右键运行
  2. 《伤寒杂病论》序——张仲景
  3. 解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题(一般出现在win7 旗舰版)...
  4. 拍婚纱照的流程,从选择——下单——拍摄
  5. MyBatis中foreach元素用法解析
  6. Linux——Shebang符号
  7. 文章高效排版(js+css+markdown)
  8. 【整理】【精华】【实用】常用代码片段
  9. Selenium 前世今生
  10. 【华为OD机试 2023】 密室逃生游戏(C++ Java JavaScript Python)