Excel操作类(原创)

/// <summary>
    /// Excel操作类
    /// </summary>
    public class Excel
    {
        #region 私有属性
        private _Application _oExcel = null; //Excel应用程序
        private _Workbook _oBook = null;     //Excel工作薄
        private _Worksheet _oSheet = null;   //Excel工作表

        private bool _visible=false; //是否显示Excel程序
        #endregion


        #region 公共属性
        public bool Visible
        {
            set { _oExcel.Visible = value; }
        }

        public object CurrentSheet
        {
            set
            {
                _oSheet = (_Worksheet)_oBook.Sheets[value];
                _oSheet.Activate();
            }
        }
        #endregion


        #region Excel对象初始化
        /// <summary>
        /// 初始化
        /// </summary>
        private void Init()
        {
            GC.Collect();

            _oExcel = new ApplicationClass();
        }
        #endregion


        #region 构造函数
        /// <summary>
        /// 实例一个Excel对象
        /// </summary>
        public Excel()
        {
            Init();
        }

        /// <summary>
        /// 实例一个Excel对象
        /// </summary>
        /// <param name="fileName">文件名称(物理路径)</param>
        public Excel(string fileName)
        {
            Init();

            _oBook = _oExcel.Workbooks.Open(fileName, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            _oSheet = (_Worksheet)_oBook.ActiveSheet;
        }
        #endregion


        #region 打开Excel文件
        /// <summary>
        /// 打开一个指定的Excel文件
        /// </summary>
        /// <param name="fileName">文件名称(物理路径)</param>
        public void Open(string fileName)
        {
            _oBook = _oExcel.Workbooks.Open(fileName, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, Type.Missing,
                Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);

            _oSheet = (_Worksheet)_oBook.ActiveSheet;
        }
        #endregion


        #region 设置Excel值
        /// <summary>
        /// 设置Excel的单元格值
        /// </summary>
        /// <param name="x">行开始</param>
        /// <param name="y">列开始</param>
        /// <param name="value">值</param>
        public void SetCellValue(int x, int y, object value)
        {
            _oSheet.Cells[x, y] = value;
        }

        /// <summary>
        /// 设置Excel的行值
        /// </summary>
        /// <param name="startX">行开始</param>
        /// <param name="startY">列开始</param>
        /// <param name="values">值</param>
        public void SetRowValue(int startX, int startY, object[] values)
        {
            for (int i = 0; i < values.Length; i++)
            {
                _oSheet.Cells[startX, startY + i] = values[i];
            }
        }

        /// <summary>
        /// 设置Excel的列值
        /// </summary>
        /// <param name="startX">行开始</param>
        /// <param name="startY">列开始</param>
        /// <param name="values">值</param>
        public void SetColumnValue(int startX, int startY, object[] values)
        {
            for (int i = 0; i < values.Length; i++)
            {
                _oSheet.Cells[startX + i, startY] = values[i];
            }
        }

        /// <summary>
        /// 将内存中数据表格插入到Excel指定工作表的指定位置
        /// </summary>
        /// <param name="dt">数据表</param>
        /// <param name="startX">行开始</param>
        /// <param name="startY">列开始</param>
        public void InsertTable(System.Data.DataTable dt, int startX, int startY)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    _oSheet.Cells[startX + i, j + startY] = dt.Rows[i][j];
                }
            }
        }
        #endregion


        #region 增加数据区模板行
        /// <summary>
        /// 增加数据区模板行
        /// </summary>
        /// <param name="tempRowIndex">行起始位置</param>
        /// <param name="tempRowCount">增加的行数</param>
        /// <returns>增加的行数</returns>
        public int AddRow(int tempRowIndex, int tempRowCount)
        {
            for (int i = 0; i < tempRowCount; i++)
            {
                Range row = (Range)_oSheet.Rows[tempRowIndex, Type.Missing];
                row.Select();
                row.Copy(Type.Missing);

                row.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown, Type.Missing);
            }

            return tempRowCount;
        }

        /// <summary>
        /// 增加数据区模板行
        /// </summary>
        /// <param name="tempRowIndex">行起始位置</param>
        /// <returns>增加的行数</returns>
        public int AddRow(int tempRowIndex)
        {
            Range row = (Range)_oSheet.Rows[tempRowIndex, Type.Missing];
            row.Select();
            row.Copy(Type.Missing);

            row.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown, Type.Missing);

            return 1;
        }
        #endregion


        #region 设置保护工作表
        /// <summary>
        /// 设置工作表为只读
        /// </summary>
        /// <param name="pwd">密码</param>
        public void Protect(object pwd)
        {
            _oSheet.Protect(pwd, _oSheet.ProtectDrawingObjects,
                    true, _oSheet.ProtectScenarios, _oSheet.ProtectionMode,
                    _oSheet.Protection.AllowFormattingCells,
                    _oSheet.Protection.AllowFormattingColumns,
                    _oSheet.Protection.AllowFormattingRows,
                    _oSheet.Protection.AllowInsertingColumns,
                    _oSheet.Protection.AllowInsertingRows,
                    _oSheet.Protection.AllowInsertingHyperlinks,
                    _oSheet.Protection.AllowDeletingColumns,
                    _oSheet.Protection.AllowDeletingRows,
                    _oSheet.Protection.AllowSorting,
                    _oSheet.Protection.AllowFiltering,
                    _oSheet.Protection.AllowUsingPivotTables);
        }

        /// <summary>
        /// 撤销工作表为只读
        /// </summary>
        /// <param name="pwd">密码</param>
        public void Unprotect(object pwd)
        {
            _oSheet.Unprotect(pwd);
        }
        #endregion


        #region 保存Excel
        /// <summary>
        /// 保存Excel文件到指定的路径(如果文件存在,则覆盖。)
        /// </summary>
        /// <param name="fileName">文件名称(物理路径)</param>
        /// <returns></returns>
        public bool SaveAs(string fileName)
        {
            try
            {
                //_oBook.SaveCopyAs(fileName);
                _oExcel.DisplayAlerts = false;
 
                _oBook.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing);

                _oExcel.DisplayAlerts = true;

                return true;

            }
            catch (Exception ex)
            {
                return false;
            }
        }
        #endregion


        #region 关闭Excel的工作薄
        /// <summary>
        /// 关闭Excel的工作薄
        /// </summary>
        public void Close()
        {
            if (_oBook == null)
                return;

            _oBook.Close(Type.Missing, Type.Missing, Type.Missing);
            _oBook = null;
        }
        #endregion


        #region 关闭Excel应用程序进程
        /// <summary>
        /// 杀死Excel进程
        /// </summary>
        public void Kill()
        {
            if (_oBook != null)
                _oBook.Close(Type.Missing, Type.Missing, Type.Missing);

            if (_oExcel != null)
                _oExcel.Quit();

            _oSheet = null;
            _oBook = null;
            _oExcel = null;

            GC.Collect();
        }
        #endregion
    }
posted @ 2009-08-05 11:34  andy1016  阅读(611)  评论(0编辑  收藏  举报