C#如何Excel表格数据的导入与导出

Excel的数据处理功能非常强大,因此在日常工作中,我们经常需要将数据从数据库或者DataTable等数据源导入到Excel文档来进行数据分析或运算,有时候又需要将Excel文档中的数据导出到数据库或者DataTable等数据源来读取数据。
本文为大家分享了C#导入导出Excel数据的具体代码,供大家参考,具体内容如下:

1、Excel表格数据的导入:
(1)顾名思义,要把数据导入到Excel表格中,前提就要把Excel表格创建好,下面是创建Excel表格的代码:

  //一:代码创建一个Excel表格(这里称为工作簿)
  //创建Excel文件的对象 工作簿(调用NPOI文件)
   HSSFWorkbook excelBook = new HSSFWorkbook();
   ISheet sheetl = excelBook.CreateSheet("员工基本信息");//创建Excel工作表 Sheet=员工基本信息
   IRow row1 = sheetl.CreateRow(0); //给Sheet(员工基本信息)添加第一行的头部标题
   //给标题的每一个单元格赋值
   row1.CreateCell(0).SetCellValue("机构名称");
   row1.CreateCell(1).SetCellValue("工作机构名称");
   row1.CreateCell(2).SetCellValue("姓名");
   row1.CreateCell(3).SetCellValue("性别");
   row1.CreateCell(4).SetCellValue("人员编号");
   row1.CreateCell(5).SetCellValue("登记号码");
   row1.CreateCell(6).SetCellValue("卡片号码");
   row1.CreateCell(7).SetCellValue("入职日期");
   row1.CreateCell(8).SetCellValue("身份证号码");
   row1.CreateCell(9).SetCellValue("考勤制度");
   row1.CreateCell(10).SetCellValue("默认班次");
   row1.CreateCell(11).SetCellValue("工作组");
   row1.CreateCell(12).SetCellValue("考勤方式");
   row1.CreateCell(13).SetCellValue("固定公休");
   row1.CreateCell(14).SetCellValue("部门");
   row1.CreateCell(15).SetCellValue("备注");

(2)查询所需要导出的数据

 var lingItem = from tbStaff in myModels.PW_Staff
			   join tbAInstitution in myModels.SYS_AInstitution on tbStaff.AInstitutionID equals tbAInstitution.AInstitutionID
	   		   join tbFixeRest in myModels.PW_FixeRest on tbStaff.FixeResID equals tbFixeRest.FixeResID
			   join tbSystem in myModels.PW_System on tbStaff.SystemID equals tbSystem.SystemID
			   join tbClasses in myModels.PW_Classes on tbStaff.ClassesID equals tbClasses.ClassesID
			   join tbWorkGroup in myModels.SYS_WorkGroup on tbStaff.WorkGroupID equals tbWorkGroup.WorkGroupID
			   join tbWInstitution in myModels.SYS_WInstitution on tbStaff.WInstitutionID equals tbWInstitution.WInstitutionID
			   join tbSection in myModels.SYS_Section on tbStaff.SectionID equals tbSection.SectionID
			   join tbSignInMode in myModels.SYS_SignInMode on tbStaff.SignInModeID equals tbSignInMode.SignInModeID
			   select new StaffVo
			   {
			       StaffID = tbStaff.StaffID,
			       AInstitutionID = tbAInstitution.AInstitutionID,//行政机构ID
			       AInstitutionName = tbAInstitution.AInstitutionName.Trim(),//行政机构名称
			       WInstitutionName = tbWInstitution.WInstitutionName.Trim(),//工作机构名称
			       StaffName = tbStaff.StaffName.Trim(),//姓名
			       StaffSex = tbStaff.StaffSex.Trim(),//性别
			       StaffNumber = tbStaff.StaffNumber.Trim(),//人员编号
			       RegisterNum = tbStaff.RegisterNum.Trim(),//登记号码
			       CardNum = tbStaff.CardNum.Trim(),//卡片号码
			       StaffIDNum = tbStaff.StaffIDNum.Trim(),//身份证号码
			       StaffData = tbStaff.StaffData.ToString(),//入职日期
			       SystemName = tbSystem.SystemName.Trim(),//考勤制度
			       ClassesName = tbClasses.ClassesName.Trim(),//默认班次
			       WorkGroupName = tbWorkGroup.WorkGroupName.Trim(),//工作组
			       SignInModeModeName = tbSignInMode.SignInModeModeName.Trim(),//考勤方式
			       FixeResName = tbFixeRest.FixeResName.Trim(),//固定公休
			       SectionName = tbSection.SectionName.Trim(),//部门
			       Comment = tbStaff.Comment.Trim(),//备注
			   };
            List<StaffVo> listExaminee = lingItem.ToList(); //查询数据

