Excel数据导入导出

注释: 使用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
    }
View Code

 

参考:

#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
View Code

 

posted @ 2019-03-12 19:52  慧由心生  阅读(400)  评论(0编辑  收藏  举报