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();
}
}
}