• 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
  • 相关阅读:
    java-抽象类
    java-接口
    java-面向对象总结
    java-单例设计模式
    java数组
    .Net框架整理
    PHP结合memcacheq消息队列解决并发问题
    浅谈DDos攻击
    PHP+ffmpeg+nginx的配置实现视频转码(转)
    使用Nginx的X-Accel-Redirect实现大文件下载
  • 原文地址:https://www.cnblogs.com/shenchao/p/10519178.html
Copyright © 2020-2023  润新知