C#使用NPOI导入Excel的方法详解
作者:布瑞泽的童话 发布时间:2021-08-29 07:39:35
标签:C#,NPOI,Excel
本文实例讲述了C#使用NPOI导入Excel的方法。分享给大家供大家参考,具体如下:
NPOI是由国人开发的一个进行excel操作的第三方库。百度百科介绍如下:NPOI
本文主要介绍如何使用NPOI将Excel数据读取。
首先引入程序集:
using System.IO;
using System.Reflection;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.Web;
然后定位到文件位置:
string path = "~/上传文件/custompersonsalary/" + id + "/"+id+".xls";
string filePath = Server.MapPath(path);
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite) //打开.xls文件
接下来,将xls文件中的数据写入workbook中:
HSSFWorkbook wk = new HSSFWorkbook(fs); //把xls文件中的数据写入wk中
wk.NumberOfSheets
是xls文件中总共的表的个数。
wk.GetSheetAt(i)
是获取第i个表的数据。
通过循环:
for (int i = 0; i < wk.NumberOfSheets; i++) //NumberOfSheets是xls文件中总共的表数
将每个表的数据单独存放在ISheet
对象中:
ISheet sheet = wk.GetSheetAt(i); //读取当前表数据
这样某张表的数据就暂存在sheet
对象中了。
接下来,我们可以通过sheet.LastRowNum
来获取行数,sheet.GetRow(j)
来获取第j行数据:
for (j = 1; j <= sheet.LastRowNum; j++) //LastRowNum 是当前表的总行数
{
IRow row = sheet.GetRow(j); //读取当前行数据
每一行的数据又存在IRow对象中。
我们可以通过row.LastCellNum
来获取列数,row.Cells[i]
来获取第i列数据。
row.Cells[2].ToString();
这里需要注意一点的就是,如果单元格中数据为公式计算而出的话,row.Cells[i]
会返回公式,需要改为:
row.Cells[2].NumericCellValue
就可以返回计算结果了。
最后将我在项目中用到的一段导入Excel数据赋予实体的示例如下:
/// <summary>
/// 导入操作
/// </summary>
/// @author: 刘放
/// @date: 2015/10/17
/// <param name="id">主表id</param>
/// <returns>如果成功,返回ok,如果失败,返回不满足格式的姓名</returns>
public string InDB(string id)
{
int j=0;
StringBuilder sbr = new StringBuilder();
string path = "~/上传文件/custompersonsalary/" + id + "/"+id+".xls";
string filePath = Server.MapPath(path);
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) //打开123.xls文件
{
//定义一个工资详细集合
List<HR_StaffWage_Details> staffWageList = new List<HR_StaffWage_Details>();
try
{
HSSFWorkbook wk = new HSSFWorkbook(fs); //把xls文件中的数据写入wk中
for (int i = 0; i < wk.NumberOfSheets; i++) //NumberOfSheets是xls文件中总共的表数
{
ISheet sheet = wk.GetSheetAt(i); //读取当前表数据
for (j = 1; j <= sheet.LastRowNum; j++) //LastRowNum 是当前表的总行数
{
IRow row = sheet.GetRow(j); //读取当前行数据
if (row != null)
{
//for (int k = 0; k <= row.LastCellNum; k++) //LastCellNum 是当前行的总列数
//{
//如果某一行的员工姓名,部门,岗位和员工信息表不对应,退出。
SysEntities db = new SysEntities();
if (CommonHelp.IsInHR_StaffInfo(db, row.Cells[2].ToString(), row.Cells[0].ToString(), row.Cells[1].ToString()) == false)//姓名,部门,岗位
{
//返回名字以便提示
return row.Cells[2].ToString();
}
//如果符合要求,这将值放入集合中。
HR_StaffWage_Details hr_sw = new HR_StaffWage_Details();
hr_sw.Id = Result.GetNewIdForNum("HR_StaffWage_Details");//生成编号
hr_sw.SW_D_Name = row.Cells[2].ToString();//姓名
hr_sw.SW_D_Department = row.Cells[0].ToString();//部门
hr_sw.SW_D_Position = row.Cells[1].ToString();//职位
hr_sw.SW_D_ManHour = row.Cells[3].ToString() != "" ? Convert.ToDouble(row.Cells[3].ToString()) : 0;//工数
hr_sw.SW_D_PostWage = row.Cells[4].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[4].NumericCellValue.ToString()) : 0;//基本工资
hr_sw.SW_D_RealPostWage = row.Cells[5].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[5].NumericCellValue.ToString()) : 0;//岗位工资
hr_sw.SW_D_PieceWage = row.Cells[6].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[6].NumericCellValue.ToString()) : 0;//计件工资
hr_sw.SW_D_OvertimePay = row.Cells[7].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[7].NumericCellValue.ToString()) : 0;//加班工资
hr_sw.SW_D_YearWage = row.Cells[8].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[8].NumericCellValue.ToString()) : 0;//年假工资
hr_sw.SW_D_MiddleShift = row.Cells[9].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[9].NumericCellValue.ToString()) : 0;//中班
hr_sw.SW_D_NightShift = row.Cells[10].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[10].NumericCellValue.ToString()) : 0;//夜班
hr_sw.SW_D_MedicalAid = row.Cells[11].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[11].NumericCellValue.ToString()) : 0;//医补
hr_sw.SW_D_DustFee = row.Cells[12].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[12].NumericCellValue.ToString()) : 0;//防尘费
hr_sw.SW_D_Other = row.Cells[13].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[13].NumericCellValue.ToString()) : 0;//其他
hr_sw.SW_D_Allowance = row.Cells[14].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[14].NumericCellValue.ToString()) : 0;//津贴
hr_sw.SW_D_Heat = row.Cells[15].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[15].NumericCellValue.ToString()) : 0;//防暑费
hr_sw.SW_D_Wash = row.Cells[16].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[16].NumericCellValue.ToString()) : 0;//澡费
hr_sw.SW_D_Subsidy = row.Cells[17].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[17].NumericCellValue.ToString()) : 0;//补助
hr_sw.SW_D_Bonus = row.Cells[18].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[18].NumericCellValue.ToString()) : 0;//奖金
hr_sw.SW_D_Fine = row.Cells[19].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[19].NumericCellValue.ToString()) : 0;//罚款
hr_sw.SW_D_Insurance = row.Cells[20].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[20].NumericCellValue.ToString()) : 0;//养老保险
hr_sw.SW_D_MedicalInsurance = row.Cells[21].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[21].NumericCellValue.ToString()) : 0;//医疗保险
hr_sw.SW_D_Lunch = row.Cells[22].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[22].NumericCellValue.ToString()) : 0;//餐费
hr_sw.SW_D_DeLunch = row.Cells[23].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[23].NumericCellValue.ToString()) : 0;//扣餐费
hr_sw.SW_D_De = row.Cells[24].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[24].NumericCellValue.ToString()) : 0;//扣项
hr_sw.SW_D_Week = row.Cells[25].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[25].NumericCellValue.ToString()) : 0;//星期
hr_sw.SW_D_Duplex = row.Cells[26].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[26].NumericCellValue.ToString()) : 0;//双工
hr_sw.SW_D_ShouldWage = row.Cells[27].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[27].NumericCellValue.ToString()) : 0;//应发金额
hr_sw.SW_D_IncomeTax = row.Cells[28].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[28].NumericCellValue.ToString()) : 0;//所得税
hr_sw.SW_D_FinalWage = row.Cells[29].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[29].NumericCellValue.ToString()) : 0;//实发金额
hr_sw.SW_D_Remark = row.Cells[30].ToString();//备注
hr_sw.SW_Id = id;//外键
hr_sw.SW_D_WageType = null;//工资类型
staffWageList.Add(hr_sw);
}
}
}
}
catch (Exception e) {
//错误定位
int k = j;
}
//再将list转入数据库
double allFinalWage = 0;
foreach (HR_StaffWage_Details item in staffWageList)
{
SysEntities db = new SysEntities();
db.AddToHR_StaffWage_Details(item);
db.SaveChanges();
allFinalWage +=Convert.ToDouble(item.SW_D_FinalWage);
}
//将总计赋予主表
SysEntities dbt = new SysEntities();
HR_StaffWage sw = CommonHelp.GetHR_StaffWageById(dbt, id);
sw.SW_WageSum = Math.Round(allFinalWage,2);
dbt.SaveChanges();
}
sbr.ToString();
return "OK";
}
最后需要注意一点的就是,Excel中即使某些单元格内容为空,但是其依旧占据了一个位置,所以在操作的时候需要格外注意。
希望本文所述对大家C#程序设计有所帮助。


