第一步,利用Nuget获取NPOI插件;
第二步,
引用添加完成后,主要会添加四个dll的引用;四个dll:NPOI、NPOI.OOXML、NPOI.OpenXML4Net、 NPOI.OpenXmlFormats;
第三步: 前端(导入数据)
表单(演示是HTML辅助器形式的表单,也可使用HTML5经典表单<form></form>):
@using (Html.BeginForm("Import", "manage", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input name="file" type="file" id="=file" />
<input name="submit" id="submit" type="submit" value="导入学生" />
}
第四步:控制器(导入数据)
先导入这两个命名空间(如图)
第一个方法根据数据库表字段而定(注意...Add()的内容),后面两个方法直接复制使用
/// <summary>
/// 导入数据1
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost]
public ActionResult Import(HttpPostedFileBase file)
{
var fileName = file.FileName;
var filePath = Server.MapPath(string.Format("~/{0}", "Files"));
string path = Path.Combine(filePath, fileName);
file.SaveAs(path);
DataTable excelTable = new DataTable();
excelTable = ImportExcel.GetExcelDataTable(path);
DataTable dbdata = new DataTable();
dbdata.Columns.Add("ID");//“ID”就是对应你数据库的字段
dbdata.Columns.Add("StuName");
//(...根据你的数据库字段写来定...)
for (int i = 0; i < excelTable.Rows.Count; i++)
{
DataRow dr = excelTable.Rows[i];
DataRow dr_ = dbdata.NewRow();
dr_["ID"] = dr["学生编号"];
dr_["StuName"] = dr["学生姓名"];
//(...根据你的数据库字段来定...)
dbdata.Rows.Add(dr_);//添加保存
}
RemoveEmpty(dbdata);
string constr = System.Configuration.ConfigurationManager.AppSettings["LoveManagementDB_"];
SqlBulkCopyByDatatable(constr, "Student", dbdata);
return RedirectToAction("classManage");
}
/// <summary>
/// 数据插入2
/// </summary>
/// <param name="connectionString">目标库连接</param>
/// <param name="TableName">目标表</param>
/// <param name="dtSelect">来源数据</param>
public static void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dtSelect)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
{
try
{
sqlbulkcopy.DestinationTableName = TableName;
sqlbulkcopy.BatchSize = 20000;
sqlbulkcopy.BulkCopyTimeout = 0;//不限时间
for (int i = 0; i < dtSelect.Columns.Count; i++)
{
sqlbulkcopy.ColumnMappings.Add(dtSelect.Columns[i].ColumnName, dtSelect.Columns[i].ColumnName);
}
sqlbulkcopy.WriteToServer(dtSelect);
}
catch (System.Exception ex)
{
throw ex;
}
}
}
}
/// <summary>
/// 批量导入步骤3
/// </summary>
/// <param name="dt"></param>
protected void RemoveEmpty(DataTable dt)
{
List<DataRow> removelist = new List<DataRow>();
for (int i = 0; i < dt.Rows.Count; i++)
{
bool IsNull = true;
for (int j = 0; j < dt.Columns.Count; j++)
{
if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
{
IsNull = false;
}
}
if (IsNull)
{
removelist.Add(dt.Rows[i]);
}
}
for (int i = 0; i < removelist.Count; i++)
{
dt.Rows.Remove(removelist[i]);
}
}
最后:实现导出数据
前端: 使用a标签提交
<a href="/manage/getExcelByStudent" class="btn" id="getExcelByStudent">导出数据</a>
控制器:(根据数据库表字段去对应修改,看对应注释)
/// <summary>
/// 导出(根据班级ID导出对应数据)
/// </summary>
/// <param name="tbClassId">根据班级ID</param>
/// <returns></returns>
public ActionResult getExcelByStudent(int tbClassId)
{
List<Student> listStudent = db.Student.Where(n => n.TbClassID == tbClassId).ToList(); //在这里写查询代码...);
TbClass tbclass = db.TbClass.Where(n => n.ClassID == tbClassId).FirstOrDefault();
//将查询出来的数据转化为对象列表的格式
HSSFWorkbook excelBook = new HSSFWorkbook(); //创建工作簿Excel
NPOI.SS.UserModel.ISheet sheet1 = excelBook.CreateSheet(tbclass.TbClassName + "详情信息");//为工作簿创建工作表并命名
//编写工作表 (1)表头 (2)数据:listStudent
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);//创建第一行
row1.CreateCell(0).SetCellValue("学生编号"); //创建其他列并赋值( 根据具体数据写代码...)
row1.CreateCell(1).SetCellValue("学生姓名");
//...根据数据库表字段而定...
for (int i = 0; i < listStudent.Count(); i++)
{
//创建行( 根据具体数据写代码...)
NPOI.SS.UserModel.IRow rowTemp = sheet1.CreateRow(i + 1);
rowTemp.CreateCell(0).SetCellValue(listStudent[i].ID);//对应表字段
rowTemp.CreateCell(1).SetCellValue(listStudent[i].StuName);
//...根据数据库表字段而定...
}
var fileName = tbclass.TbClassName + "的学生信息" + ".xls";//文件名
//将Excel表格转化为流,输出
MemoryStream bookStream = new MemoryStream();//创建文件流
excelBook.Write(bookStream); //文件写入流(向流中写入字节序列)
bookStream.Seek(0, SeekOrigin.Begin);//输出之前调用Seek,把0位置指定为开始位置
return File(bookStream, "application/vnd.ms-excel", fileName);//最后以文件形式返回
}