C# NPOI 读取Excel数据,附案例源码
项目结构

注意:需要引入NPOI类库
C#代码
Form1.cs
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace NPOIDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private const int DEFAULT_CHECK_CELL_NUM = 4;
private void button1_Click(object sender, EventArgs e)
{
try
{
DataTable dt=ReadExcelData(@"C:\Users\apple\Desktop\Test.xls");
MessageBox.Show("ok");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} }
/// <summary>
/// 读取Excel中数据
/// </summary>
/// <param name="filePath"></param>
private DataTable ReadExcelData(object filePath)
{
try
{
if (!File.Exists(filePath.ToString()))
{
throw new Exception("文件不存在!");
}
DataTable dtExcel = InitDataTable();
FileStream fsRead = new FileStream(filePath.ToString(), FileMode.Open);
//创建工作薄
IWorkbook workBook = new HSSFWorkbook(fsRead);
//获取Sheet
ISheet sheet = workBook.GetSheetAt(0);
//获取Excel中的行数
int ExcelRowsCount = sheet.LastRowNum;
Assert.IsTrue(ExcelRowsCount == 1, "未读到Excel数据!");
IRow currentRow;
DataRow dr;
for (int i = 1; i < ExcelRowsCount; i++)
{
dr = dtExcel.NewRow();
//当前行数据
currentRow = sheet.GetRow(i);
SetCurrentRowValue(dtExcel, dr, currentRow, currentRow.LastCellNum);
}
return dtExcel;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 初始化DataTable
/// </summary>
/// <returns></returns>
private DataTable InitDataTable()
{
DataTable dt_excel = new DataTable();
dt_excel.Columns.Add("A");
dt_excel.Columns.Add("B");
dt_excel.Columns.Add("C");
dt_excel.Columns.Add("D");
return dt_excel;
}
/// <summary>
/// 读取到的Excel的单元格数量
/// </summary>
/// <param name="currentCellNum"></param>
private void CheckExcelCellNum(int readCurrentRowCellNum)
{
Assert.IsTrue(readCurrentRowCellNum > DEFAULT_CHECK_CELL_NUM, "Excel单元格列数超过:"+DEFAULT_CHECK_CELL_NUM+"列");
}
/// <summary>
/// 给DataTable动态赋值
/// </summary>
/// <param name="dr">DataTable当前行</param>
/// <param name="currentRow">Excel当前行数据</param>
/// <param name="currentCellNum">Excel的列数</param>
private void SetCurrentRowValue(DataTable dtExcel, DataRow dr,IRow currentRow, int currentCellNum)
{
dr.BeginEdit();
for (int j = 0; j < currentCellNum; j++)
{
if (j >= DEFAULT_CHECK_CELL_NUM) break;
dr[j]= currentRow.GetCell(j).ToString().Trim();
}
dr.EndEdit();
dtExcel.Rows.Add(dr);
}
}
}
Assert.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace NPOIDemo
{
public static class Assert
{
public static void IsTrue(bool flag,string msg)
{
if (flag)
{
throw new Exception(msg);
}
}
}
}
演示

