.Net core 使用NPOI 直接导入Excel到数据库(即不先将Excel保存到服务器再读取文件

时间:2021-12-12 06:41:43

原文:.Net core 使用NPOI 直接导入Excel到数据库(即不先将Excel保存到服务器再读取文件到数据库)

.Net core 使用NPOI 直接导入Excel到数据库(即不先将Excel保存到服务器再读取文件
  1         /// <summary>
  2         /// 导入信息
  3         /// </summary>
  4         /// <param name="file"></param>
  5         /// <returns></returns>
  6         /// /Public/PublicPool/ImportCustomer
  7         public ResultData ImportCustomer(IFormFile file)
  8         {
  9             ResultData resultData = new ResultData();
 10             if (file.Length > 0)
 11             {
 12                 DataTable dt = new DataTable();
 13                 string strMsg;
 14                 //利用IFormFile里面的OpenReadStream()方法直接读取文件流
 15                 dt = ExcelHelper.ExcelToDatatable(file.OpenReadStream(), Path.GetExtension(file.FileName), out strMsg);
 16                 if (!string.IsNullOrEmpty(strMsg))
 17                 {
 18                     resultData.Code = -1;
 19                     resultData.Msg = strMsg;
 20                     return resultData;
 21                 }
 22                 if (dt.Rows.Count > 0)
 23                 {
 24                 }
 25                 else
 26                 {
 27                     resultData.Code = -1;
 28                     resultData.Msg = "Excel导入表无数据!";
 29                 }
 30             return resultData;
 31         }
 32 
 33 using NPOI.HSSF.UserModel;
 34 using NPOI.SS.UserModel;
 35 using NPOI.XSSF.UserModel;
 36 using System;
 37 using System.Collections.Generic;
 38 using System.Data;
 39 using System.IO;
 40 using System.Text;
 41 
 42 namespace CRM.Common
 43 {
 44     public static class ExcelHelper
 45     {
 46         /// <summary>
 47         /// 将Excel单表转为Datatable
 48         /// </summary>
 49         /// <param name="stream"></param>
 50         /// <param name="fileType"></param>
 51         /// <param name="strMsg"></param>
 52         /// <param name="sheetName"></param>
 53         /// <returns></returns>
 54         public static DataTable ExcelToDatatable(Stream stream, string fileType, out string strMsg, string sheetName = null)
 55         {
 56             strMsg = "";
 57             DataTable dt = new DataTable();
 58             ISheet sheet = null;
 59             IWorkbook workbook = null;
 60             try
 61             {
 62                 #region 判断excel版本
 63                 //2007以上版本excel
 64                 if (fileType == ".xlsx")
 65                 {
 66                 workbook = new XSSFWorkbook(stream);  67                 }
 68                 //2007以下版本excel
 69                 else if (fileType == ".xls")
 70                 {
 71                   workbook = new HSSFWorkbook(stream);
 72                 }
 73                 else
 74                 {
 75                     throw new Exception("传入的不是Excel文件!");
 76                 }
 77                 #endregion
 78                 if (!string.IsNullOrEmpty(sheetName))
 79                 {
 80                     sheet = workbook.GetSheet(sheetName);
 81                     if (sheet == null)
 82                     {
 83                         sheet = workbook.GetSheetAt(0);
 84                     }
 85                 }
 86                 else
 87                 {
 88                     sheet = workbook.GetSheetAt(0);
 89                 }
 90                 if (sheet != null)
 91                 {
 92                     IRow firstRow = sheet.GetRow(0);
 93                     int cellCount = firstRow.LastCellNum;
 94                     for (int i = firstRow.FirstCellNum; i < cellCount; i  )
 95                     {
 96                         ICell cell = firstRow.GetCell(i);
 97                         if (cell != null)
 98                         {
 99                            string cellValue = cell.StringCellValue.Trim();
100                             if (!string.IsNullOrEmpty(cellValue))
101                             {
102                                 DataColumn dataColumn = new DataColumn(cellValue);
103                                 dt.Columns.Add(dataColumn);
104                             }
105                         }
106                     }
107                     DataRow dataRow = null;
108                     //遍历行
109                     for (int j = sheet.FirstRowNum   1; j <= sheet.LastRowNum; j  )
110                     {
111                         IRow row = sheet.GetRow(j);
112                         dataRow = dt.NewRow();
113                         if (row == null || row.FirstCellNum < 0)
114                         {
115                             continue;
116                         }
117                         //遍历列
118                         for (int i = row.FirstCellNum; i < cellCount; i  )
119                         {
120                             ICell cellData = row.GetCell(i);
121                             if (cellData != null)
122                             {
123                                 //判断是否为数字型,必须加这个判断不然下面的日期判断会异常
124                                 if (cellData.CellType == CellType.Numeric)
125                                 {
126                                     //判断是否日期类型
127                                     if (DateUtil.IsCellDateFormatted(cellData))
128                                     {
129                                         dataRow[i] = cellData.DateCellValue;
130                                     }
131                                     else
132                                     {
133                                         dataRow[i] = cellData.ToString().Trim();
134                                     }
135                                 }
136                                 else
137                                 {
138                                     dataRow[i] = cellData.ToString().Trim();
139                                 }
140                             }
141                         }
142                         dt.Rows.Add(dataRow);
143                     }
144                 }
145                 else
146                 {
147                     throw new Exception("没有获取到Excel中的数据表!");
148                 }
149             }
150             catch (Exception ex)
151             {
152                 strMsg = ex.Message;
153             }
154             return dt;
155         }
156     }
157 }
.Net core 使用NPOI 直接导入Excel到数据库(即不先将Excel保存到服务器再读取文件


网上找了好多都没有直接保存导数据库的方法,自己研究了IFormFile类后尝试了一下没想到意外的成功了~~~~~~~~~~