技术成就梦想

知道用户需求,做到专注!c#,donet,Frameworks,UML,面向对象,设计模式!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#语言的Excel文件导入导出

Posted on 2012-02-03 21:09  我不是高手  阅读(2827)  评论(0编辑  收藏  举报

Microsoft.Office.Tools.Excel 命名空间(引用的Com组件),微软msdn帮助

http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel(VS.80).aspx

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Data.Odbc;
using Excel=Microsoft.Office.Interop.Excel;
using System.Collections;
using System.Windows.Forms;

/**********************
 * 作者:王凌云
 * 日期:2011年3月6日
 * 功能:Excel文件的导入导出等功能
 **********************/
namespace OfficeHelper
{
    public class ToExcel
    {
        private Excel.Application _app = null;
        private Excel.Workbook _workbook = null;
        private Excel.Worksheet _worksheet = null;
        private Excel.Range _range = null;
        private bool _visible = true;
        private bool _exportTitle = false;
        private string _title = "";
        private object _missing = System.Reflection.Missing.Value;
        private object _fileName;
        /// <summary>
        /// 导出excel的标题
        /// </summary>
        public string Title
        {
            get { return _title; }
            set { _title = value; }
        }
        /// <summary>
        /// 当前表单
        /// </summary>
        public Excel.Worksheet CurrentWorkSheet
        {
            get { return _worksheet; }
            set { _worksheet = value; }
        }
        /// <summary>
        /// 当前Excel文档
        /// </summary>
        public Excel.Workbook CurrentWorkBook
        {
            get { return _workbook; }
            set { _workbook = value; }
        }
        /// <summary>
        /// 当前Excel应用
        /// </summary>
        public Excel.Application ExcelApp
        {
            get { return _app; }
            set { _app = value; }
        }
        /// <summary>
        /// Excel文档的可见性
        /// </summary>
        public bool ExcelVisible
        {
            get { return _visible; }
            set { _visible = value; }
        }
        /// <summary>
        /// 是否导出标题
        /// </summary>
        public bool ExprotTitle
        {
            get { return _exportTitle; }
            set { _exportTitle = value; }
        }

        /// <summary>
        /// 构造函数,无代码
        /// </summary>
        public ToExcel()
        {
        }
        /// <summary>
        /// 构造函数,初始化Excel应用
        /// </summary>
        /// <param name="visible">Excel文档是否可见</param>
        public ToExcel(bool visible)
        {
            try
            {
                _app = new Excel.Application();
                _visible = visible;
                _app.Visible = _visible;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 析构函数
        /// </summary>
        ~ToExcel()
        {
            try
            {
                if (_app != null && _app.Visible == false)
                {
                    _app.Quit();
                }
            }
            catch
            {
            }
        }
        /// <summary>
        /// 初始化app属性
        /// </summary>
        public void InitApp()
        {
            try
            {
                if (_app == null)
                    _app = new Excel.Application();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 初始化wookbook属性
        /// </summary>
        public void InitBook()
        {
            InitApp();
            try
            {
                if (_workbook == null)
                    _workbook = _app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
            }
            catch (Exception ex)
            {

                throw ex;
            }
           
        }
        /// <summary>
        /// 创建Excel文档
        /// </summary>
        public Excel.Workbook CreateBook()
        {
            Excel.Workbook book = null;
            try
            {
                book = _app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            return book;
        }
        /// <summary>
        /// 创建Excel文档
        /// </summary>
        /// <param name="templete">Excel文档创建模板</param>
        /// <returns></returns>
        public Excel.Workbook CreateBook(object templete)
        {
            Excel.Workbook book = null;
            try
            {
                book = _app.Workbooks.Add(templete);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return book;
        }
        /// <summary>
        /// 打开Excel
        /// </summary>
        /// <param name="fileName">文件名</param>
        public Excel.Workbook OpenBook(string fileName)
        {
            Excel.Workbook book = null;
            _fileName = fileName;
            try
            {
                book = _app.Workbooks.Open(fileName, _missing, _missing, _missing,
                    _missing, _missing, _missing, _missing, _missing, _missing, _missing,
                    _missing, _missing, _missing, _missing);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            return book;
        }
        /// <summary>
        /// 获得表单对象
        /// </summary>
        /// <param name="workbook"></param>
        /// <param name="sheetIndex"></param>
        /// <returns></returns>
        public Excel.Worksheet GetSheet(Excel.Workbook workbook, int sheetIndex)
        {
            Excel.Worksheet sheet = null;
            try
            {
                sheet = (Excel.Worksheet)workbook.Sheets[sheetIndex];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return sheet;
        }
        /// <summary>
        /// 获得表单对象
        /// </summary>
        /// <param name="sheetIndex"></param>
        /// <returns></returns>
        public Excel.Worksheet GetSheet(int sheetIndex)
        {
            InitBook();
            Excel.Worksheet sheet = null;
            try
            {
                sheet = (Excel.Worksheet)_workbook.Sheets[sheetIndex];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return sheet;
        }
        /// <summary>
        /// DataTable数据导入Excel
        /// </summary>
        /// <param name="dtDetail">导出数据的数据源</param>
        /// <param name="columnName">数据源中的字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        public void DataTableToExcel(DataTable dtDetail, string[] columnName, string[] columnDiscription)
        {
            if (dtDetail == null)
            {
                return;
            }
            if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
            {
                return;
            }
            try
            {
                //设置标题
                int titleRow = 0;
                int colsLen = columnName.Length;
                _worksheet = GetSheet(1);
                _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                if (_exportTitle)
                {
                    titleRow = 1;
                    _range.Merge(0);
                    _range.Value2 = _title;
                    _range.NumberFormat = "@";
                    _range.Font.Size = 20;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.RowHeight = 40;
                }
                //设置表头
                _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                _range.Font.Size = 10;
                _range.Font.Bold = true;
                _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                _range.NumberFormat = "@";
                //_range.ColumnWidth = 10;
                _range.Borders.ColorIndex = 1;
                for (int i = 1; i <= colsLen; i++)
                {
                    _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                    //_range = (Excel.Range)_worksheet.Cells[1, i];
                    //_range.Value2 = columns;
                }
                //导出数据
                int rowsLen = 2 + titleRow;
                _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + dtDetail.Rows.Count, colsLen]);
                _range.NumberFormat = "@";
                _range.Font.Size = 10;
                _range.Borders.ColorIndex = 1;
                foreach (DataRow dr in dtDetail.Rows)
                {
                    for (int i = 1; i <= colsLen; i++)
                    {
                        _worksheet.Cells[rowsLen, i] = dr[columnName[i-1]].ToString();
                    }
                    rowsLen++;
                }
                _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                _range.EntireColumn.AutoFit();
            }
            catch (Exception ex)
            {
               
                throw ex;
            }
           
        }
        /// <summary>
        /// DataTable数据导入Excel
        /// </summary>
        /// <param name="dtDetail">导出数据的数据源</param>
        /// <param name="columnName">数据源中的字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        /// <param name="pBar">状态栏进度条</param>
        public void DataTableToExcel(DataTable dtDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
        {
            //数据源为空,字符串数组为空,字段名和字段描述个数不相等,返回
            if (dtDetail == null)
            {
                return;
            }
            if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
            {
                return;
            }
            try
            {
                //设置进度条
                int detailCount = dtDetail.Rows.Count;
                pBar.Maximum = detailCount;
                pBar.Minimum = 0;
                pBar.Value = 0;
                pBar.Step = 4;
                pBar.Visible = true;
                //设置标题
                int titleRow = 0;
                int colsLen = columnName.Length;
                _worksheet = GetSheet(1);
                _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                if (_exportTitle)
                {
                    titleRow = 1;
                    _range.Merge(0);
                    _range.Value2 = _title;
                    _range.NumberFormat = "@";
                    _range.Font.Size = 20;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.RowHeight = 40;
                }
                //设置表头
                _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                _range.Font.Size = 10;
                _range.Font.Bold = true;
                _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                _range.NumberFormat = "@";
                _range.Borders.ColorIndex = 1;
                for (int i = 1; i <= colsLen; i++)
                {
                    _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                }
                //导出数据
                int rowsLen = 2 + titleRow;
                _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + dtDetail.Rows.Count, colsLen]);
                _range.NumberFormat = "@";
                _range.Font.Size = 10;
                _range.Borders.ColorIndex = 1;
                for (int i = 0; i < detailCount; i++)
                {
                    if ((i % 4) == 0)
                        pBar.PerformStep();
                    for (int j = 1; j <= colsLen; j++)
                    {
                        _worksheet.Cells[rowsLen, j] = dtDetail.Rows[i][columnName[j - 1]].ToString();
                    }
                    rowsLen++;
                }
                _range.EntireColumn.AutoFit();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                pBar.Visible = false;
            }
        }
        /// <summary>
        /// DataTable数据导入Excel
        /// </summary>
        /// <param name="dtDetail">导出数据的数据源</param>
        /// <param name="columnName">数据源中的字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        public void DataTableToExcelSaved(DataTable dtDetail, string[] columnName, string[] columnDiscription)
        {

            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

            saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
            saveDialog.FilterIndex = 1;
            saveDialog.RestoreDirectory = true;

            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                DataTableToExcel(dtDetail, columnName, columnDiscription);
            }
        }
        /// <summary>
        /// DataTable数据导入Excel
        /// </summary>
        /// <param name="dtDetail">导出数据的数据源</param>
        /// <param name="columnName">数据源中的字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        /// <param name="pBar">状态栏进度条</param>
        public void DataTableToExcelSaved(DataTable dtDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
        {
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

            saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
            saveDialog.FilterIndex = 1;
            saveDialog.RestoreDirectory = true;

            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                DataTableToExcel(dtDetail, columnName, columnDiscription,pBar);
            }
        }
        /// <summary>
        /// DataGridView数据导入Excel
        /// </summary>
        /// <param name="gvDetail">数据源</param>
        /// <param name="columnName">数据源中字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        public void DataGridViewToExcel(DataGridView gvDetail, string[] columnName, string[] columnDiscription)
        {
            if (gvDetail == null)
            {
                return;
            }
            if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
            {
                return;
            }
            try
            {
                //设置Excel标题
                int titleRow = 0;
                int colsLen = columnName.Length;
                _worksheet = GetSheet(1);
                _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                if (_exportTitle)
                {
                    titleRow = 1;
                    _range.Merge(0);
                    _range.Value2 = _title;
                    _range.NumberFormat = "@";
                    _range.Font.Size = 20;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                    _range.RowHeight = 40;
                }
                //设置Excel表头
                _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                _range.Font.Size = 10;
                _range.Font.Bold = true;
                _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                _range.NumberFormat = "@";
                _range.Borders.ColorIndex = 1;
                for (int i = 1; i <= colsLen; i++)
                {
                    _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                }
                //导出数据
                int rowsLen = 2 + titleRow;
                _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + gvDetail.Rows.Count, colsLen]);
                _range.NumberFormat = "@";
                _range.Font.Size = 10;
                _range.Borders.ColorIndex = 1;
                foreach (DataGridViewRow gvRow in gvDetail.Rows)
                {
                    for (int i = 1; i <= colsLen; i++)
                    {
                        _worksheet.Cells[rowsLen, i] = gvRow.Cells[columnName[i - 1]].Value.ToString();
                    }
                    rowsLen++;
                }
                _range.EntireColumn.AutoFit();
            }
            catch (Exception ex)
            {
               
                throw ex;
            }
           
        }
        /// <summary>
        /// DataGridView数据导入Excel
        /// </summary>
        /// <param name="gvDetail">数据源</param>
        /// <param name="columnName">数据源中字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        /// <param name="pBar">进度条</param>
        public void DataGridViewToExcel(DataGridView gvDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
        {
            if (gvDetail == null)
            {
                return;
            }
            if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
            {
                return;
            }
            try
            {
                //设置进度条
                int detailCount = gvDetail.Rows.Count;
                pBar.Maximum = detailCount;
                pBar.Minimum = 0;
                pBar.Value = 0;
                pBar.Step = 4;
                pBar.Visible = true;

                //设置Excel标题
                int titleRow = 0;
                int colsLen = columnName.Length;
                _worksheet = GetSheet(1);
                _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                if (_exportTitle)
                {
                    titleRow = 1;
                    _range.Merge(0);
                    _range.Value2 = _title;
                    _range.NumberFormat = "@";
                    _range.Font.Size = 20;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                    _range.RowHeight = 40;
                }
                //设置Excel表头
                _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                _range.Font.Size = 10;
                _range.Font.Bold = true;
                _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                _range.NumberFormat = "@";
                _range.Borders.ColorIndex = 1;
                for (int i = 1; i <= colsLen; i++)
                {
                    _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                }
                //导出数据
                int rowsLen = 2 + titleRow;
                _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + gvDetail.Rows.Count, colsLen]);
                _range.NumberFormat = "@";
                _range.Font.Size = 10;
                _range.Borders.ColorIndex = 1;
                for (int i = 0; i < detailCount; i++)
                {
                    if ((i % 4) == 0)
                        pBar.PerformStep();
                    for (int j = 1; j <= colsLen; j++)
                    {
                        _worksheet.Cells[rowsLen, j] = gvDetail.Rows[i].Cells[columnName[j - 1]].Value.ToString();
                    }
                    rowsLen++;
                }
                _range.EntireColumn.AutoFit();
            }
            catch (Exception ex)
            {
               
                throw ex;
            }
            finally
            {
                pBar.Visible = false;
            }
           
        }
        /// <summary>
        /// DataTable数据导入Excel
        /// </summary>
        /// <param name="dtDetail">导出数据的数据源</param>
        /// <param name="columnName">数据源中的字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        public void DataGridViewToExcelSaved(DataGridView gvDetail, string[] columnName, string[] columnDiscription)
        {

            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

            saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
            saveDialog.FilterIndex = 1;
            saveDialog.RestoreDirectory = true;

            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                DataGridViewToExcel(gvDetail, columnName, columnDiscription);
            }
        }
        /// <summary>
        /// DataTable数据导入Excel
        /// </summary>
        /// <param name="dtDetail">导出数据的数据源</param>
        /// <param name="columnName">数据源中的字段名称</param>
        /// <param name="columnDiscription">字段描述</param>
        /// <param name="pBar">状态栏进度条</param>
        public void DataGridViewToExcelSaved(DataGridView gvDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
        {
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

            saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
            saveDialog.FilterIndex = 1;
            saveDialog.RestoreDirectory = true;

            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                DataGridViewToExcel(gvDetail, columnName, columnDiscription, pBar);
            }
        }

        /// <summary>
        /// 查找Excel文档中的表单并设定其为当前表单,当前表单赋值给CurrentSheet属性
        /// </summary>
        /// <param name="worksheetName">表单名称</param>
        /// <returns>找到时返回真</returns>
        public bool FindExcelWorksheet(Excel.Workbook workbook, string worksheetName)
        {
            bool ATP_SHEET_FOUND = false;

            if ( workbook != null)
            {
                for (int i = 1; i <= workbook.Worksheets.Count; i++)
                {
                    _worksheet = (Excel.Worksheet)workbook.Worksheets.get_Item((object)i);
                    if (_worksheet.Name.Equals(worksheetName))
                    {
                        _worksheet.Activate();
                        ATP_SHEET_FOUND = true;
                        return ATP_SHEET_FOUND;
                    }
                }
            }
            return ATP_SHEET_FOUND;
        }
        /// <summary>
        /// 关闭Excel文档
        /// </summary>
        public void CloseFile()
        {
            _workbook.Close(false,_fileName,false);
        }
        /// <summary>
        /// 终止Excel程序
        /// </summary>
        public void StopExcel()
        {
            if (this._app != null)
            {
                System.Diagnostics.Process[] pProcess;
                pProcess = System.Diagnostics.Process.GetProcessesByName("Excel");
                pProcess[0].Kill();
            }
        }
        /// <summary>
        /// 导入CSV文件到DataSet
        /// </summary>
        /// <param name="fileCSV">文件全路径</param>
        /// <param name="numberOfRows">导入记录个数,-1为全部倒入</param>
        /// <returns></returns>
        public DataSet LoadCSV(string fileCSV, int numberOfRows)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo(fileCSV);
            string fileNevCSV = fi.Name.ToString();
            DataSet ds = new DataSet();
            try
            {
                string strConn = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + fi.DirectoryName.ToString() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False";
                string sql;
                OdbcConnection conn;
                conn = new OdbcConnection(strConn.Trim());
                conn.Open();
                if (numberOfRows == -1)
                {
                    sql = "select * from [" + fileNevCSV + "]";
                }
                else
                {
                    sql = "select top " + numberOfRows + " * from [" + fileNevCSV + "]";
                }
                OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
                da.Fill(ds, "csv");
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error:导入CSV", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return ds;
        }
        /// <summary>
        /// 导入Excel文件到DataSet(问题:导入后自动转换格式,有整数和小数的列小数会丢失)
        /// </summary>
        /// <param name="Path"></param>
        /// <returns></returns>
        public DataSet LoadExcel(string Path)
        {
            DataSet ds = new DataSet();
            try
            {
                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
                OleDbConnection conn = new OleDbConnection(strConn);
                conn.Open();
                string strExcel = "select * from [sheet1$]";
                OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);
                myCommand.Fill(ds, "table1");
                conn.Close();
            }
            catch (Exception ex)
            {

                throw ex;
            }
            return ds;
           
        }
    }
}