演示过程中,提示另外一个进程xxxx的,是因为NPOI读取Excel的时候,Excel不可以打开,我们关闭,然后再次执行即可
项目下载
链接:https://pan.baidu.com/s/1YLer2fgV6QhJIQVsxqozJQ
提取码:30a9
C# NPOI 读取Excel数据,附案例源码的更多相关文章
- 使用NPOI读取Excel数据到DataTable
如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...
- 使用NPOI读取Excel数据并写入SQLite
首先,我们来建一个数据库,我们就叫Hello.db(不一定是db后缀,你可以sqlite,sqlite3,db3)都可以作为识别,然后往里面建一个空的表格,如下图所示 然后建一个Excel表格,往表格 ...
- Spring Boot整合ElasticSearch和Mysql 附案例源码
导读 前二天,写了一篇ElasticSearch7.8.1从入门到精通的(点我直达),但是还没有整合到SpringBoot中,下面演示将ElasticSearch和mysql整合到Spring Boo ...
- NPOI读取Excel数据应用
NPOI 是 POI 项目的 .NET 版本.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它 ...
- Java导出Excel(附完整源码)
导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下.所用技术就是SpringBoot,然后是MVC架构模式.废话不多说,直接上代码了,源码点末尾链接就可以下载. ...
- java 线程池、多线程实战(生产者消费者模型,1 vs 10) 附案例源码
导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...
- C#开发APP,ToolBar控件在Smobiler中的使用方式【附案例源码】——Smobiler移动开发平台
控件说明 底部工具栏控件. 效果演示 其他效果 该界面为仿淘宝UI制作的一个简单的UI模板,源码获取方式请拉至文章末尾. 特色属性 属性 属性说明 Direction(相对布局) 容器主轴方向. Fl ...
- Nginx 轻松学 图文并茂 一学就会 附案例源码
导读 篇幅较长,干货满满,需花费较长时间,转载请注明出处!背景音乐若影响到您,网页选项卡右上角即可关闭~~! Nginx概述 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理w ...
- Redis秒杀实战-微信抢红包-秒杀库存,附案例源码(Jmeter压测)
导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...
- Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)
简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...
随机推荐
- anaconda3部署以及使用详解
Anaconda3-2019.10-Linux-x86_64.sh 某次执行Python程序,其中两个错误信息如下: ImportError: libcblas.so.3: cannot open s ...
- mysql 命令行安装方式
一:下载 先到 mysql 官方网站下载:https://dev.mysql.com/downloads/mysql/ 点击直接下载: 解压到目录:D:\mysql-8.0.19-winx64 如图 ...
- 使用Docker安装Odoo 17(非Docker Compose)
使用Docker安装Odoo 17(非Docker Compose) 前言 最近在学习Odoo,先是windows 安装企业版,多年不用windows的服务器操作系统,一看windows的ECS那么贵 ...
- SwiftUI Stack中的View被压缩的效果
一.背景 我们在布局中,经常会遇到视图元素排列时空间不足或者空间过大的情况,在这种场景下面,不同的布局方式有不同的方法: 绝对布局frame:纯靠计算过程控制,获取父视图的大小,根据需求,计算自己需要 ...
- 8.24考试总结(NOIP模拟47)[Prime·Sequence·Omeed]
时间带着明显的恶意,缓缓在我的头顶流逝. T1 Prime 解题思路 成功没有签上到... 一看数据范围 \(R-L+1\le 10^7,R\le 10^{14}\) ,这肯定是判断范围内的数字是否可 ...
- Python爬虫 | 批量爬取今日头条街拍美图
01 前言 上篇文章我们爬取了今日头条街拍美图,心情相当愉悦,今天这篇文章我们使用Selenium来爬取当当网的畅销图书排行.正所谓书中自有黄金屋,书中自有颜如玉,我们通过读书学习来提高自身的才华,自 ...
- JavaSE 关键字和标识符
目录 关键字 标识符 标识符命名规则 标识符命名规范 字面值 关键字 具有特殊含义的 命名时不可以与关键字重名 标识符 也就是名字,对类名,变量名称,方法名称,参数名称等修饰 标识符命名规则 以字母, ...
- vue3 函数式组件
今天看vue3中文文档 看到函数式组件不太理解上面写的 然后自己写了一下才理解上面的自己记录一下 先在子组件里面写上 <script> // dynameic 组件 import { h ...
- 使用 Java 客户端通过 HTTPS 连接到 Easysearch
Easysearch 一直致力于提高易用性,这也是我们的核心宗旨,然而之前一直没有官方的 Java 客户端,也对用户使用造成了一些困扰,现在,我们正式发布了第一个 Java 客户端 Easysearc ...
- JsonPath - 根据表达式路径解析Json
JsonPath 在xml的使用过程中,对于xml的解析我们知道可以使用xpath的方式,随意的获取到我们想要的属性值.那么在使用json时,我们能不能实现同样的操作呢? 答案就是 json-path ...