使用NPOI导入Excel

首先在MVC项目中导入NPOI

查询NPOI安装,排序依据,选择:最高下载量,选择第一个。

在控制器中创建ExcelController

在Index视图中写入代码:

@using (Html.BeginForm("Import", "Excel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input name="file" type="file" id="=file" />
<input name="submit" id="submit" type="submit" value="批量导入" />
}

创建Import控制器

添加Import视图

Import控制器中的代码:

  1. [HttpPost]
  2. public ActionResult Import(HttpPostedFileBase file)
  3. {
  4. var fileName = file.FileName;
  5. var filePath = Server.MapPath(string.Format("~/{0}", "Files"));
  6. string path = Path.Combine(filePath, fileName);
  7. file.SaveAs(path);
  8.  
  9. DataTable excelTable = new DataTable();
  10. excelTable = ImportExcel.GetExcelDataTable(path);
  11.  
  12. DataTable dbdata = new DataTable();
  13. dbdata.Columns.Add("email");
  14. dbdata.Columns.Add("pwd");
  15. dbdata.Columns.Add("logintime");
  16.  
  17. for (int i = ; i < excelTable.Rows.Count; i++)
  18. {
  19. DataRow dr = excelTable.Rows[i];
  20. DataRow dr_ = dbdata.NewRow();
  21. dr_["email"] = dr["邮箱"];
  22. dr_["pwd"] = dr["密码"];
  23. dr_["logintime"] = dr["时间"];
  24. dbdata.Rows.Add(dr_);
  25. }
  26. RemoveEmpty(dbdata);
  27.  
  28. string constr = System.Configuration.ConfigurationManager.AppSettings["meixinEntities_"];
  29.  
  30. SqlBulkCopyByDatatable(constr, "m_user1", dbdata);
  31.  
  32. return View();
  33. }

添加logic文档,添加ImportExcel类,添加一个Files文档保存Excel文件

这里需要引用NPOI类库,ImportExcel类里的代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using NPOI;
  6. using System.Data;
  7. using NPOI.SS.UserModel;
  8. using System.IO;
  9. using NPOI.HSSF.UserModel;
  10. using NPOI.XSSF.UserModel;
  11.  
  12. namespace MvcExcel导入导出1.logic
  13. {
  14. public class ImportExcel
  15. {
  16.  
  17. public static DataTable GetExcelDataTable(string filePath)
  18. {
  19. IWorkbook Workbook;
  20. DataTable table = new DataTable();
  21. try
  22. {
  23. using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
  24. {
  25. //XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
  26. string fileExt = Path.GetExtension(filePath).ToLower();
  27. if (fileExt == ".xls")
  28. {
  29. Workbook = new HSSFWorkbook(fileStream);
  30. }
  31. else if (fileExt == ".xlsx")
  32. {
  33. Workbook = new XSSFWorkbook(fileStream);
  34. }
  35. else
  36. {
  37. Workbook = null;
  38. }
  39. }
  40. }
  41. catch (Exception ex)
  42. {
  43. throw ex;
  44. }
  45.  
  46. //定位在第一个sheet
  47. ISheet sheet = Workbook.GetSheetAt();
  48. //第一行为标题行
  49. IRow headerRow = sheet.GetRow();
  50. int cellCount = headerRow.LastCellNum;
  51. int rowCount = sheet.LastRowNum;
  52.  
  53. //循环添加标题列
  54. for (int i = headerRow.FirstCellNum; i < cellCount; i++)
  55. {
  56. DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
  57. table.Columns.Add(column);
  58. }
  59.  
  60. //数据
  61. for (int i = (sheet.FirstRowNum + ); i <= rowCount; i++)
  62. {
  63. IRow row = sheet.GetRow(i);
  64. DataRow dataRow = table.NewRow();
  65. if (row != null)
  66. {
  67. for (int j = row.FirstCellNum; j < cellCount; j++)
  68. {
  69. if (row.GetCell(j) != null)
  70. {
  71. dataRow[j] = GetCellValue(row.GetCell(j));
  72. }
  73. }
  74. }
  75. table.Rows.Add(dataRow);
  76. }
  77. return table;
  78. }
  79.  
  80. private static string GetCellValue(ICell cell)
  81. {
  82. if (cell == null)
  83. {
  84. return string.Empty;
  85. }
  86.  
  87. switch (cell.CellType)
  88. {
  89. case CellType.Blank:
  90. return string.Empty;
  91. case CellType.Boolean:
  92. return cell.BooleanCellValue.ToString();
  93. case CellType.Error:
  94. return cell.ErrorCellValue.ToString();
  95. case CellType.Numeric:
  96. case CellType.Unknown:
  97. default:
  98. return cell.ToString();
  99. case CellType.String:
  100. return cell.StringCellValue;
  101. case CellType.Formula:
  102. try
  103. {
  104. HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
  105. e.EvaluateInCell(cell);
  106. return cell.ToString();
  107. }
  108. catch
  109. {
  110. return cell.NumericCellValue.ToString();
  111. }
  112. }
  113. }
  114.  
  115. }
  116. }

在Import控制器中获取到datatable的数据之后,在下面添加批量插入DataTable数据的方法,传入三个参数。

  1. /// <summary>
  2. /// 大数据插入
  3. /// </summary>
  4. /// <param name="connectionString">目标库连接</param>
  5. /// <param name="TableName">目标表</param>
  6. /// <param name="dtSelect">来源数据</param>
  7. public static void SqlBulkCopyByDatatable(string connectionString, string TableName, DataTable dtSelect)
  8. {
  9. using (SqlConnection conn = new SqlConnection(connectionString))
  10. {
  11. using (SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction))
  12. {
  13. try
  14. {
  15. sqlbulkcopy.DestinationTableName = TableName;
  16. sqlbulkcopy.BatchSize = ;
  17. sqlbulkcopy.BulkCopyTimeout = ;//不限时间
  18. for (int i = ; i < dtSelect.Columns.Count; i++)
  19. {
  20. sqlbulkcopy.ColumnMappings.Add(dtSelect.Columns[i].ColumnName, dtSelect.Columns[i].ColumnName);
  21. }
  22. sqlbulkcopy.WriteToServer(dtSelect);
  23. }
  24. catch (System.Exception ex)
  25. {
  26. throw ex;
  27. }
  28. }
  29. }
  30. }

