菜鳥编程园地

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1713|回复: 0

C# 将excel记录导入数据库

[复制链接]

5

主题

7

帖子

24

积分

版主

Rank: 7Rank: 7Rank: 7

积分
24
发表于 2020-8-5 13:31:22 | 显示全部楼层 |阅读模式
C# 将excel记录导入数据库代码:

1、读取excel数据到datatable
  1. public class ExcelHelper
  2.     {
  3.         /// <summary>
  4.         /// 读取excel到datatable中
  5.         /// </summary>
  6.         /// <param name="excelPath">excel地址</param>
  7.         /// <param name="sheetIndex">sheet索引</param>
  8.         /// <returns>成功返回datatable,失败返回null</returns>
  9.         public static DataTable ImportExcel(string excelPath, int sheetIndex)
  10.         {

  11.             IWorkbook workbook = null;//全局workbook
  12.             ISheet sheet;//sheet
  13.             DataTable table = null;
  14.             try
  15.             {
  16.                 FileInfo fileInfo = new FileInfo(excelPath);//判断文件是否存在
  17.                 if (fileInfo.Exists)
  18.                 {
  19.                     FileStream fileStream = fileInfo.OpenRead();//打开文件,得到文件流
  20.                     switch (fileInfo.Extension)
  21.                     {
  22.                         //xls是03,用HSSFWorkbook打开,.xlsx是07或者10用XSSFWorkbook打开
  23.                         case ".xls": workbook = new HSSFWorkbook(fileStream); break;
  24.                         case ".xlsx": workbook = new XSSFWorkbook(fileStream); break;
  25.                         default: break;
  26.                     }
  27.                     fileStream.Close();//关闭文件流
  28.                 }
  29.                 if (workbook != null)
  30.                 {
  31.                     sheet = workbook.GetSheetAt(sheetIndex);//读取到指定的sheet
  32.                     sheet.ForceFormulaRecalculation = true;//自动重算,更新单元格公式计算值
  33.                     table = new DataTable();//初始化一个table

  34.                     IRow headerRow = sheet.GetRow(0);//获取第一行,一般为表头
  35.                     int cellCount = headerRow.LastCellNum;//得到列数

  36.                     for (int i = headerRow.FirstCellNum; i < cellCount; i++)
  37.                     {
  38.                         DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);//初始化table的列
  39.                         table.Columns.Add(column);
  40.                     }
  41.                     //遍历读取cell
  42.                     for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
  43.                     {
  44.                         NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//得到一行
  45.                         DataRow dataRow = table.NewRow();//新建一个行
  46.                         if (row.GetCell(row.FirstCellNum) != null && row.GetCell(row.FirstCellNum).CellType != CellType.Blank)
  47.                         {
  48.                             for (int j = row.FirstCellNum; j < cellCount; j++)
  49.                             {
  50.                                 ICell cell = row.GetCell(j);//得到cell
  51.                                 if (cell == null)//如果cell为null,则赋值为空
  52.                                 {
  53.                                     dataRow[j] = "";
  54.                                 }
  55.                                 else
  56.                                 {
  57.                                     //dataRow[j] = row.GetCell(j).ToString();//否则赋值
  58.                                     dataRow[j] = GetCellValue(row.GetCell(j));
  59.                                 }
  60.                             }

  61.                             table.Rows.Add(dataRow);//把行 加入到table中
  62.                         }

  63.                     }
  64.                 }
  65.                 return table;

  66.             }
  67.             catch (Exception e)
  68.             {
  69.                 Lb.Utility.LogManager.WriteLog("ExcelHelper", "ExcelHelper", e.Message+e.StackTrace);
  70.                 return table;
  71.             }
  72.             finally
  73.             {
  74.                 //释放资源
  75.                 if (table != null) { table.Dispose(); }
  76.                 workbook = null;
  77.                 sheet = null;
  78.             }
  79.         }
  80.         public static object GetCellValue(ICell cell)
  81.         {
  82.             object v;
  83.             switch (cell.CellType)
  84.             {
  85.                 case CellType.Blank:
  86.                     v = string.Empty;
  87.                     break;
  88.                 case CellType.Boolean:
  89.                     v = cell.BooleanCellValue;
  90.                     break;
  91.                 case CellType.Numeric:
  92.                     if (DateUtil.IsCellDateFormatted(cell))//日期
  93.                     {
  94.                         v = cell.DateCellValue.ToString("yyyy/MM/dd");
  95.                     }
  96.                     else
  97.                     {
  98.                         v = cell.NumericCellValue;
  99.                     }
  100.                     break;
  101.                 case CellType.String:
  102.                     v = cell.StringCellValue.Trim();
  103.                     break;
  104.                 case CellType.Error:
  105.                     v = cell.ErrorCellValue;
  106.                     break;
  107.                 case CellType.Formula://公式
  108.                                       //try
  109.                                       //{
  110.                                       //    HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
  111.                                       //    e.EvaluateInCell(cell);
  112.                                       //    v = cell.ToString();
  113.                                       //}
  114.                                       //catch
  115.                                       //{
  116.                                       //    if (DateUtil.IsCellDateFormatted(cell))//日期
  117.                                       //    {
  118.                                       //        v = cell.DateCellValue.ToString("yyyy/MM/dd");
  119.                                       //    }
  120.                                       //    else
  121.                                       //    {
  122.                                       //        v = cell.NumericCellValue;
  123.                                       //    }
  124.                                       //}

  125.                     try
  126.                     {
  127.                         if (DateUtil.IsCellDateFormatted(cell))//日期
  128.                         {
  129.                             v = cell.DateCellValue.ToString("yyyy/MM/dd");
  130.                         }
  131.                         else
  132.                         {
  133.                             v = cell.NumericCellValue;
  134.                         }
  135.                     }
  136.                     catch (Exception ex)
  137.                     {
  138.                         HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
  139.                         e.EvaluateInCell(cell);
  140.                         v = cell.ToString();
  141.                     }


  142.                     break;
  143.                 default:
  144.                     v = cell.ToString();
  145.                     break;
  146.             }
  147.             return v;
  148.         }

  149.     }
