欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用NPOI導入Excel的方法詳解

 更新時間:2017年04月11日 11:34:10   作者:布瑞澤的童話  
這篇文章主要介紹了C#使用NPOI導入Excel的方法,簡單介紹了NPOI的功能及操作Excel的導入、讀取等相關技巧,需要的朋友可以參考下

本文實例講述了C#使用NPOI導入Excel的方法。分享給大家供大家參考,具體如下:

NPOI是由國人開發(fā)的一個進行excel操作的第三方庫。百度百科介紹如下: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文件

接下來,將xls文件中的數(shù)據(jù)寫入workbook中:

HSSFWorkbook wk = new HSSFWorkbook(fs); //把xls文件中的數(shù)據(jù)寫入wk中

wk.NumberOfSheets是xls文件中總共的表的個數(shù)。

wk.GetSheetAt(i)是獲取第i個表的數(shù)據(jù)。

通過循環(huán):

for (int i = 0; i < wk.NumberOfSheets; i++) //NumberOfSheets是xls文件中總共的表數(shù)

將每個表的數(shù)據(jù)單獨存放在ISheet對象中:

ISheet sheet = wk.GetSheetAt(i); //讀取當前表數(shù)據(jù)

這樣某張表的數(shù)據(jù)就暫存在sheet對象中了。
接下來,我們可以通過sheet.LastRowNum來獲取行數(shù),sheet.GetRow(j)來獲取第j行數(shù)據(jù):

for (j = 1; j <= sheet.LastRowNum; j++) //LastRowNum 是當前表的總行數(shù)
{
  IRow row = sheet.GetRow(j); //讀取當前行數(shù)據(jù)

每一行的數(shù)據(jù)又存在IRow對象中。

我們可以通過row.LastCellNum來獲取列數(shù),row.Cells[i]來獲取第i列數(shù)據(jù)。

row.Cells[2].ToString();

這里需要注意一點的就是,如果單元格中數(shù)據(jù)為公式計算而出的話,row.Cells[i]會返回公式,需要改為:

row.Cells[2].NumericCellValue

就可以返回計算結果了。

最后將我在項目中用到的一段導入Excel數(shù)據(jù)賦予實體的示例如下:

/// <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文件中的數(shù)據(jù)寫入wk中
   for (int i = 0; i < wk.NumberOfSheets; i++) //NumberOfSheets是xls文件中總共的表數(shù)
   {
    ISheet sheet = wk.GetSheetAt(i); //讀取當前表數(shù)據(jù)
    for (j = 1; j <= sheet.LastRowNum; j++) //LastRowNum 是當前表的總行數(shù)
    {
     IRow row = sheet.GetRow(j); //讀取當前行數(shù)據(jù)
     if (row != null)
     {
      //for (int k = 0; k <= row.LastCellNum; k++) //LastCellNum 是當前行的總列數(shù)
      //{
      //如果某一行的員工姓名,部門,崗位和員工信息表不對應,退出。
      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;//工數(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;//計件工資
      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ī)補
      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;//養(yǎng)老保險
      hr_sw.SW_D_MedicalInsurance = row.Cells[21].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[21].NumericCellValue.ToString()) : 0;//醫(yī)療保險
      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;//應發(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;//實發(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) {
   //錯誤定位
   int k = j;
  }
  //再將list轉入數(shù)據(jù)庫
  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中即使某些單元格內容為空,但是其依舊占據(jù)了一個位置,所以在操作的時候需要格外注意。

更多關于C#相關內容感興趣的讀者可查看本站專題:《C#操作Excel技巧總結》、《C#程序設計之線程使用技巧總結》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結》、《C#數(shù)據(jù)結構與算法教程》、《C#數(shù)組操作技巧總結》及《C#面向對象程序設計入門教程

希望本文所述對大家C#程序設計有所幫助。

相關文章

  • c#多線程程序設計實例方法

    c#多線程程序設計實例方法

    在本篇文章里小編給大家分享了關于c#多線程程序設計實例步驟,需要的朋友們學習參考下。
    2019-02-02
  • C#基礎知識之base關鍵字介紹

    C#基礎知識之base關鍵字介紹

    本文主要介紹base關鍵字的使用方法,base關鍵字可以調用基類重寫的方法,可以調用基類的構造方法,還可以在EntityFramework中使用,下面一一介紹。
    2016-04-04
  • C#中的擴展方法詳解

    C#中的擴展方法詳解

    “擴展方法使您能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型、重新編譯或以其他方式修改原始類型。”這是msdn上說的,也就是你可以對String,Int,DataRow,DataTable等這些類型的基礎上增加一個或多個方法,使用時不需要去修改或編譯類型本身的代碼。
    2014-09-09
  • C#實現(xiàn)彈窗提示輸入密碼

    C#實現(xiàn)彈窗提示輸入密碼

    這篇文章主要為大家詳細介紹了C#實現(xiàn)彈窗提示輸入密碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#中DataTable和List互轉的示例代碼

    C#中DataTable和List互轉的示例代碼

    很多場景下,我們需要將List轉換成為DataTable,本文主要介紹了C#中DataTable和List互轉,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 登錄驗證全局控制的幾種方式總結(session)

    登錄驗證全局控制的幾種方式總結(session)

    在登陸驗證或者其他需要用到session全局變量的時候,歸結起來,主要有以下三種較方便的實現(xiàn)方式。(其中個人較喜歡使用第一種實現(xiàn)方法)
    2014-01-01
  • DevExpress中GridControl列轉義的實現(xiàn)方法

    DevExpress中GridControl列轉義的實現(xiàn)方法

    這篇文章主要介紹了DevExpress中GridControl列轉義的實現(xiàn)方法,在項目開發(fā)中有一定的實用價值,需要的朋友可以參考下
    2014-08-08
  • Unity Shader實現(xiàn)2D游戲迷霧

    Unity Shader實現(xiàn)2D游戲迷霧

    這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)2D游戲迷霧,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • unity 如何判斷鼠標是否在哪個UI上(兩種方法)

    unity 如何判斷鼠標是否在哪個UI上(兩種方法)

    這篇文章主要介紹了unity 判斷鼠標是否在哪個UI上的兩種實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 解決C#獲取鼠標相對當前窗口坐標的實現(xiàn)方法

    解決C#獲取鼠標相對當前窗口坐標的實現(xiàn)方法

    本篇文章是對在C#中獲取鼠標相對當前窗口坐標的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論