第一个是从NPOI读取到的Excel的数据,保存到excelTable里,第二个是把表的中文表头转换成数据库表中对应的英文,第三个是获取连接字符串,调用批量插入数据库的方法

插入数据需要传入数据库连接字符串,在Web.config中的<appSettings>中添加自己的数据库连接字符串

在导入Excel数据的时候,有时候会有空行,用RemoveEmpty方法去空,代码如下

  1. protected void RemoveEmpty(DataTable dt)
  2. {
  3. List<DataRow> removelist = new List<DataRow>();
  4. for (int i = ; i < dt.Rows.Count; i++)
  5. {
  6. bool IsNull = true;
  7. for (int j = ; j < dt.Columns.Count; j++)
  8. {
  9. if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
  10. {
  11. IsNull = false;
  12. }
  13. }
  14. if (IsNull)
  15. {
  16. removelist.Add(dt.Rows[i]);
  17. }
  18. }
  19. for (int i = ; i < removelist.Count; i++)
  20. {
  21. dt.Rows.Remove(removelist[i]);
  22. }
  23. }

ASP.NET MVC NPOI导入Excel DataTable批量导入到数据库的更多相关文章

  1. ASP.NET MVC - NPOI读取Excel

    引入: using System; using System.Data; using System.IO; using NPOI.SS.UserModel; using NPOI.XSSF.UserM ...

  2. asp.net mvc NPOI 生成Excel文件

    private string PushToDown(string addtime) { DataTable dt = _bCreateCode.PushtoExcel(addtime); //1.实例 ...

  3. asp.net MVC NPOI导出excel通用

    一.创建一个类文件添加 public class ExportToExcelColumn { public ExportToExcelColumn(string _Columnnames, strin ...

  4. Asp.net MVC NPOI导出Excel

    public class NpoiMemoryStream : MemoryStream { public NpoiMemoryStream() { AllowClose = true; } publ ...

  5. asp.net 使用NPOI读取excel文件

    asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...

  6. Java实现Excel数据批量导入数据库

    Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...

  7. .Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能

    .Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能 我的项目需求是:在.net4.5中用mvc5实现上传xml文件,后台实时导入数据库时传到前台进度, ...

  8. MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)

    MySQL数据库工具类之——DataTable批量加入数据库(Net版),MySqlDbHelper通用类希望能对大家有用,代码如下: using MySql.Data.MySqlClient; us ...

  9. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

随机推荐

  1. mysql8.0.4以后修改密码方式变更

    https://blog.csdn.net/qq_38265784/article/details/80915098 use mysql: ALTER USER 'root'@'localhost' ...

  2. 2018.10.25 bzoj3928: [Cerc2014] Outer space invaders(区间dp)

    传送门 区间dpdpdp好题. 首先肯定需要把坐标离散化. 然后在数轴上面区间dpdpdp. 对于当前区间,区间中最大的数一定会被选. 于是我们记f[i,j]f[i,j]f[i,j]表示所有左端点在i ...

  3. Firefox,chrome,IE上传图片预览

    首先判断IE或是Firefox,chrome.本文只测试了IE8中和Firefox,chrome是不一样的. 判断是否IE: if(-[1,]){//判断浏览器不是IE    //alert((-[1 ...

  4. ubuntu彻底删除apache2 再重装

    删除apache2不彻底,导致用 apt-get install apache2 重新装时总是不成功.下面是如何彻底删除apache2 1. 删除apache 代码: $ sudo apt-get - ...

  5. 研究生flag

    是时候定个计划了,感觉日子一天天水,不加油学点东西,迟早要掉队…… 刷刷算法题库吧,貌似选几个管用的刷刷——https://hihocoder.com/problemset 争取明年三月份的PAT顶级 ...

  6. navigtor对象和插件检测

    每一个浏览器都内置了属于自己的一套属性和方法 浏览器中navigator对象有plugins属性对象存着插件的数组 每一项包含: name 插件名称 description 插件的描述 filenam ...

  7. python_day1_python简单介绍

    一.python解释器的种类 我们都知道python是一种解释型的语言,那python在执行的过程中必须要通过解释器来执行,那python的解释器到底分为哪些呢? 1.Cpython CPython是 ...

  8. 阿里云oss如何上传一个文件夹

    最近公司在做工程项目,实现文件夹云存储上传 网上找了很久,发现很多项目都存在一些问题,但还是让我找到了一个成熟的项目. 工程: 对项目的文件夹云存储上传功能做出分析,找出文件夹上传的原理,对文件夹的云 ...

  9. mui学习

      改变状态栏的颜色 <meta name="apple-mobile-web-app-capable" content="yes"> <me ...

  10. java如何编写下载功能

    @RequestMapping("/downLoadFailRecord") public ModelAndView downLoadFailRecord( HttpServlet ...