• ExcelHelper Excel,Export,Import


    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Odbc;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Windows;
    using System.Windows.Input;
    using Excel = Microsoft.Office.Interop.Excel;
    
    namespace ExcelExportImport
    {
        public class ExcelHelper
        {
            private Excel.Application _excelApp = null;
            private Excel.Workbooks _books = null;
            private Excel._Workbook _book = null;
            private Excel.Sheets _sheets = null;
            private Excel._Worksheet _sheet = null;
            private Excel.Range _range = null;
            private Excel.Font _font = null;
            // Optional argument variable
            private object _optionalValue = Missing.Value;
    
            /// <summary>
            /// 读取Excel文件
            /// </summary>
            /// <param name="pPath"></param>
            /// <returns></returns>
            public DataTable LoadExcel(string pPath)
            {
                //Driver={Driver do Microsoft Excel(*.xls)} 这种连接写法不需要创建一个数据源DSN,DRIVERID表示驱动ID,Excel2003后都使用790,FIL表示Excel文件类型,Excel2007用excel 8.0,MaxBufferSize表示缓存大小,DBQ表示读取Excel的文件名(全路径)
    
                string connString = "Driver={Driver do Microsoft Excel(*.xls)};DriverId=790;SafeTransactions=0;ReadOnly=1;MaxScanRows=16;Threads=3;MaxBufferSize=2024;UserCommitSync=Yes;FIL=excel 8.0;PageTimeout=5;";
                connString += "DBQ=" + pPath;
                OdbcConnection conn = new OdbcConnection(connString);
                OdbcCommand cmd = new OdbcCommand();
                cmd.Connection = conn;
                //获取Excel中第一个Sheet名称,作为查询时的表名
                string sheetName = this.GetExcelSheetName(pPath);
                string sql = "select * from [" + sheetName.Replace('.', '#') + "$]";
                cmd.CommandText = sql;
                OdbcDataAdapter da = new OdbcDataAdapter(cmd);
                DataSet ds = new DataSet();
                try
                {
                    da.Fill(ds);
                    return ds.Tables[0];
                }
                catch (Exception x)
                {
                    ds = null;
    
                    throw new Exception("从Excel文件中获取数据时发生错误!");
                }
                finally
                {
                    cmd.Dispose();
                    cmd = null;
                    da.Dispose();
                    da = null;
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                    }
                    conn = null;
                }
            }
            private string GetExcelSheetName(string pPath)
            {
                //打开一个Excel应用
    
                _excelApp = new Excel.Application();
                if (_excelApp == null)
                {
                    throw new Exception("打开Excel应用时发生错误!");
                }
                _books = _excelApp.Workbooks;
                //打开一个现有的工作薄
                _book = _books.Add(pPath);
                _sheets = _book.Sheets;
                //选择第一个Sheet页
                _sheet  = (Excel._Worksheet)_sheets.get_Item(1);
                string sheetName = _sheet.Name;
    
                ReleaseCOM(_sheet);
                ReleaseCOM(_sheets);
                ReleaseCOM(_book);
                ReleaseCOM(_books);
                _excelApp.Quit();
                ReleaseCOM(_excelApp);
                return sheetName;
            }
            /// <summary>
            /// 释放COM对象
            /// </summary>
            /// <param name="pObj"></param>
            private void ReleaseCOM(object pObj)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(pObj);
                }
                catch
                {
                    throw new Exception("释放资源时发生错误!");
                }
                finally
                {
                    pObj = null;
                }
            }
            ///以下为导出实现功能
           /// <summary>
           /// 保存到Excel
           /// </summary>
           /// <param name="excelName"></param>
            public void SaveToExcel(string excelName,DataTable dataTable)
            {
                try
                {
                    if (dataTable != null)
                    {
                        if (dataTable.Rows.Count != 0)
                        {
                            Mouse.SetCursor(Cursors.Wait);
                            CreateExcelRef();
                            FillSheet(dataTable);
                            SaveExcel(excelName);
                            Mouse.SetCursor(Cursors.Arrow);
                        }
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show("Error while generating Excel report");
                }
                finally
                {
                    ReleaseCOM(_sheet);
                    ReleaseCOM(_sheets);
                    ReleaseCOM(_book);
                    ReleaseCOM(_books);
                    ReleaseCOM(_excelApp);
                }
            }
            
            /// <summary>
            /// 将内存中Excel保存到本地路径
            /// </summary>
            /// <param name="excelName"></param>
            private void SaveExcel(string excelName)
            {
                _excelApp.Visible = false;
                //保存为Office2003和Office2007都兼容的格式
                _book.SaveAs(excelName, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel8, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                _excelApp.Quit();
    
            }
           
            /// <summary>
            /// 将数据填充到内存Excel的工作表
            /// </summary>
            /// <param name="dataTable"></param>
            private void FillSheet(DataTable dataTable)
            {
                object[] header = CreateHeader(dataTable);
                WriteData(header,dataTable);
            }
           
    
            private void WriteData(object[] header,DataTable dataTable)
            {
                object[,] objData = new object[dataTable.Rows.Count, header.Length];
    
                for (int j = 0; j < dataTable.Rows.Count; j++)
                {
                    var item = dataTable.Rows[j];
                    for (int i = 0; i < header.Length; i++)
                    {
                        var y = dataTable.Rows[j][i];
                        objData[j, i] = (y == null) ? "" : y.ToString();
                    }
                }
                AddExcelRows("A2", dataTable.Rows.Count, header.Length, objData);
                AutoFitColumns("A1", dataTable.Rows.Count + 1, header.Length);
            }
           
    
            private void AutoFitColumns(string startRange, int rowCount, int colCount)
            {
                _range = _sheet.get_Range(startRange, _optionalValue);
                _range = _range.get_Resize(rowCount, colCount);
                _range.Columns.AutoFit();
            }
            
    
            private object[] CreateHeader(DataTable dataTable)
            {
               
                List<object> objHeaders = new List<object>();
                for (int n = 0; n < dataTable.Columns.Count; n++)
                {
                    objHeaders.Add(dataTable.Columns[n].ColumnName);
                }
    
                var headerToAdd = objHeaders.ToArray();
                //工作表的单元是从“A1”开始
                AddExcelRows("A6", 1, headerToAdd.Length, headerToAdd);
                SetHeaderStyle();
    
                return headerToAdd;
            }
    
           /// <summary>
           /// 将表头加粗显示
           /// </summary>
            private void SetHeaderStyle()
            {
                _font = _range.Font;
                _font.Bold = true;
            }
           
            /// <summary>
            /// 将数据填充到Excel工作表的单元格中
            /// </summary>
            /// <param name="startRange"></param>
            /// <param name="rowCount"></param>
            /// <param name="colCount"></param>
            /// <param name="values"></param>
            private void AddExcelRows(string startRange, int rowCount, int colCount, object values)
            {
                _range = _sheet.get_Range(startRange, _optionalValue);
                _range = _range.get_Resize(rowCount, colCount);
                _range.set_Value(_optionalValue, values);
            }
            /// <summary>
            /// 创建一个Excel程序实例
            /// </summary>
            private void CreateExcelRef()
            {
                _excelApp = new Excel.Application();
                _books = (Excel.Workbooks)_excelApp.Workbooks;
                _book = (Excel._Workbook)(_books.Add(_optionalValue));
                _sheets = (Excel.Sheets)_book.Worksheets;
                _sheet = (Excel._Worksheet)(_sheets.get_Item(1));
            }
        }
    }
    

      

  • 相关阅读:
    JAVA泛类型(汽车Demo)
    java自定义事件机制分析
    ExtJS自定义事件
    模块化设计进化
    面向服务的SOA架构与服务总线ESB
    数据加密数字签名
    面试题
    一点ExtJS开发的感悟
    学习代理模式
    抽象类与接口
  • 原文地址:https://www.cnblogs.com/Events/p/3309895.html
Copyright © 2020-2023  润新知