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只支持对单表的操作,对 ...
随机推荐
- salesforce零基础学习(一百三十六)零碎知识点小总结(八)
本篇参考: Salesforce LWC学习(七) Navigation & Toast https://developer.salesforce.com/docs/platform/lwc/ ...
- CF933-Div3 大致思路+题解
\(Rank\) A - Rudolf and the Ticket 纯水题 暴力枚举直接过 $code$ #include<bits/stdc++.h> #define fo(x,y,z ...
- k8s证书相关
1.cfssl 字签证书 查看证书 可以使用以下命令查询CFSSL证书是否过期: 复制代码 cfssl certinfo -cert <certificate_file> 其中,< ...
- mongodb的replication与shard分片结合使用详解
部署脚本 #!/bin/bash #复制集配置 IP='10.0.0.12' #主机ip NA='rs3' #复制集名称 if [ "$1" = "reset" ...
- C#利用win32API创建窗体
效果图 代码实现 1 using System; 2 using System.Runtime.InteropServices; 3 //using System.Windows.Forms; 4 5 ...
- 分布式任务调度内的 MySQL 分页查询优化
作者:vivo 互联网数据库团队- Qiu Xinbo 本文主要通过图示介绍了用主键进行分片查询的过程,介绍了主键分页查询存在SQL性能问题,如何去创建高效的索引去优化主键分页查询的SQL性能问题.对 ...
- 简单粗暴通过 Binlog 日志来恢复 MySQL 数据
引言 Binlog 日志的主要作用: 1.增量备份. 2.主从复制. 操作步骤 1.登录 MySQL -> 执行 show variables like '%log_bin%'; 查询 binl ...
- Django - 在后台上传文章封面图 - 并在前端页面展示
需要用到 models.ImageField(), 它继承自 models.FileField(), 用ImageField的时候需要安装pillow pip install pillow -i h ...
- 《剑指offer - 题目2》
题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 注意方 ...
- NOIP模拟64
T1 三元组 解题思路 一看题面,好像是一道数学题,但不完全是,或者说根本不是... 比较好想到的是 \(\mathcal{O}(n^2)\) 和 \(\mathcal{O}(nk)\) 的做法,然后 ...