ASP.NET WebApi批量匯入資料庫(優化)
阿新 • • 發佈:2019-02-16
批量匯入資料
說明:
(1)參考第一篇部落格,讀取excel中資料批量匯入資料庫,[連結](http://blog.csdn.net/realjh/article/details/78546072)
(2)本篇部落格是對批量錄入操作進行優化,重點在對excel工作薄中的資料進行獲取,相信大家
能夠準確拿到excel表中的資料,那麼批量錄入操作就是輕而易舉的事情了,而且還可以對資料
的準確性進行一系列相關的驗證等等。
讀取Excel工作薄程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//引用的類庫名稱空間
using System.Data;
using System.IO;
using NPOI.SS.UserModel;//引用建立excel工作薄變數
using NPOI.XSSF.UserModel;//工作薄從檔案流中獲取excel表中的資料
namespace TestImportFromExcel
{
public class Program
{
static void Main(string[] args)
{
//待讀取的excel檔案路徑
string filepath = @"C:/Users/Administrator/Desktop/測試匯入.xlsx" ;
//讀取操作成功與失敗的提示訊息
string message=string.Empty;
//接收sheet表中屬性列名
List<List<string>> ColumnName = new List<List<string>>();
//接收sheet表中所有資料
List<List<string>> ColumnData = new List<List<string>>();
bool act = GetDataFromExcel(filepath,ColumnName,ColumnData,ref message );
Console.ReadKey();
}
/// <summary>
/// 讀取exel表的操作結果訊息提示
/// </summary>
public static bool GetDataFromExcel(string filePath, List<List<string>> columnName, List<List<string>> columnData,ref string message)
{
//監視資料獲取操作是否成功
bool bflag = false;
if (File.Exists(filePath))
{
//首先判斷檔案是否存在
//建立一個excel工作薄物件
IWorkbook workBook = new XSSFWorkbook(filePath);
if (workBook.NumberOfSheets > 0)
{
#region 建立讀取sheet表的物件
//拿到sheet個數:說明此處可以作為判斷使用者是否修改我們模板的sheet數量
int length = workBook.NumberOfSheets;
//建立一個sheet薄物件
ISheet Sheet = null;
//建立一個行單元物件
IRow Row = null;
//建立一個列單元物件
ICell Cell = null;
#endregion
#region 迴圈遍歷讀取每個sheet表的資料
for (int i = 0; i < length; i++)
{
#region 做預設讀取第一個sheet工作薄
//控制預設情況下只讀取第一個sheet
if (i == 1)
{
//不讓讀取第二個工作薄,跳出迴圈
break;
}
#endregion
//拿到第一個sheet工作薄
Sheet = workBook.GetSheetAt(i);
//判斷表中有沒有待錄入的資料記錄
int len = Sheet.LastRowNum;
#region 需要預設去掉第一行樣例資料
if (len > 0)
{
//接收資料型別中間變數
string value = string.Empty;
#region 讀取遍歷每行記錄,獲取資料。v=0表示第一列名稱屬性
for (int v = 0; v < len; v++)
{
//獲取單獨的一行資料
Row = Sheet.GetRow(v);
#region 遍歷每個小單元格獲取單元格內容
//拿到改條記錄有多少列
int number = Row.LastCellNum;
string tempVariable = string.Empty;
//中間集合記錄excel每個條記錄的單元格內容
List<string> tempList = new List<string>();
#region 列名稱和列資料分割槽分開獲取
//判斷是否是遍歷第一個列名稱
if (v == 0)
{
//拿到列集合,並獲取單元格內容
for (int r = 0; r < number; r++)
{
Cell = Row.GetCell(r);
value = string.Empty;
value = Cell == null ? "Blank" : Cell.CellType.ToString();
#region 匹配單元格型別
switch (Cell.CellType.ToString())
{
case "String":
tempVariable = Cell.StringCellValue;
break;
case "Numeric":
#region 識別是日期還是數值
//判斷是日期還是數值型別
if (Cell.DateCellValue.ToString("yyyy-MM-dd HH:ss:mm") == "1900-01-01 00:00:00")
{
//表示數值型別
tempVariable = Cell.NumericCellValue.ToString();
}
else
{
tempVariable = Cell.DateCellValue.ToString("yyyy-MM-dd HH:ss:mm");
}
#endregion
break;
case "Blank":
tempVariable = Cell.StringCellValue;
break;
default:
message = "批量錄入操作失敗!Excel表中第【" + Row.GetCell(0).StringCellValue + "】記錄有不符合規範的資料記錄。";
return bflag;
break;
}
#endregion
#region 做sql語句操作需要的資料
tempList.Add(tempVariable);
#endregion
}
//記錄整個列名稱集合
columnName.Add(tempList);
}
else
{
//清空所有資料
tempList = new List<string>();
//表示遍歷列資料(包含樣例記錄)此處需要考核進行去除樣例資料批量錄入資料庫
//拿到列集合,並獲取單元格內容
for (int r = 0; r < number; r++)
{
Cell = Row.GetCell(r);
value = string.Empty;
value = Cell == null ? "Blank" : Cell.CellType.ToString();
#region 匹配單元格型別
switch (value)
{
case "String":
tempVariable = Cell.StringCellValue;
break;
case "Numeric":
#region 識別是日期還是數值
//判斷是日期還是數值型別
if (Cell.DateCellValue.ToString("yyyy-MM-dd HH:ss:mm") == "1900-01-01 00:00:00")
{
//表示數值型別
tempVariable = Cell.NumericCellValue.ToString();
}
else
{
tempVariable = Cell.DateCellValue.ToString("yyyy-MM-dd HH:ss:mm");
}
#endregion
break;
case "Blank":
tempVariable =string.Empty;
break;
default:
message = "批量錄入操作失敗!Excel表中第【" + Row.GetCell(0).StringCellValue + "】記錄有不符合規範的資料記錄。";
return bflag;
break;
}
#endregion
#region 做sql語句操作需要的資料
tempList.Add(tempVariable);
#endregion
}
//記錄到整個資料集合中
columnData.Add(tempList);
}
#endregion
#endregion
}
#endregion
bflag = true;
message = "操作成功!【" + workBook.GetSheetName(i) + "】工作薄中的資料已被獲取。";
return bflag;
}
else
{
message = "操作失敗!【" + workBook.GetSheetName(i) + "】工作薄中沒有待批量錄入的資料。";
}
#endregion
}
#endregion
}
else
{
message = "操作失敗!該Excel檔案中沒有sheet工作薄。";
}
}
return bflag;
}
}
}
結語
(1)本篇部落格是對上一篇批量錄入獲取excel表中資料方法的重寫和優化。解決方案後續上傳。
(2)歡迎博友提出意見和建議,相互學習,共同進步。
(3)Demo下載地址:http://download.csdn.net/download/realjh/10166995