注释: 使用Window自带的 Microsoft.Office.Interop.Excel; 类库实现
具体代码如下:
/// <summary> /// 导出Excel类 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="U"></typeparam> /// public class ImportFromExcel<T, U> where T : class, new() where U : List<T>, new() /// public class ExportToExcel<T, U> where T : class where U : List<T> public class ExcelHelper<T, U> where T : class, new() where U : List<T>, new() { #region 对象数据 导出为Excel /// <summary> /// 数据集 /// </summary> public List<T> LstTMdl { get; set; } // 可选 参数 private object _missingValue = Missing.Value; /// <summary> /// 生成Excel报表 /// </summary> /// <param name="excelFullName">Excel全路径</param> /// <returns></returns> public bool ExportObjectsToExcel(string excelFullName) { bool isSuccess = false; Application excelApp = null; //Microsoft.Office.Interop.Excel.Application Workbooks books = null; _Workbook book = null; Sheets sheets = null; _Worksheet workSheet = null; try { if (LstTMdl != null) { // 创建 Excel 传递的参数实例 excelApp = new Application(); excelApp.DisplayAlerts = false; //保存Excel的时候,不弹出是否保存的窗口直接进行保存 books = excelApp.Workbooks; book = books.Add(_missingValue); sheets = book.Worksheets; workSheet = (_Worksheet)(sheets.get_Item(1)); //Excel sheet 索引从1开始 // 存在数据则输出(填充 Excel sheet) if (LstTMdl.Count != 0) { //根据属性名创建列标题 PropertyInfo[] propertyInfo = typeof(T).GetProperties(); // 为标头创建Array object[] arrExcelFileds = GetExcelFiledsName(propertyInfo); //开始从 A1 处添加 AddExcelRows(workSheet, "A1", 1, arrExcelFileds.Length, arrExcelFileds); //将数据写入 Excel sheet object[,] cellsContent = GetExcelCellsContent(arrExcelFileds); AddExcelRows(workSheet, "A2", LstTMdl.Count, arrExcelFileds.Length, cellsContent); // 根据数据拟合列 AutoFitColumns(workSheet, "A1", LstTMdl.Count + 1, arrExcelFileds.Length); } //excelApp.Visible = true;//展示 Excel 程序 book.SaveAs(excelFullName);//直接保存Excel文件(不打开) isSuccess = true; } book.Close(); excelApp.Quit(); } catch (Exception ex) { isSuccess = false; } finally { ReleaseObject(workSheet); ReleaseObject(sheets); ReleaseObject(book); ReleaseObject(books); ReleaseObject(excelApp); } return isSuccess; } /// <summary> /// 获取Excel各单元格内容 /// </summary> /// <param name="arrExcelFileds"></param> /// <returns></returns> private object[,] GetExcelCellsContent(object[] arrExcelFileds) { object[,] cellsContent = new object[LstTMdl.Count, arrExcelFileds.Length]; for (int j = 0; j < LstTMdl.Count; j++) { var item = LstTMdl[j]; for (int i = 0; i < arrExcelFileds.Length; i++) { var y = typeof(T).InvokeMember(arrExcelFileds[i].ToString(), BindingFlags.GetProperty, null, item, null); cellsContent[j, i] = (y == null) ? "" : y.ToString(); } } return cellsContent; } /// <summary> /// 获取Excel列头名称 /// </summary> /// <param name="propertyInfo"></param> /// <returns></returns> private object[] GetExcelFiledsName(PropertyInfo[] propertyInfo) { List<object> objHeaders = new List<object>(); for (int n = 0; n < propertyInfo.Length; n++) { objHeaders.Add(propertyInfo[n].Name); } var arrExcelFileds = objHeaders.ToArray(); return arrExcelFileds; } /// <summary> /// 添加行数据 /// </summary> /// <param name="startCell"></param> /// <param name="rowCount"></param> /// <param name="colCount"></param> /// <param name="values"></param> /// <param name="numberFormatLocal">默认值 "@" :单元格格式为文本</param> private void AddExcelRows(_Worksheet workSheet, string startCell, int rowCount, int colCount, object values, string numberFormatLocal, bool isFontBold = false) { Range range = workSheet.get_Range(startCell, _missingValue); range = range.get_Resize(rowCount, colCount); range.Columns.AutoFit(); // 设置列宽为自动适应 range.NumberFormatLocal = numberFormatLocal; //设置单元格格式. "@":为文本 Font font = range.Font; font.Bold = isFontBold; range.set_Value(_missingValue, values); } /// <summary> /// 添加行数据 /// </summary> /// <param name="startCell"></param> /// <param name="rowCount"></param> /// <param name="colCount"></param> /// <param name="values"></param> private void AddExcelRows(_Worksheet workSheet, string startCell, int rowCount, int colCount, object values) { AddExcelRows(workSheet, startCell, rowCount, colCount, values, "@"); } /// <summary> /// 添加行数据 /// </summary> /// <param name="startCell"></param> /// <param name="rowCount"></param> /// <param name="colCount"></param> /// <param name="values"></param> private void AddExcelFiledTitles(_Worksheet workSheet, string startCell, int rowCount, int colCount, object values) { // 列标题设置为加粗字体 AddExcelRows(workSheet, startCell, rowCount, colCount, values, "@", true); } /// <summary> /// 根据数据拟合列 /// </summary> /// <param name="startCell"></param> /// <param name="rowCount"></param> /// <param name="colCount"></param> private void AutoFitColumns(_Worksheet workSheet, string startCell, int rowCount, int colCount) { Range range = workSheet.get_Range(startCell, _missingValue); range = range.get_Resize(rowCount, colCount); range.Columns.AutoFit(); } #endregion #region 读取Excel文件内数据 为对象 ///// <summary> ///// 导出Excel类 ///// </summary> ///// <typeparam name="T"></typeparam> ///// <typeparam name="U"></typeparam> //public class ImportFromExcel<T, U> where T : class, new() where U : List<T>, new() //{ /// <summary> /// 读Excel表内容 /// </summary> /// <returns></returns> public U ReadExcelData(string excelFullName) { U lstData = new U(); Application excelApp = new Application(); //excelApp.Visible = false; //excelApp.UserControl = true; _Workbook book = excelApp.Application.Workbooks.Open(excelFullName); _Worksheet sheet = (_Worksheet)(book.Worksheets.get_Item(1)); try { int rowsCount = sheet.UsedRange.Rows.Count; // sheet.UsedRange.Cells.Rows.Count;//行数 int columnsCount = sheet.UsedRange.Columns.Count; // sheet.UsedRange.Cells.Columns.Count; //列数 //列头 PropertyInfo[] headerInfo = typeof(T).GetProperties(); Dictionary<PropertyInfo, int> keyValuePairs = new Dictionary<PropertyInfo, int>(); for (int i = 1; i <= columnsCount; i++) { var value = sheet.Cells[1, i].Value2.ToString(); //取单元格值 var propertyInfo = headerInfo.Where(pInfo => pInfo.Name == value).FirstOrDefault(); if (propertyInfo != null) { keyValuePairs.Add(propertyInfo, i); } } //内容 for (int j = 2; j <= rowsCount; j++) { T instance = new T(); foreach (var keyValue in keyValuePairs) { var propertyInfo = keyValue.Key; var propertyValue = sheet.Cells[j, keyValue.Value].Value2.ToString(); //取单元格值 ReflectionHelper.SetInstancePropertyValue(instance, propertyInfo, propertyValue); } lstData.Add(instance); } } catch (Exception ex) { lstData = null; //LogHelper.Instance.Error("" + ex.ToString()); } finally { book?.Close(); excelApp?.Quit(); ReleaseObject(sheet); ReleaseObject(book); ReleaseObject(excelApp); } return lstData; } //} #endregion #region 公共 /// <summary> /// 释放未使用的对象 /// </summary> /// <param name="obj"></param> private void ReleaseObject(object obj) { try { if (obj != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } } catch (Exception ex) { obj = null; } finally { GC.Collect(); } } #endregion }
参考:
#region 参考 /************************ * * range.NumberFormatLocal = "@"; //设置单元格格式为文本 range = (Range)worksheet.get_Range("A1", "E1"); //获取Excel多个单元格区域:本例做为Excel表头 range.Merge(0); //单元格合并动作 worksheet.Cells[1, 1] = "Excel单元格赋值"; //Excel单元格赋值 range.Font.Size = 15; //设置字体大小 range.Font.Underline=true; //设置字体是否有下划线 range.Font.Name="黑体"; 设置字体的种类 range.HorizontalAlignment=XlHAlign.xlHAlignCenter; //设置字体在单元格内的对其方式 range.ColumnWidth=15; //设置单元格的宽度 range.Cells.Interior.Color=System.Drawing.Color.FromArgb(255,204,153).ToArgb(); //设置单元格的背景色 range.Borders.LineStyle=1; //设置单元格边框的粗细 range.BorderAround(XlLineStyle.xlContinuous,XlBorderWeight.xlThick,XlColorIndex.xlColorIndexAutomatic,System.Drawing.Color.Black.ToArgb()); //给单元格加边框 range.Borders.get_Item(Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeTop).LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlLineStyleNone; //设置单元格上边框为无边框 range.EntireColumn.AutoFit(); //自动调整列宽 Range.HorizontalAlignment= xlCenter; // 文本水平居中方式 Range.VerticalAlignment= xlCenter //文本垂直居中方式 Range.WrapText=true; //文本自动换行 Range.Interior.ColorIndex=39; //填充颜色为淡紫色 Range.Font.Color=clBlue; //字体颜色 xlsApp.DisplayAlerts=false; //保存Excel的时候,不弹出是否保存的窗口直接进行保存 ==================================================================== using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Runtime.InteropServices; using Microsoft.Office.Interop.Excel; using ExcelApplication = Microsoft.Office.Interop.Excel.ApplicationClass; using System.IO; namespace ExcalDemo { public class ExcelFiles { public void CreateExcelFiles() { ExcelApplication excel = new ExcelApplication(); try { excel.Visible = false;// 不显示 Excel 文件,如果为 true 则显示 Excel 文件 excel.Workbooks.Add(Missing.Value);// 添加工作簿 Worksheet sheet = (Worksheet)excel.ActiveSheet;// 获取当前工作表 Range range = null;// 创建一个空的单元格对象 range = sheet.get_Range("A1", Missing.Value);// 获取单个单元格 range.RowHeight = 20; // 设置行高 range.ColumnWidth = 20; // 设置列宽 range.Borders.LineStyle = 1; // 设置单元格边框 range.Font.Bold = true; // 加粗字体 range.Font.Size = 20; // 设置字体大小 range.Font.ColorIndex = 5; // 设置字体颜色 range.Interior.ColorIndex = 6; // 设置单元格背景色 range.HorizontalAlignment = XlHAlign.xlHAlignCenter;// 设置单元格水平居中 range.VerticalAlignment = XlVAlign.xlVAlignCenter;// 设置单元格垂直居中 range.Value2 = "设置行高和列宽";// 设置单元格的值 range = sheet.get_Range("B2", "D4");// 获取多个单元格 range.Merge(Missing.Value); // 合并单元格 range.Columns.AutoFit(); // 设置列宽为自动适应 range.NumberFormatLocal = "#,##0.00";// 设置单元格格式为货币格式 // 设置单元格左边框加粗 range.Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick; // 设置单元格右边框加粗 range.Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick; range.Value2 = "合并单元格"; // 页面设置 sheet.PageSetup.PaperSize = XlPaperSize.xlPaperA4; // 设置页面大小为A4 sheet.PageSetup.Orientation = XlPageOrientation.xlPortrait; // 设置垂直版面 sheet.PageSetup.HeaderMargin = 0.0; // 设置页眉边距 sheet.PageSetup.FooterMargin = 0.0; // 设置页脚边距 sheet.PageSetup.LeftMargin = excel.InchesToPoints(0.354330708661417); // 设置左边距 sheet.PageSetup.RightMargin = excel.InchesToPoints(0.354330708661417);// 设置右边距 sheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575); // 设置上边距 sheet.PageSetup.BottomMargin = excel.InchesToPoints(0.393700787401575);// 设置下边距 sheet.PageSetup.CenterHorizontally = true; // 设置水平居中 // 打印文件 sheet.PrintOut(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); // 保存文件到程序运行目录下 sheet.SaveAs(Path.Combine(System.Windows.Forms.Application.StartupPath,"demo.xls"), Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); excel.ActiveWorkbook.Close(false, null, null); // 关闭 Excel 文件且不保存 } catch (Exception ex) { MessageBox.Show(this,ex.Message); } finally { excel.Quit(); // 退出 Excel excel = null; // 将 Excel 实例设置为空 } } } } * * *********************************/ #endregion