C#使用NPOI導(dǎo)入Excel的方法詳解
本文實(shí)例講述了C#使用NPOI導(dǎo)入Excel的方法。分享給大家供大家參考,具體如下:
NPOI是由國(guó)人開發(fā)的一個(gè)進(jìn)行excel操作的第三方庫(kù)。百度百科介紹如下:NPOI
本文主要介紹如何使用NPOI將Excel數(shù)據(jù)讀取。
首先引入程序集:
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文件
接下來(lái),將xls文件中的數(shù)據(jù)寫入workbook中:
HSSFWorkbook wk = new HSSFWorkbook(fs); //把xls文件中的數(shù)據(jù)寫入wk中
wk.NumberOfSheets是xls文件中總共的表的個(gè)數(shù)。
wk.GetSheetAt(i)是獲取第i個(gè)表的數(shù)據(jù)。
通過(guò)循環(huán):
for (int i = 0; i < wk.NumberOfSheets; i++) //NumberOfSheets是xls文件中總共的表數(shù)
將每個(gè)表的數(shù)據(jù)單獨(dú)存放在ISheet對(duì)象中:
ISheet sheet = wk.GetSheetAt(i); //讀取當(dāng)前表數(shù)據(jù)
這樣某張表的數(shù)據(jù)就暫存在sheet對(duì)象中了。
接下來(lái),我們可以通過(guò)sheet.LastRowNum來(lái)獲取行數(shù),sheet.GetRow(j)來(lái)獲取第j行數(shù)據(jù):
for (j = 1; j <= sheet.LastRowNum; j++) //LastRowNum 是當(dāng)前表的總行數(shù)
{
  IRow row = sheet.GetRow(j); //讀取當(dāng)前行數(shù)據(jù)
每一行的數(shù)據(jù)又存在IRow對(duì)象中。
我們可以通過(guò)row.LastCellNum來(lái)獲取列數(shù),row.Cells[i]來(lái)獲取第i列數(shù)據(jù)。
row.Cells[2].ToString();
這里需要注意一點(diǎn)的就是,如果單元格中數(shù)據(jù)為公式計(jì)算而出的話,row.Cells[i]會(huì)返回公式,需要改為:
row.Cells[2].NumericCellValue
就可以返回計(jì)算結(jié)果了。
最后將我在項(xiàng)目中用到的一段導(dǎo)入Excel數(shù)據(jù)賦予實(shí)體的示例如下:
/// <summary>
/// 導(dǎo)入操作
/// </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文件
 {
  //定義一個(gè)工資詳細(xì)集合
  List<HR_StaffWage_Details> staffWageList = new List<HR_StaffWage_Details>();
  try
  {
   HSSFWorkbook wk = new HSSFWorkbook(fs); //把xls文件中的數(shù)據(jù)寫入wk中
   for (int i = 0; i < wk.NumberOfSheets; i++) //NumberOfSheets是xls文件中總共的表數(shù)
   {
    ISheet sheet = wk.GetSheetAt(i); //讀取當(dāng)前表數(shù)據(jù)
    for (j = 1; j <= sheet.LastRowNum; j++) //LastRowNum 是當(dāng)前表的總行數(shù)
    {
     IRow row = sheet.GetRow(j); //讀取當(dāng)前行數(shù)據(jù)
     if (row != null)
     {
      //for (int k = 0; k <= row.LastCellNum; k++) //LastCellNum 是當(dāng)前行的總列數(shù)
      //{
      //如果某一行的員工姓名,部門,崗位和員工信息表不對(duì)應(yīng),退出。
      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");//生成編號(hào)
      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;//工數(shù)
      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;//計(jì)件工資
      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;//醫(yī)補(bǔ)
      hr_sw.SW_D_DustFee = row.Cells[12].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[12].NumericCellValue.ToString()) : 0;//防塵費(fèi)
      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;//防暑費(fèi)
      hr_sw.SW_D_Wash = row.Cells[16].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[16].NumericCellValue.ToString()) : 0;//澡費(fèi)
      hr_sw.SW_D_Subsidy = row.Cells[17].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[17].NumericCellValue.ToString()) : 0;//補(bǔ)助
      hr_sw.SW_D_Bonus = row.Cells[18].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[18].NumericCellValue.ToString()) : 0;//獎(jiǎng)金
      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;//養(yǎng)老保險(xiǎn)
      hr_sw.SW_D_MedicalInsurance = row.Cells[21].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[21].NumericCellValue.ToString()) : 0;//醫(yī)療保險(xiǎn)
      hr_sw.SW_D_Lunch = row.Cells[22].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[22].NumericCellValue.ToString()) : 0;//餐費(fèi)
      hr_sw.SW_D_DeLunch = row.Cells[23].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[23].NumericCellValue.ToString()) : 0;//扣餐費(fèi)
      hr_sw.SW_D_De = row.Cells[24].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[24].NumericCellValue.ToString()) : 0;//扣項(xiàng)
      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;//應(yīng)發(fā)金額
      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;//實(shí)發(fā)金額
      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) {
   //錯(cuò)誤定位
   int k = j;
  }
  //再將list轉(zhuǎn)入數(shù)據(jù)庫(kù)
  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);
  }
  //將總計(jì)賦予主表
  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";
}
最后需要注意一點(diǎn)的就是,Excel中即使某些單元格內(nèi)容為空,但是其依舊占據(jù)了一個(gè)位置,所以在操作的時(shí)候需要格外注意。
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#操作Excel技巧總結(jié)》、《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
欄 目:C#教程
下一篇:C#拼圖游戲編寫代碼
本文標(biāo)題:C#使用NPOI導(dǎo)入Excel的方法詳解
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5789.html
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
 - 01-10C#3.0使用EventLog類寫Windows事件日志的方法
 - 01-10C#使用windows服務(wù)開啟應(yīng)用程序的方法
 - 01-10c# ArrayList的使用方法小總結(jié)
 - 01-10C#使用ADO.Net部件來(lái)訪問(wèn)Access數(shù)據(jù)庫(kù)的方法
 - 01-10C#使用Mutex簡(jiǎn)單實(shí)現(xiàn)程序單實(shí)例運(yùn)行的方法
 - 01-10使用Nopcommerce為商城添加滿XX減XX優(yōu)惠券功能
 - 01-10C#中yield用法使用說(shuō)明
 - 01-10C#編程和Visual Studio使用技巧(下)
 - 01-10C#編程和Visual Studio使用技巧(上)
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
 - 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#通過(guò)重寫Panel改變邊框顏色與寬度的
 - 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10delphi制作wav文件的方法
 - 04-02jquery與jsp,用jquery
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-10C#中split用法實(shí)例總結(jié)
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 


