使用DateSet下载Excel

这里我们使用Microsoft.Office.Interop.Excel.dll下载Excel,没有引用可点击下载

关键代码,ExcelHelper类

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using System.IO;



namespace ExcelDownLoad

{

    public delegate void ExcelEventHandler();



    public class ExcelHelper:ISubject

    {

        string processStr = "";

        //public Label label2;



        public string ProcessStr

        {

            get { return processStr; }

            set { processStr = value; }

        }



        #region Kill Special Excel Process



        [DllImport("user32.dll", SetLastError = true)]

        static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);





        public void KillSpecialExcel(Microsoft.Office.Interop.Excel.Application m_objExcel)

        {

            try

            {

                if (m_objExcel != null)

                {

                    int lpdwProcessId;

                    GetWindowThreadProcessId(new IntPtr(m_objExcel.Hwnd), out lpdwProcessId);



                    System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();

                }

            }

            catch (Exception ex)

            {

                Console.WriteLine("Delete Excel Process Error:" + ex.Message);

            }

        }



        #endregion



        public void ExportExcel(DataSet ds, string saveFileName)

        {

            if (ds == null) return;

            

            bool fileSaved = false;



            if (saveFileName.IndexOf(":") < 0) return; //被点了取消         

            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

            if (xlApp == null)

            {

                MessageBox.Show("无法创建Excel对象,您的电脑未安装Excel"); return;

            }

            Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;

            Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);

            Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];

            //取得sheet1      

            Microsoft.Office.Interop.Excel.Range range; 

            string oldCaption = DateTime.Today.ToString("yy-MM-dd");

            long totalCount = ds.Tables[0].Rows.Count; 

            long rowRead = 0; 

            float percent = 0;

            //worksheet.Cells[1, 1] = DateTime.Today.ToString("yy-MM-dd");

            //写入字段      

            for (int i = 0; i < ds.Tables[0].Columns.Count; i++)

            {

                worksheet.Cells[1, i + 1] = ds.Tables[0].Columns[i].ColumnName;

                range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];

                range.Interior.ColorIndex = 15;

                range.Font.Bold = true;

            }

            //写入数值        

            for (int r = 0; r < ds.Tables[0].Rows.Count; r++)

            {

                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)

                {

                    worksheet.Cells[r + 2, i + 1] = ds.Tables[0].Rows[r][i];

                }

                rowRead++;

                percent = ((float)(100 * rowRead)) / totalCount;

                //if (label2 != null)

                //{

                //    label2.Text = "正在导出数据[" + percent.ToString("0.00") + "%]..."; //这里可以自己做一个label用来显示进度.  

                //}

                System.Windows.Forms.Application.DoEvents();

            }

            ////this.lbl_process.Visible = false;

            range = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[ds.Tables[0].Rows.Count + 1, ds.Tables[0].Columns.Count]);

            range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);

            range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;

            range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;

            range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;

            if (ds.Tables[0].Columns.Count > 1)

            {

                range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].ColorIndex = Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic;

                range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;

                range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;

            }

            if (saveFileName != "")

            {

                try

                {

                    workbook.Saved = true;

                    workbook.SaveCopyAs(saveFileName);



                    fileSaved = true;

                }

                catch (Exception ex)

                {

                    fileSaved = false; MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);

                }

            }

            else

            {

                fileSaved = false;

            } 

            xlApp.Quit();

            GC.Collect();//强行销毁          

            if (fileSaved && File.Exists(saveFileName))

            {

                //System.Diagnostics.Process.Start(saveFileName);             

                MessageBox.Show("导出成功!", "通知");

            }

        }



        #region ISubject Members

      

        public event ExcelEventHandler Update;

        public void Notify()

        {

            if (Update != null)

            {

                // 使用事件来通知给订阅者

                Update();

            }

        }



        #endregion

    }

}

 

 

你可能感兴趣的:(Excel)