using OfficeOpenXml; using OfficeOpenXml.Style; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; using ZJ_BYD.ViewModel; namespace ZJ_BYD.Untils { /// /// Excel操作类 /// /// Microsoft Excel 11.0 Object Library public class ExcelHelper { /// /// 导出Excel /// /// /// /// /// /// 是否保留时分秒 public static void ToExcel(List dataSource, string strFilePath, List MappingColumns = null, bool keepTime = false) { if (dataSource != null && dataSource.Count > 0) { DataTable dataTable = ListToDataTable(dataSource, MappingColumns, keepTime); ToExcel(dataTable, strFilePath, MappingColumns); } else { if (!File.Exists(strFilePath)) { File.Create(strFilePath); } } } public static void ToExcel(DataTable dt, string strFilePath, List MappingColumns = null) { try { if (dt.Rows.Count == 0) { if (!File.Exists(strFilePath)) { File.Create(strFilePath); } return; } //目录不存在则创建 var dicpath = System.IO.Path.GetDirectoryName(strFilePath); if (!Directory.Exists(dicpath)) { Directory.CreateDirectory(dicpath); } if (File.Exists(strFilePath)) { File.Delete(strFilePath); } FileInfo file = new FileInfo(strFilePath); //指定EPPlus使用非商业证书 ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using (ExcelPackage ep = new ExcelPackage(file)) { var totalCount = dt.Rows.Count;//总记录条数 var sheetLimit = 60000;//每个sheet的记录条数 //计算当前应导出多少个sheet var sheetCount = Convert.ToInt32(Math.Round(Convert.ToDouble(totalCount / sheetLimit))) + 1; var dts = ExtendMethod.DataTableSplite(dt, sheetLimit); for (int j = 0; j < dts.Count; j++) { dt = dts[j]; ExcelWorksheet ws = ep.Workbook.Worksheets.Add(string.Format("Sheet{0}", (j + 1))); #region 处理不存在的Mapping中的Name DataColumn[] arr = new DataColumn[dt.Columns.Count]; dt.Columns.CopyTo(arr, 0); if (MappingColumns != null) { foreach (var col in arr) { if (MappingColumns.All(m => m.field != col.ColumnName)) { dt.Columns.Remove(col.ColumnName); } } } #endregion ws.Cells["A1"].LoadFromDataTable(dt, true); ws.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid; //单元格背景颜色 ws.Cells.Style.Fill.BackgroundColor.SetColor(Color.White); if (MappingColumns != null) { for (int i = 0; i < dt.Columns.Count; i++) { var strColName = dt.Columns[i].ColumnName; var map = MappingColumns.FirstOrDefault(m => m.field == strColName); if (map != null) { ws.Cells[1, i + 1].Value = map.title; } try { var val = ws.Cells[2, i + 1].Value; var lenth = val == null ? 0 : val.ToString().Length; ws.Column(i + 1).Width = lenth > 10 ? lenth + 6 : 10; } catch (Exception) { } ws.Cells[1, i + 1].Style.Fill.PatternType = ExcelFillStyle.Solid; ws.Cells[1, i + 1].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(191, 191, 191)); ws.Cells[1, i + 1].Style.Fill.BackgroundColor.SetColor(Color.FromArgb(0, 151, 167));//设置单元格背景色 ws.Cells[1, i + 1].Style.Font.Color.SetColor(Color.White); } } #region 设置导出样式 ws.Row(1).Height = 18; ws.Row(1).Style.Font.Bold = true; ws.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //设置字体,也可以是中文,比如:宋体 ws.Cells.Style.Font.Name = "宋体"; //字体加粗 //字体大小 ws.Cells.Style.Font.Size = 12; //字体颜色 // ws.Cells.Style.Font.Color.SetColor(System.Drawing.Color.Black); //单元格背景样式,要设置背景颜色必须先设置背景样式 //ws.Cells.Style.ShrinkToFit = true;//单元格自动适应大小 ws.Cells.Style.Border.Top.Style = ExcelBorderStyle.Thin; ws.Cells.Style.Border.Top.Color.SetColor(Color.Gray); ws.Cells.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; ws.Cells.Style.Border.Bottom.Color.SetColor(Color.Gray); ws.Cells.Style.Border.Left.Style = ExcelBorderStyle.Thin; ws.Cells.Style.Border.Left.Color.SetColor(Color.Gray); ws.Cells.Style.Border.Right.Style = ExcelBorderStyle.Thin; ws.Cells.Style.Border.Right.Color.SetColor(Color.Gray); //设置单元格所有边框样式和颜色 //ws.Cells.Style.Border.BorderAround(ExcelBorderStyle.Thin, System.Drawing.ColorTranslator.FromHtml("#0097DD")); #endregion } ep.Save(); } } catch (Exception ex) { var errMsg = ex == null ? "未知异常" : ex.Message; MessageBox.Show($"ToExcel方法出发异常:{errMsg},请联系管理员!"); } } public static void ToExcel(DataTable dt, string strTemplete, string strExcelFile, int intSheet) { FileInfo strTemp = new FileInfo(strTemplete); FileInfo strNewTemp = new FileInfo(strExcelFile); try { //指定EPPlus使用非商业证书 ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; ExcelPackage package = new ExcelPackage(strTemp); int vSheetCount = package.Workbook.Worksheets.Count; //获取总Sheet页 ExcelWorksheet worksheet = package.Workbook.Worksheets[intSheet];//选定 指定页 //int maxColumnNum = ws.Dimension.End.Column;//最大列 //int minColumnNum = ws.Dimension.Start.Column;//最小列 //int maxRowNum = ws.Dimension.End.Row;//最小行 //int minRowNum = ws.Dimension.Start.Row;//最大行 worksheet.Cells["A1"].LoadFromDataTable(dt, true); package.SaveAs(strNewTemp); } catch (Exception ex) { throw ex; } } public static void ToExcel2(DataTable dt1, DataTable dt2, string strTemplete, string strExcelFile) { FileInfo strTemp = new FileInfo(strTemplete); FileInfo strNewTemp = new FileInfo(strExcelFile); try { //指定EPPlus使用非商业证书 ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; ExcelPackage package = new ExcelPackage(strTemp); int vSheetCount = package.Workbook.Worksheets.Count; //获取总Sheet页 ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet2"];//选定 表 worksheet.Cells["A1"].LoadFromDataTable(dt1, true); worksheet = package.Workbook.Worksheets["Sheet3"];//选定 指定页 worksheet.Cells["A1"].LoadFromDataTable(dt2, true); package.SaveAs(strNewTemp); } catch (Exception ex) { throw ex; } } public static DataTable GetExcel(string strFilePath, string tbName = "dt1") { try { FileInfo file = new FileInfo(strFilePath); //指定EPPlus使用非商业证书 ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using (ExcelPackage ep = new ExcelPackage(file)) { ExcelWorksheet ws = ep.Workbook.Worksheets.FirstOrDefault(); int maxColumnNum = ws.Dimension.End.Column;//最大列 int minColumnNum = ws.Dimension.Start.Column;//最小列 int maxRowNum = ws.Dimension.End.Row;//最小行 int minRowNum = ws.Dimension.Start.Row;//最大行 DataTable vTable = new DataTable(); DataColumn vC; for (int j = 1; j <= maxColumnNum; j++) { vC = new DataColumn("col_" + j, typeof(string)); vTable.Columns.Add(vC); } for (int n = 2; n <= maxRowNum; n++) { DataRow vRow = vTable.NewRow(); for (int m = 1; m <= maxColumnNum; m++) { vRow[m - 1] = ws.Cells[n, m].Value; } vTable.Rows.Add(vRow); } return vTable; } } catch (Exception ex) { throw ex; } } /// /// 读取Excel到DataTable /// /// 文件路径 /// Sheet索引 /// 总列数 /// public static DataTable GetExcel(string strFilePath, int tbIndex,out int maxColumnNum) { maxColumnNum = 0; try { FileInfo file = new FileInfo(strFilePath); //指定EPPlus使用非商业证书 ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using (ExcelPackage ep = new ExcelPackage(file)) { ExcelWorksheet ws = ep.Workbook.Worksheets[tbIndex]; maxColumnNum = ws.Dimension.End.Column;//最大列 int minColumnNum = ws.Dimension.Start.Column;//最小列 int maxRowNum = ws.Dimension.End.Row;//最大行 int minRowNum = ws.Dimension.Start.Row;//最小行 DataTable vTable = new DataTable(); DataColumn vC; for (int j = 1; j <= maxColumnNum; j++) { vC = new DataColumn("col_" + j, typeof(string)); vTable.Columns.Add(vC); } for (int n = 2; n <= maxRowNum; n++) { DataRow vRow = vTable.NewRow(); for (int m = 1; m <= maxColumnNum; m++) { vRow[m - 1] = ws.Cells[n, m].Value; } vTable.Rows.Add(vRow); } return vTable; } } catch (Exception ex) { var errMsg = ex == null ? "未知异常" : ex.Message; MessageBox.Show($"GetExcel方法出发异常:{errMsg},请联系管理员!"); return null; } } /// /// 类型转换 /// /// /// /// public static DataTable ListToDataTable(List entitys, List MappingColumns = null, bool keepTime = false) { //检查实体集合不能为空 if (entitys == null || entitys.Count < 1) { throw new Exception("The list is empty"); } //取出第一个实体的所有Propertie Type entityType = entitys[0].GetType(); var entityProperties = entityType.GetProperties().Where(m => (!m.GetAccessors()[0].IsVirtual) && (!(m.PropertyType.Name.ToLower() != "string" && m.PropertyType.IsClass))).ToList(); DataTable dt = new DataTable(); if (MappingColumns != null) { foreach (var item in MappingColumns) { var prop = entityProperties.FirstOrDefault(m => m.Name == item.field); if (prop != null) { var tp = prop.PropertyType; if (tp.IsGenericType && //判断是否为nullable泛型类 tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 if (tp.Name.ToLower() == "datetime" || (tp.GenericTypeArguments != null && tp.GenericTypeArguments.Length > 0 && tp.GenericTypeArguments[0].Name.ToLower() == "datetime")) { dt.Columns.Add(prop.Name, typeof(string)); } else { dt.Columns.Add(prop.Name, tp.GenericTypeArguments[0]); } } else { if (tp.Name.ToLower() == "datetime") { dt.Columns.Add(prop.Name, typeof(string)); } else { dt.Columns.Add(prop.Name, tp); } } } } //将所有entity添加到DataTable中 foreach (object entity in entitys) { //检查所有的的实体都为同一类型 object[] entityValues = new object[MappingColumns.Count]; var i = 0; DateTime dateTime = DateTime.Now; foreach (var item in MappingColumns) { var prop = entityProperties.FirstOrDefault(m => m.Name == item.field); if (prop != null) { var objval = prop.GetValue(entity, null); var tp = prop.PropertyType; if (tp.IsGenericType && //判断是否为nullable泛型类 tp.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //如果tp为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 if (tp.Name.ToLower() == "datetime" || (tp.GenericTypeArguments != null && tp.GenericTypeArguments.Length > 0 && tp.GenericTypeArguments[0].Name.ToLower() == "datetime")) { if (objval != null && DateTime.TryParse(objval.ToString(), out dateTime)) { if (keepTime) { entityValues[i++] = dateTime.ToString("yyyy-MM-dd HH:mm:ss"); } else { entityValues[i++] = dateTime.ToString("yyyy-MM-dd"); } } } else { NullableConverter nullableConverter = new NullableConverter(tp); if (objval != null) { entityValues[i++] = nullableConverter.ConvertFromString(objval.ToString()); } else { entityValues[i++] = null; } } } else { if (tp.Name.ToLower() == "datetime") { if (objval != null && DateTime.TryParse(objval.ToString(), out dateTime)) { if (keepTime) { entityValues[i++] = dateTime.ToString("yyyy-MM-dd HH:mm:ss"); } else { entityValues[i++] = dateTime.ToString("yyyy-MM-dd"); } } else { entityValues[i++] = ""; } } else { entityValues[i++] = objval; } } } } dt.Rows.Add(entityValues); } } else { for (int i = 0; i < entityProperties.Count; i++) { dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType); } //将所有entity添加到DataTable中 foreach (object entity in entitys) { //检查所有的的实体都为同一类型 object[] entityValues = new object[entityProperties.Count]; for (int i = 0; i < entityProperties.Count; i++) { entityValues[i] = entityProperties[i].GetValue(entity, null); } dt.Rows.Add(entityValues); } } return dt; } } }