全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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#相关内容感兴趣的读者可查看本站专题:《C#操作Excel技巧总结》、《C#程序设计之线程使用技巧总结》、《C#中XML文件操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》

希望本文所述对大家C#程序设计有所帮助。


# C#  # NPOI  # 导入  # Excel  # C#使用NPOI设置Excel下拉选项  # C#通过NPOI导入导出数据EXCEL  # C#用NPOI导出导入Excel帮助类  # C#使用Npoi导出Excel并合并行列  # C#使用NPOI库读写Excel文件  # C#利用NPOI操作Excel(单元格设置)  # C#使用NPOI实现Excel导入导出功能  # C#使用NPOI导出Excel类封装  # C# 基于NPOI操作Excel  # C#基于NPOI操作Excel  # 行数  # 程序设计  # 我们可以  # 双工  # 需要注意  # 单元格  # 上传文件  # 象中  # 实发  # 操作技巧  # 餐费  # 计件工资  # 放在  # 相关内容  # 基本工资  # 是由  # 感兴趣  # 数据结构  # 给大家  # 而出 


相关文章: 建站之星安装路径如何正确选择及配置?  python的本地网站制作,如何创建本地站点?  如何选择高效可靠的多用户建站源码资源?  如何在万网主机上快速搭建网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何快速打造个性化非模板自助建站?  制作宣传网站的软件,小红书可以宣传网站吗?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何在宝塔面板中修改默认建站目录?  详解jQuery停止动画——stop()方法的使用  如何通过VPS建站实现广告与增值服务盈利?  用v-html解决Vue.js渲染中html标签不被解析的问题  网站代码制作软件有哪些,如何生成自己网站的代码?  建站之星Pro快速搭建教程:模板选择与功能配置指南  微信推文制作网站有哪些,怎么做微信推文,急?  如何在局域网内绑定自建网站域名?  XML的“混合内容”是什么 怎么用DTD或XSD定义  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  建站主机选虚拟主机还是云服务器更好?  如何在云指建站中生成FTP站点?  如何通过WDCP绑定主域名及创建子域名站点?  家庭建站与云服务器建站,如何选择更优?  如何用狗爹虚拟主机快速搭建网站?  C#怎么使用委托和事件 C# delegate与event编程方法  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  制作农业网站的软件,比较好的农业网站推荐一下?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  如何在IIS中新建站点并解决端口绑定冲突?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  C++如何编写函数模板?(泛型编程入门)  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  实例解析Array和String方法  宝塔建站后网页无法访问如何解决?  建站之星各版本价格是多少?  图册素材网站设计制作软件,图册的导出方式有几种?  建站ABC备案流程中有哪些关键注意事项?  如何用5美元大硬盘VPS安全高效搭建个人网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  PHP 500报错的快速解决方法  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何高效完成自助建站业务培训?  小型网站建站如何选择虚拟主机? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。