项目结构

注意:需要引入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数据,附案例源码的更多相关文章

  1. 使用NPOI读取Excel数据到DataTable

    如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...

  2. 使用NPOI读取Excel数据并写入SQLite

    首先,我们来建一个数据库,我们就叫Hello.db(不一定是db后缀,你可以sqlite,sqlite3,db3)都可以作为识别,然后往里面建一个空的表格,如下图所示 然后建一个Excel表格,往表格 ...

  3. Spring Boot整合ElasticSearch和Mysql 附案例源码

    导读 前二天,写了一篇ElasticSearch7.8.1从入门到精通的(点我直达),但是还没有整合到SpringBoot中,下面演示将ElasticSearch和mysql整合到Spring Boo ...

  4. NPOI读取Excel数据应用

    NPOI 是 POI 项目的 .NET 版本.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它 ...

  5. Java导出Excel(附完整源码)

    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下.所用技术就是SpringBoot,然后是MVC架构模式.废话不多说,直接上代码了,源码点末尾链接就可以下载. ...

  6. java 线程池、多线程实战(生产者消费者模型,1 vs 10) 附案例源码

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  7. C#开发APP,ToolBar控件在Smobiler中的使用方式【附案例源码】——Smobiler移动开发平台

    控件说明 底部工具栏控件. 效果演示 其他效果 该界面为仿淘宝UI制作的一个简单的UI模板,源码获取方式请拉至文章末尾. 特色属性 属性 属性说明 Direction(相对布局) 容器主轴方向. Fl ...

  8. Nginx 轻松学 图文并茂 一学就会 附案例源码

    导读 篇幅较长,干货满满,需花费较长时间,转载请注明出处!背景音乐若影响到您,网页选项卡右上角即可关闭~~! Nginx概述 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理w ...

  9. Redis秒杀实战-微信抢红包-秒杀库存,附案例源码(Jmeter压测)

    导读 前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天我们来做一下Redis秒杀系统的设计.当然啦,Redis基础知识还不过关的,先去加 ...

  10. Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)

    简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...

随机推荐

  1. 【AnaTraf 分享】什么是 AnaTraf?为什么设计 AnaTraf?

    网络流量分析与 AnaTraf "2013年,网络流量分析技术(NTA, Network Traffic Analysis)的概念被首次提出,在2016年逐渐兴起.2017年,NTA被Gar ...

  2. margin-bottom:-1px无效的问题

    在实现tab的时候,margin-bottom:-1px无效的问题 active的tab项,要指定他的border-top, 如: border-top: 1px solid #fff; border ...

  3. 基于FPGA的电子琴设计(按键和蜂鸣器)----第一版

    欢迎各位朋友关注"郝旭帅电子设计团队",本篇为各位朋友介绍基于FPGA的电子琴设计(按键和蜂鸣器)----第一版. 功能说明: 外部输入七个按键,分别对应音符的"1.2. ...

  4. java学习之旅(day.22)

    CSS 前端三要素:HTML.CSS.javaScript ​ 结构 表现 交互 相当于骨头,表皮 ,血肉吧 如何学习CSS CSS是什么 CSS怎么用(快速入门) CSS选择器(重点+难点) 美化网 ...

  5. windows上安装mysql-5.6.44-winx64

    配置MySQL配置文件my.ini.datadir一般和安装目录是分开存放的 [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 ---这里输入你安装的文件路径- ...

  6. 为什么我们要用Spring Boot

    最近我面试了不少人,其中不乏说对 Spring Boot 非常熟悉的,然后当我问到一些 Spring Boot 核心功能和原理的时候,没人能说得上来,或者说不到点上,可以说一个问题就问趴下了! 这是我 ...

  7. 『手撕Vue-CLI』函数柯里化优化代码

    开篇 在上一篇文章中,给 nue-cli 添加了拉取版本号的功能,这一次来优化一下代码,使用函数柯里化的方式来优化代码. 实现 函数柯里化 函数柯里化是一种将使用多个参数的一个函数转换成一系列使用一个 ...

  8. no implicit conversion of nil into String

    一.Cocoapod 执行pod install命令时报错 [!] An error occurred while processing the post-install hook of the Po ...

  9. http1.1 的默认长连接 Connection: keep-alive 与 TCP KeepAlive 之间区别

    HTTP 长连接,也称为 HTTP 持久连接(HTTP Persistent Connection)或 HTTP 连接重用,是一种在 HTTP 协议中实现的机制. 在传统的 HTTP 通信中,每个 H ...

  10. else if

      // if(){}else if(){}...else{}         // 多种条件,多种情况下的判断语句         // 必须要注意         // 1,else if 之后有 ...