复制代码


2、从datatable里批量读取数据保存到数据库里
  1. if (string.IsNullOrEmpty(fileUrl))
  2.         {
  3.             return "{"state":false,"msg":"没有文件"}";
  4.         }
  5.         string path =  fileUrl;
  6.         DataTable dt = new DataTable();    //定义datatable里列名称和数据类型
  7.         dt.Columns.Add("Dper", System.Type.GetType("System.String"));//添加列
  8.         dt.Columns.Add("account", System.Type.GetType("System.String"));
  9.         dt.Columns.Add("UserN", System.Type.GetType("System.String"));
  10.         dt.Columns.Add("Passw", System.Type.GetType("System.String"));
  11.         dt.Columns.Add("permissions", System.Type.GetType("System.String"));
  12.         dt.Columns.Add("Dtm", System.Type.GetType("System.String"));

  13.         dt = ExcelHelper.ImportExcel(path, 0);
  14.         if (dt == null)
  15.         {
  16.             return "{"state":false,"msg":"没有数据"}";
  17.         }
  18.         int total = 0;
  19.         try
  20.         {
  21.             string connectionString = db.ConnectionString;

  22.             using (SqlConnection destinationConnection = new SqlConnection(connectionString))
  23.             {
  24.                 destinationConnection.Open();
  25.                
  26.                 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
  27.                 {
  28.                     try
  29.                     {
  30.                         string[] DataTableTitle = new string[dt.Columns.Count];
  31.                         for (int i = 0; i < dt.Columns.Count; i++)
  32.                         {
  33.                             DataTableTitle[i] = dt.Columns[i].ColumnName;
  34.                         }
  35.                         string[] DBColumnName = { "Dper", "account", "UserN", "Passw", "permissions" };

  36.                         bulkCopy.BulkCopyTimeout = 100;  //超时之前操作完成所允许的秒数
  37.                         bulkCopy.DestinationTableName = "UserP";//要插入的表的表名
  38.                         bulkCopy.BatchSize = dt.Rows.Count;

  39.                         for (int i = 0; i < DataTableTitle.Length ; i++)
  40.                         {
  41.                             bulkCopy.ColumnMappings.Add(DataTableTitle[i], DBColumnName[i]);
  42.                         }

  43.                         bulkCopy.WriteToServer(dt);
  44.                         destinationConnection.Close();
  45.                     }
  46.                     catch (Exception ex)
  47.                     {
  48.                         Console.WriteLine(ex.Message);
  49.                     }
  50.                     finally
  51.                     {

  52.                     }
  53.                 }
  54.             }

  55.         }
  56.         catch (Exception ex)
  57.             {
  58.                
  59.                 return "{"state":false,"msg":"" + ex.Message + ""}";
  60.             }
  61.         
  62.         if (File.Exists(path))
  63.         {
  64.             File.Delete(path);
  65.         }
  66.      
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|菜鳥编程园地 ( 蜀ICP备20021315号-1 )

GMT+8, 2022-9-27 15:18 , Processed in 0.147459 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表