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只支持对单表的操作,对 ...
随机推荐
- 【题解】A18535.来自领导的烦恼
题目跳转 思路:本题可以使用动态规划或递归的方式来实现,本质上是一道01背包的变型题.假设一共有\(n\)名员工,每一位员工的技能水平用\(a[i]\)表示.要使得两个部门的员工技能总和之差最小,意思 ...
- Flutter(二):编写第一个Flutter App
Create New Flutter Project 在Android Studio添加上Flutter插件以后,通过File -> New -> New Flutter Project创 ...
- 基于FPGA的计算器设计---第一版
欢迎各位朋友关注"郝旭帅电子设计团队",本篇为各位朋友介绍基于FPGA的计算器设计---第一版. 功能说明: 1. 计算器的显示屏幕为数码管. 2. 4x4矩阵键盘作为计算器的输入 ...
- containerd 源码分析:创建 container(三)
文接 containerd 源码分析:创建 container(二) 1.2.2.2 启动 task 上节介绍了创建 task,task 创建之后将返回 response 给 ctr.接着,ctr 调 ...
- jquery的树状菜单
<body> <ul> <li>一级菜单 <ol> <li ...
- m3u8文件转换mp4 ffmpeg
m3u8文件转换mp4 ffmpeg 命令行执行下面语句: ffmpeg -i input.m3u8 -c copy output.mp4 ffmpeg.exe 和 input.m3u8 放在同一目录 ...
- HTTP报文结构详解
HTTP/HTTPS简介HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到 ...
- 前端使用 Konva 实现可视化设计器(15)- 自定义连接点、连接优化
前面,本示例实现了折线连接线,简述了实现的思路和原理,也已知了一些缺陷.本章将处理一些缺陷的同时,实现支持连接点的自定义,一个节点可以定义多个连接点,最终可以满足类似图元接线的效果. 请大家动动小手, ...
- MySql 中 select 使用
MySql select 多种查询方式 前言 在数据库使用过程中,使用最多的场景就是查询数据,所以今天我们总结一下常用用的查询 简单查询 带条件查询 多条件查询 输出指定字段查询 分组查询 查询结果排 ...
- 高级前端开发需要知道的 25 个 JavaScript 单行代码
1. 不使用临时变量来交换变量的值 例如我们想要将 a 于 b 的值交换 let a = 1, b = 2; // 交换值 [a, b] = [b, a]; // 结果: a = 2, b = 1 这 ...