【办公软件】C#调用NPOI实现Excel文件的加载、导出功能
文章目录
- 1. 引言
- 2. 环境准备
- 3. 示例代码
- 4. 结果
- 5. 总结
1. 引言
本文将介绍如何使用C#和NPOI库实现Excel文件的读写操作,并通过加载文件和导出文件的按钮进行封装。NPOI是一个强大的.NET库,可以轻松处理Excel文件。我们将学习如何使用NPOI打开现有的Excel文件、读取数据,并将数据写入到Excel文件中。
2. 环境准备
在开始之前,请确保已安装以下环境:
- Visual Studio(任何版本)
- NPOI库
3. 示例代码
下面是一个示例代码,演示了如何使用C#和NPOI实现Excel文件的读写操作,并封装在函数中,同时添加加载文件和导出文件的按钮:
using System;
using System.Data;
using System.IO;
using System.Windows.Forms;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;class Program
{static void Main(string[] args){Application.Run(new Form1());}
}public class Form1 : Form
{private Button loadButton;private Button exportButton;private DataTable dataTable;public Form1(){loadButton = new Button();loadButton.Text = "加载文件";loadButton.Click += LoadButton_Click;exportButton = new Button();exportButton.Text = "导出文件";exportButton.Click += ExportButton_Click;Controls.Add(loadButton);Controls.Add(exportButton);}private void LoadButton_Click(object sender, EventArgs e){OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx";openFileDialog.Title = "选择要加载的Excel文件";if (openFileDialog.ShowDialog() == DialogResult.OK){string filePath = openFileDialog.FileName;dataTable = LoadExcelFile(filePath);}}private void ExportButton_Click(object sender, EventArgs e){if (dataTable == null){MessageBox.Show("请先加载Excel文件!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx";saveFileDialog.Title = "选择要导出的Excel文件路径";if (saveFileDialog.ShowDialog() == DialogResult.OK){string filePath = saveFileDialog.FileName;ExportExcelFile(filePath, dataTable);}}private DataTable LoadExcelFile(string filePath){DataTable dataTable = new DataTable();FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read);XSSFWorkbook workbook = new XSSFWorkbook(file);ISheet sheet = workbook.GetSheetAt(0);// 读取表头IRow headerRow = sheet.GetRow(0);for (int i = 0; i < headerRow.LastCellNum; i++){dataTable.Columns.Add(headerRow.GetCell(i).ToString());}// 读取数据for (int row = 1; row <= sheet.LastRowNum; row++){IRow currentRow = sheet.GetRow(row);DataRow dataRow = dataTable.NewRow();for (int col = 0; col < currentRow.LastCellNum; col++){dataRow[col] = currentRow.GetCell(col)?.ToString();}dataTable.Rows.Add(dataRow);}file.Close();Console.WriteLine("加载文件完成!");return dataTable;}private void ExportExcelFile(string filePath, DataTable dataTable){XSSFWorkbook workbook = new XSSFWorkbook();ISheet sheet = workbook.CreateSheet("Sheet1");// 写入表头IRow headerRow = sheet.CreateRow(0);for (int i = 0; i < dataTable.Columns.Count; i++){headerRow.CreateCell(i).SetCellValue(dataTable.Columns[i].ColumnName);}// 写入数据for (int row = 0; row < dataTable.Rows.Count; row++){IRow newRow = sheet.CreateRow(row + 1);for (int col = 0; col < dataTable.Columns.Count; col++){newRow.CreateCell(col).SetCellValue(dataTable.Rows[row][col]?.ToString());}}FileStream writeFile = new FileStream(filePath, FileMode.Create, FileAccess.Write);workbook.Write(writeFile);writeFile.Close();Console.WriteLine("导出文件完成!");}
}
4. 结果
运行代码后,将能够通过加载文件按钮选择要加载的Excel文件,并在控制台中显示文件中的数据。同时,还可以通过导出文件按钮选择要导出的Excel文件路径,并将数据写入到文件中。
5. 总结
本文介绍了如何使用C#和NPOI库实现Excel文件的读写操作,并通过加载文件和导出文件的按钮进行封装。通过使用NPOI的API,我们可以轻松地处理Excel文件,读取其中的数据并进行写入。希望本文对你有所帮助!
相关文章:

【办公软件】C#调用NPOI实现Excel文件的加载、导出功能
文章目录 1. 引言2. 环境准备3. 示例代码4. 结果5. 总结 1. 引言 本文将介绍如何使用C#和NPOI库实现Excel文件的读写操作,并通过加载文件和导出文件的按钮进行封装。NPOI是一个强大的.NET库,可以轻松处理Excel文件。我们将学习如何使用NPOI打开现有的Ex…...

UVA 11990 “Dynamic‘‘ Inversion 区域树 + 树状数组
一、题目大意 我们有 1 2 3 ... n 这些数字组成的一个排列数组 a ,需要从这个排列中取出m个数字,要求计算出出每次取出数字之前,数组中的逆序数(逆序数就是 i < j,但是 ai > aj的数) 二、解题思路 …...

邮件钓鱼分析
三大协议 SPF Sender Policy Framework 的缩写,一种以IP地址认证电子邮件发件人身份的技术。 注:收信人怀疑币是假的,查看这个送信包裹里面记录的发出地是不是央行,如果是黑市有可能是黑钱 DKIM 加密签名和域名关联。 注&am…...

Android 小技巧
1. Android Studio下载地址 Android 开发者 | Android Developers (google.cn) 2.Android Aosp 在线查看地址: AOSPXRef 3.Android 官方文档地址: Android 开源项目 | Android Open Source Project (google.cn)...

Centos MySQL --skip-grant-tables详解
跳过权限验证,导出数据备份 主机系统:Centos7 64位 数据库版本:MySQL5.7.40 使用–skip-grant-tables场景 1、忘记管理员密码 2、修改管理员密码 mysql -uroot -p显示错误内容如下: ERROR 1045 (28000): Access denied for …...

Linux:进程控制的概念和理解
文章目录 进程的创建fork函数写时拷贝的原理fork函数的用法和失败原因 进程终止进程的退出进程异常的问题 进程终止进程退出 进程等待什么是进程等待?为什么要进行进程等待?如何进行进程等待?父进程如何知道子进程的退出信息? wai…...

ubuntu20.04编译安装nginx
目录 一.更新系统软件包列表二.安装编译Nginx所需的依赖三.下载Nginx源代码四.解压源代码文件五.进入解压后的Nginx目录六.配置编译选项七.编译并安装Nginx八.启动Nginx服务九.验证Nginx是否正常运行十.Nginx命令十一.配置软链接 在Ubuntu 20.04上编译安装Nginx,你可…...

操作系统的分页
操作系统的分页功能与内存管理密切相关。为了更好地理解这一点,我们先简要概述分页的基本概念,然后解释其与页面调度和存储效率的关系。 分页的基本概念 分页是操作系统中的一种内存管理策略。物理内存被划分为固定大小的块,称为“页面”或“…...

微服务环境搭建
JDK安装:https://blog.csdn.net/JHYPXS/article/details/134155680 mysql安装:https://blog.csdn.net/JHYPXS/article/details/102566304 nacos安装:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html...

ffmpeg 截取命令
从00:00:03.500开始截取往后长度到结尾的mp3音频(这个更有用,测试好用) ffmpeg -i d:/c.mp3 -ss 00:00:03.500 d:/output.mp3 将两个音频合并成一个音频(测试好用) ffmpeg -i "concat:d:/c.mp3|d:/output.mp3&…...

TypeScript深度剖析:TypeScript 中枚举类型应用场景?
文章目录 一、是什么二、使用数字枚举字符串枚举异构枚举本质 三、应用场景 一、是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集…...

[推荐]SpringBoot,邮件发送附件含Excel文件(含源码)。
在阅读本文前,可以先阅读我的上一篇文章: SpringBoot,使用JavaMailSender发送邮件(含源码)。 ,本文使用的代码案例涉及到的 jar包、application.properties配置与它相同。 先看一下效果。 图一 图二 在下方代码案例中,…...

node学习之包管理器
一、概念介绍 **1.1 包是什么 ** 『包』英文单词是 package ,代表了一组特定功能的源码集合 **1.2 包管理工具 ** 管理『包』的应用软件,可以对「包」进行 下载安装 , 更新 , 删除 , 上传 等操作 借助包管理工具&…...

自动驾驶车辆轨迹跟踪
相对于传统的模型预测控制(MPC),简化的车辆模型通常会导致预测结果不准确,这对车辆的转弯等行为具有负面影响。因此作者提出了一种轨迹规划和跟踪框架: 该框架应用人工势场来获得目标轨迹;并利用具有PID反…...

React的useEvent 和 ahooks 的 useMemorizedFn 的深度分析和对比
父组件 const TestParent: React.FC<any> () > {const [State, setState] useState(0);const changeFun useCallback(() > {console.log(useCallback closure 里的 State, State);}, [State]);const changeFun_useEvent useEvent(() > {console.log(useEv…...

基于goframe2.5.4、vue3、tdesign-vue-next开发的全栈前后端分离的管理系统
goframe-admin goframe-admin V1.0.0 平台简介 基于goframe2.5.4、vue3、tdesign-vue-next开发的全栈前后端分离的管理系统。前端采用tdesign-vue-next-starter 、vue3、pinia、tdesign-vue-next。 特征 高生产率:几分钟即可搭建一个后台管理系统认证机制&#x…...

LInux之在同一Tomcat下使用不同的端口号访问不同的项目
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《LInux实战开发》。🎯🎯 …...

梦百合上榜2023鼎革奖数字化转型先锋榜
10月26日,第六届“鼎革奖”数字化转型先锋榜单揭晓,梦百合家居凭借数字化生产的卓越成果——SAP管理平台及供应链项目,入选2023【鼎革奖】数字化转型先锋榜年度供应链转型典范,梦百合家居COO 崔慧明同步入选2023【鼎革奖】数字化转型先锋榜年度首席运营官。 据了解,「鼎革奖」数…...

沉痛悼念科研分公司
今天上班途中,遇到了上家公司的同事王强。他正准备去体检中心体检。几句寒暄之后,得知他是要入职选煤公司了。 我们所在的公司比较大,总公司下设有几十个分、子公司,我和他曾经在一家子公司——科研分公司。现在的科研分公司解散…...

Django的网站项目开发好了,该用何种方案在Centos上部署【答:Gunicorn(uWSGI)+Nginx】
问:用Django开发的网站开发好了,现在要部署上线。 系统为Centos 7.x 现在我安装好Django和相关依赖后,我用命令 python manage.py runserver 127.0.0.1:8010 启动Django 然后安装配置好Nginx,并把用的请求转发到 127.0.0.1:8010 。 请问这样的…...

基于PyTorch的中文情绪分析器设计与开发
收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、相关基础理论2.1 主流深度学习框架2.2 神经网络2.2.1 神经网络基础 二、中文情感分类模型构建3.1 开发环境3.2 数据部分3.3 文本特征提取3.3.1、过滤标点符号3.3.2 中文分词、单词过滤 三 运行结果与分析五 结…...

HT5010 音频转换器工作原理
HT5010是一款低成B的立体声DA转换器,内部集成了内插滤波器、DA转换器和输出模拟滤波等电路。其可支持多种音频数字输入格式,支持24-bit字节。 该HT5010 基于一个多比特位的Δ-Σ调制器,将数字信号转化成两个声道的模拟信号并经过模拟滤波器滤…...

ubuntu18.04如何更新到22.04
将linux系统中的Ubuntu 18.04更新到22.04,按照以下步骤操作: 打开终端并更新系统,使用以下命令: sudo apt update sudo apt upgrade sudo apt dist-upgrade 确保系统是最新的,然后备份数据,以防万一。执…...

嵌入式软件开发:第二部分–七个步骤计划
使用一种工具(仅一种工具)武装自己,您可以在下一个嵌入式项目的质量和交付时间上做出巨大的改进。点击领取嵌入式物联网学习路线 该工具是:绝对承诺对开发代码的方式进行一些小而基本的更改 。 有了改变的意志,今天您…...

什么是IPA,和RPA有啥区别和联系?
∵ IPA中包含了RPA的“PA”,AI的“I” ∴IPARPAAI,等式成立! AI:或人工智能,是一种复杂的计算机技术,旨在模仿人类智能行为和决策的能力。它涵盖了多种技术和方法,包括:机器学习&am…...

内涝积水监测仪怎么样?万宾科技城市内涝积水监测的作用
在城市建设发展过程中,道路基础设施的建设永远都占据着重要一席,因为人们出行一旦受阻便会影响城市进展,也会影响经济发展。在城市之中有隧道,下穿式立交桥等容易存积水的地方,一旦出现恶劣暴雨天气,这些地…...

【java】命令行,包
文件夹情况: HelloWorld.java package com.demo; public class HelloWorld{public static void print(){System.out.println("HelloWorld!");}public static void main(String[] args){print();} } import.java import com.demo.HelloWorld; public cla…...

Generative AI 新世界 | 文生图(Text-to-Image)领域论文解读
在上期文章,我们开始探讨生成式 AI(Generative AI)的另一个进步迅速的领域:文生图(Text-to-Image)领域。概述了 CLIP、OpenCLIP、扩散模型、DALL-E-2 模型、Stable Diffusion 模型等文生图(Text…...

03.从简单的sql开始
从简单的sql开始 一、sql语句的种类二、oracle的工作原理三、oracle数据库常见基础命令 一、sql语句的种类 下面是SQL语句的分类、常用语句、使用方法: 分类语句使用方法解释数据查询SELECTSELECT column1, column2, … FROM table_name WHERE condition;用于从表…...

JS加密/解密之jsjiami在线js加密的效率问题
故事背景 经常有客户反馈,v7加密的效率比v6低,但是安全性更好。这里我给大家科普一下关于jsjiami的优化诀窍。 示例源代码 // 伪代码 while (1) {var name ‘张三’ }优化后 var _name 张三; while (1) {var name _name }优化原理 相信很多朋…...