天天看点

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中:

wk.NumberOfSheets是xls文件中总共的表的个数。

wk.GetSheetAt(i)是获取第i个表的数据。

通过循环:

将每个表的数据单独存放在ISheet对象中:

这样某张表的数据就暂存在sheet对象中了。

接下来,我们可以通过sheet.LastRowNum来获取行数,sheet.GetRow(j)来获取第j行数据:

for (j = ; j <= sheet.LastRowNum; j++)  //LastRowNum 是当前表的总行数
   {
     IRow row = sheet.GetRow(j);  //读取当前行数据
           

每一行的数据又存在IRow对象中。

我们可以通过row.LastCellNum来获取列数,row.Cells[i]来获取第i列数据。

row.Cells[].ToString();
           

这里需要注意一点的就是,如果单元格中数据为公式计算而出的话,row.Cells[i]会返回公式,需要改为:

就可以返回计算结果了。

最后将我在项目中用到的一段导入Excel数据赋予实体的示例如下:

/// <summary>
        /// 导入操作
        /// </summary>
        ///  @author:  刘放
        ///  @date:    //
        /// <param name="id">主表id</param>
        /// <returns>如果成功,返回ok,如果失败,返回不满足格式的姓名</returns>   
        public string InDB(string id)
        {
            int j=;
            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))   //打开xls文件
            {
                //定义一个工资详细集合
                List<HR_StaffWage_Details> staffWageList = new List<HR_StaffWage_Details>();
                try
                {
                    HSSFWorkbook wk = new HSSFWorkbook(fs);   //把xls文件中的数据写入wk中
                    for (int i = ; i < wk.NumberOfSheets; i++)  //NumberOfSheets是xls文件中总共的表数
                    {
                        ISheet sheet = wk.GetSheetAt(i);   //读取当前表数据
                        for (j = ; j <= sheet.LastRowNum; j++)  //LastRowNum 是当前表的总行数
                        {
                            IRow row = sheet.GetRow(j);  //读取当前行数据
                            if (row != null)
                            {
                                //for (int k = ; k <= row.LastCellNum; k++)  //LastCellNum 是当前行的总列数
                                //{
                                //如果某一行的员工姓名,部门,岗位和员工信息表不对应,退出。
                                SysEntities db = new SysEntities();
                                if (CommonHelp.IsInHR_StaffInfo(db, row.Cells[].ToString(), row.Cells[].ToString(), row.Cells[].ToString()) == false)//姓名,部门,岗位
                                {
                                    //返回名字以便提示
                                    return row.Cells[].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[].ToString();//姓名
                                hr_sw.SW_D_Department = row.Cells[].ToString();//部门
                                hr_sw.SW_D_Position = row.Cells[].ToString();//职位
                                hr_sw.SW_D_ManHour = row.Cells[].ToString() != "" ? Convert.ToDouble(row.Cells[].ToString()) : ;//工数
                                hr_sw.SW_D_PostWage = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//基本工资
                                hr_sw.SW_D_RealPostWage = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//岗位工资
                                hr_sw.SW_D_PieceWage = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//计件工资
                                hr_sw.SW_D_OvertimePay = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//加班工资
                                hr_sw.SW_D_YearWage = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//年假工资
                                hr_sw.SW_D_MiddleShift = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//中班
                                hr_sw.SW_D_NightShift = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//夜班
                                hr_sw.SW_D_MedicalAid = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//医补
                                hr_sw.SW_D_DustFee = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//防尘费
                                hr_sw.SW_D_Other = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//其他
                                hr_sw.SW_D_Allowance = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//津贴
                                hr_sw.SW_D_Heat = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//防暑费
                                hr_sw.SW_D_Wash = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//澡费
                                hr_sw.SW_D_Subsidy = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//补助
                                hr_sw.SW_D_Bonus = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//奖金
                                hr_sw.SW_D_Fine = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//罚款
                                hr_sw.SW_D_Insurance = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//养老保险
                                hr_sw.SW_D_MedicalInsurance = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//医疗保险
                                hr_sw.SW_D_Lunch = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//餐费
                                hr_sw.SW_D_DeLunch = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//扣餐费
                                hr_sw.SW_D_De = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//扣项
                                hr_sw.SW_D_Week = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//星期
                                hr_sw.SW_D_Duplex = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//双工
                                hr_sw.SW_D_ShouldWage = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//应发金额
                                hr_sw.SW_D_IncomeTax = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//所得税
                                hr_sw.SW_D_FinalWage = row.Cells[].NumericCellValue.ToString() != "" ? Convert.ToDouble(row.Cells[].NumericCellValue.ToString()) : ;//实发金额
                                hr_sw.SW_D_Remark = row.Cells[].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 = ;
                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,);
                dbt.SaveChanges();

            }
            sbr.ToString();
             return "OK";

        }
           

最后需要注意一点的就是,Excel中即使某些单元格内容为空,但是其依旧占据了一个位置,所以在操作的时候需要格外注意。