項目上中要用到將數據庫中所有表導出為Excel,以及將Excel數據導入數據庫中的操作,使用EPPlus組件,編寫以下兩個函數。
using OfficeOpenXml;
using OfficeOpenXml.Table;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
public class ExcelHelper {
#region 保存數據列表到Excel(泛型)+void SaveToExcel<T>(IEnumerable<T> data, string FileName, string OpenPassword = "") /// <summary> /// 保存數據列表到Excel(泛型) /// </summary> /// <typeparam name="T">集合數據類型</typeparam> /// <param name="data">數據列表</param> /// <param name="FileName">Excel文件</param> /// <param name="OpenPassword">Excel打開密碼</param> public static void SaveToExcel<T>(IEnumerable<T> data, string FileName, string OpenPassword = "") { FileInfo file = new FileInfo(FileName); try { using (ExcelPackage ep = new ExcelPackage(file, OpenPassword)) { ExcelWorksheet ws = ep.Workbook.Worksheets.Add(typeof(T).Name); ws.Cells["A1"].LoadFromCollection(data, true, TableStyles.Medium10); ep.Save(OpenPassword); } } catch (InvalidOperationException ex) { Console.WriteLine(ex.Message); } } #endregion
#region 從Excel中加載數據(泛型)+IEnumerable<T> LoadFromExcel<T>(string FileName) where T : new() /// <summary> /// 從Excel中加載數據(泛型) /// </summary> /// <typeparam name="T">每行數據的類型</typeparam> /// <param name="FileName">Excel文件名</param> /// <returns>泛型列表</returns> private static IEnumerable<T> LoadFromExcel<T>(string FileName) where T : new() { FileInfo existingFile = new FileInfo(FileName); List<T> resultList = new List<T>(); Dictionary<string, int> dictHeader = new Dictionary<string, int>(); using (ExcelPackage package = new ExcelPackage(existingFile)) { ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; int colStart = worksheet.Dimension.Start.Column; //工作區開始列 int colEnd = worksheet.Dimension.End.Column; //工作區結束列 int rowStart = worksheet.Dimension.Start.Row; //工作區開始行號 int rowEnd = worksheet.Dimension.End.Row; //工作區結束行號 //將每列標題添加到字典中 for (int i = colStart; i <= colEnd; i++) { dictHeader[worksheet.Cells[rowStart, i].Value.ToString()] = i; } List<PropertyInfo> propertyInfoList = new List<PropertyInfo>(typeof(T).GetProperties()); for (int row = rowStart + 1; row < rowEnd; row++) { T result = new T(); //為對象T的各屬性賦值 foreach (PropertyInfo p in propertyInfoList) { try { ExcelRange cell = worksheet.Cells[row, dictHeader[p.Name]]; //與屬性名對應的單元格 if (cell.Value == null) continue; switch (p.PropertyType.Name.ToLower()) { case "string": p.SetValue(result, cell.GetValue<String>()); break; case "int16": p.SetValue(result, cell.GetValue<Int16>()); break; case "int32": p.SetValue(result, cell.GetValue<Int32>()); break; case "int64": p.SetValue(result, cell.GetValue<Int64>()); break; case "decimal": p.SetValue(result, cell.GetValue<Decimal>()); break; case "double": p.SetValue(result, cell.GetValue<Double>()); break; case "datetime": p.SetValue(result, cell.GetValue<DateTime>()); break; case "boolean": p.SetValue(result, cell.GetValue<Boolean>()); break; case "byte": p.SetValue(result, cell.GetValue<Byte>()); break; case "char": p.SetValue(result, cell.GetValue<Char>()); break; case "single": p.SetValue(result, cell.GetValue<Single>()); break; default: break; } } catch (KeyNotFoundException ex) { } } resultList.Add(result); } } return resultList; } #endregion
}