zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/shenchao/p/10519178.html
Copyright © 2011-2022 走看看