猜你喜欢
- 前言Spring 提供了 ApplicationContext 事件机制,可以发布和监听事件,这个特性非常有用。Spring 内置了一些事件
- 从今天开始,本专栏持续更新Android简易实战类博客文章。和以往专栏不同,此专栏只有实例。每个实例尽量按照知识点对应相应一章节的内容去写,
- 超简单,几行代码搞定Android底部导航栏—–应项目需求以及小伙伴的留言,新加了两个方法:设置底部导航栏背景图片添加底部导航栏选项卡切换监
- 有时候会不可避免使用动态表或者列进行业务处理。下面学习几种动态表/列的使用方式:【1】使用预编译即,默认值。<select id=&q
- 引言在Broker中,事务消息的初始化是通过BrokerController.initialTransaction()方法执行的。priva
- 一、观察者模式基本概况1.概念观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subcri
- 刚学完JDBC不久,做了一个简单的学生管理系统,可能还有不完善的地方,望各路大神见谅。废话不多说,我先贴个图让大家让大家瞅瞅,觉得是你想要的
- Java 使用getClass().getResourceAsStream()方法获取资源之前想获取一个资源文件做一些处理,使用getCla
- 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。深刻认识Stri
- 引言备忘录模式经常可以遇到,譬如下面这些场景:浏览器回退:浏览器一般有浏览记录,当我们在一个网页上点击几次链接之后,可在左上角点击左箭头回退
- public class Change{ public static void main(String args[]){ fin
- 本文实例讲述了C#中Out与Ref的区别,可以加深C#程序设计人员对Out和Ref用法的理解,具体分析如下:一、区别分析:Out和Ref作为
- 通过邮件找回密码功能的实现1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是
- 详解java 中Spring jsonp 跨域请求的实例jsonp介绍  
- 目录准备工作启动接着往下看目录准备工作我们知道SpringBoot的自动装配的秘密在 org.springframework.boot.au
- 本文实例为大家分享了java金额数字转中文工具类的具体代码,供大家参考,具体内容如下java金额数字转中文工具类ConvertNum.jav
- 这篇文章主要介绍了spring cloud gateway网关路由分配代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有
- 做Android开发五年了,期间做做停停(去做后台开发,服务器管理),当回来做Android的时候,发现很生疏,好
- 因重定向无法正常goBack()解决方案首先说下问题,初始页面为A,点击某个链接跳转到B(http://xxx.com.cn/),B页面重定
- 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处 理而开发的,所以文件读写是应用程序开发的一个基本功能。Qt