(3)添加数据行:将表格数据逐步写入sheet1各个行中(也就是给每一个单元格赋值)

 //添加数据行:将表格数据逐步写入sheet1各个行中(也就是给每一个单元格赋值)
	for (int i = 0; i < listExaminee.Count; i++)
	    {
	        IRow row = sheetl.CreateRow(i + 1);//创建行
	        row.CreateCell(0).SetCellValue(listExaminee[i].AInstitutionName); //行政机构名称
	        row.CreateCell(1).SetCellValue(listExaminee[i].WInstitutionName);  //工作机构名称
	        row.CreateCell(2).SetCellValue(listExaminee[i].StaffName);//姓名
	        row.CreateCell(3).SetCellValue(listExaminee[i].StaffSex);//性别
	        row.CreateCell(4).SetCellValue(listExaminee[i].StaffNumber); //人员编号
	        row.CreateCell(5).SetCellValue(listExaminee[i].RegisterNum); //登记号码
	        row.CreateCell(6).SetCellValue(listExaminee[i].CardNum);//卡片号码
	        row.CreateCell(7).SetCellValue(listExaminee[i].StaffData); //入职日期
	        row.CreateCell(8).SetCellValue(listExaminee[i].StaffIDNum);//身份证号码
	        row.CreateCell(9).SetCellValue(listExaminee[i].SystemName); //考勤制度
	        row.CreateCell(10).SetCellValue(listExaminee[i].ClassesName); //默认班次
	        row.CreateCell(11).SetCellValue(listExaminee[i].WorkGroupName);//工作组
	        row.CreateCell(12).SetCellValue(listExaminee[i].SignInModeModeName); //考勤方式
	        row.CreateCell(13).SetCellValue(listExaminee[i].FixeResName);//固定公休
	        row.CreateCell(14).SetCellValue(listExaminee[i].SectionName);//备注
	        row.CreateCell(15).SetCellValue(listExaminee[i].Comment);//备注
	    }

(4)配置Excel参数,输出Excel文件

string fileName = "员工基本信息" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".xls";//输出的文件名称
System.IO.MemoryStream bookStream = new System.IO.MemoryStream();//把Excel转为流,输出   创建文件流
excelBook.Write(bookStream);//将工作薄写入文件流
bookStream.Seek(0, System.IO.SeekOrigin.Begin);//输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置
return File(bookStream, "application/vnd.ms-excel", fileName);//Stream对象,文件类型,文件名称

2、Excel表格数据的导出:
Excel表格数据的到出,也就是数据导出到数据库或者DataTable等数据源,首页访问到Excel表格数据,再进行数据的导出操作,下面是访问Excel表格的代码:

public ActionResult GetTableFromExcel()//从Excel表格数据导入到DateTable
{
   HttpPostedFileBase fostFile = Request.Files["file"];//访问上传的文件
   try
   {
       if (fostFile.ContentLength != 0)//当文件内容的长度不为0
       {
           Stream streamfile = fostFile.InputStream;//创建文件流
           HSSFWorkbook hssfworkbook = new HSSFWorkbook(streamfile);//创建Excel文件的对象 工作簿读取流内容
           using (NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0))//引用第1个sheet
           {
               DataTable table = new DataTable();//创建内存表
               IRow headerRow = sheet.GetRow(0);//第一行为标题行  
               int cellCount = headerRow.LastCellNum;//获取标题行的单元格数
               int rowCount = sheet.LastRowNum;//获取工作簿的行数 
               for (int i = headerRow.FirstCellNum; i < cellCount; i++)//从第一个单元格循环到最后一个单元格
               {
                   DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);//获取标题行单元格值
                   table.Columns.Add(column);//把标题行单元格值放入内存表的列中
               }
               for (int i = (sheet.FirstRowNum + 1); i <=rowCount; i++)//循环工作簿的内容
               {
                   IRow row = sheet.GetRow(i);//工作簿的每一行
                   DataRow dataRow = table.NewRow();//创建内存表行
                   if (row != null)//当行的内容Excel表格不为空
                   {
                       for (int j = row.FirstCellNum; j < cellCount; j++)//获取工作簿每一行单元格值
                       {
                           if (row.GetCell(j) != null)//当单元格值不为空
                               dataRow[j] = GetCellValue(row.GetCell(j)); //调用GetCellValue方法获取工作簿单元格值
                       }
                       table.Rows.Add(dataRow);//把工作簿行单元格值放入内存表中
                   }
               }
               List<Array> list = new List<Array>();//创建一个类型为数组的列表
               for (int i = 0; i < table.Rows.Count-1; i++)//循环内存表的每一行
               {
                   Array[] Cday = new Array[] { table.Rows[i].ItemArray };//把内存表所有数据放到数组中
                   list.AddRange(Cday);//把数组添加到列表中
               }
               return Json(list, JsonRequestBehavior.AllowGet);
           }
       }
       else
       {
           return Json(" ", JsonRequestBehavior.AllowGet);
       }
   }
   catch (Exception )
   {
       return Json(" ", JsonRequestBehavior.AllowGet);
   }
}

获取工作簿单元格值的方法:

private static string GetCellValue(ICell cell)//根据Excel列类型获取列的值 
{
	if (cell == null) return string.Empty;
	switch (cell.CellType)
	{
		case CellType.BLANK:
		return string.Empty;
		case CellType.BOOLEAN:
		return cell.BooleanCellValue.ToString();
		case CellType.ERROR:
		return cell.ErrorCellValue.ToString();
		case CellType.NUMERIC:
		case CellType.Unknown:
		default:
		return cell.ToString();
		case CellType.STRING:
		return cell.StringCellValue;
		case CellType.FORMULA:
		try
		{
			HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
			e.EvaluateInCell(cell);
			return cell.ToString();
		}
		catch
		{
			return cell.NumericCellValue.ToString();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40036240/article/details/87900035
今日推荐