程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> DataGridView導出excel

DataGridView導出excel

編輯:.NET實例教程

本文參考網友江邊孤島(感謝原作者)的《WinForm中DataGrid擴展類 - 快速導出Excel文件,帶保存對話框,並殺死進程。相對完美的解決方案!》(url:http://blog.csdn.Net/jbgh608/archive/2007/08/29/1763517.ASPx )而寫,但本文是DataGridVIEw導出Excel,DataGridVIEw中的隱含列不導出。在貼出代碼前幾點說明如下:

1、添加Microsoft Excel 11.0 Object Library的引用後,在項目的引用列表中會多出3個引用項,分別是Excel、Microsoft.Office.Core、VBIDE;(當然添加Microsoft Word 11.0 Object Library的引用後,在項目的引用列表中也會多出3個引用項,分別是Word、Microsoft.Office.Core、VBIDE,即第一個是變化的,後兩個是相同的,但如果你添加Microsoft Office 11.0 Object Library,那麼僅有Microsoft.Office.Core)

微軟的Office對象庫包含:
Microsoft Access 11.0 Object Library
Microsoft Graph 11.0 Object Library
Microsoft Excel 11.0 Object Library
Microsoft Office 11.0 Object Library
Microsoft Outlook 11.0 Object Library
Microsoft PowerPoint 11.0 Object Library
Microsoft Word 11.0 Object Library

對於上面的對象庫,微軟是否提供了API文檔?本人尚未找到。

2、文件是否已經打開的判斷,網上很多是以獨享的方式打開文件,如果出現異常則說明文件已經在使用中,我覺得這個判斷不理想,不知道是否有更好的處理方法?

3、實測中發現執行設置Excel字體大小和將字體設置為粗體的語句耗時較長,不知道是本人機器環境的原因還是Excel的普遍問題?

4、原文殺死excel進程的處理方法並不得當,會將所有正在使用的excel都關閉掉。但導出excel確實會增加Excel的進程,不妥。

一下是代碼

調用方法為:



Export export = new Export();
export.ToExcel(this, this.dgInOut, "收支賬");

導出類源碼:



using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text;
using System.Diagnostics;
using System.IO;
using Microsoft.Office.Interop.Excel;

namespace ST.FI
...{
    public class Export
    ...{
        //記錄保存文件的名稱(含路徑)
        private string FullFileName = string.Empty;

 保存對話框#region 保存對話框
        private bool SaveFileDialog()
        ...{
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "excel files(*.xls)|*.xls";//Excel files(*.xls)|*.xls|All files(*.*)|*.*
            saveFileDialog1.FilterIndex = 0;
            saveFileDialog1.RestoreDirectory = true;

            //標志變量、返回結果
            bool IsOK=false;
            bool result = false;

            //文件已經存在,需要重新輸入文件名時,循環打開保存對話框
            while (!IsOK)
            ...{
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                ...{
                    //修改給定的文件名,增加時間信息
           FullFileName = saveFileDialog1.FileName.Insert(saveFileDialog1.FileName.LastIndexOf("\") + 1, DateTime.Now.ToString("yyyyMMdd"));

                    //文件信息,判斷文件是否已經存在;
                    //遺留問題:文件是否已經打開本想在此處判斷,但沒有找到合適的方法,如果你有合適的方法,請賜教[email protected]
                    FileInfo fi = new FileInfo(FullFileName);
                    if (fi.Exists)
                    ...{
                        DialogResult dr = MessageBox.Show("文件已經存在,是否覆蓋現有文件?", "系統信息", MessageBoxButtons.YesNoCancel);
                        if (dr == DialogResult.Yes)
                            //如果覆蓋現有文件
                        ...{
                            IsOK = true;
                            result = true;
                        }
                        else if (dr == DialogResult.Cancel)
                            //如果取消操作
         ...{
                            IsOK = true;
                            result = false;
                        }
                        //如果不覆蓋現有文件,則IsOK仍為false,實現循環
                    }
                }
            }

            return result;
        }


        #endregion

        導出Excel#region 導出Excel
        public void ToExcel(Form ParentWindow, DataGridVIEw ExportGrid,  string p_ReportName)
        ...{
            //如果網格尚未數據綁定
            if(ExportGrid==null)
                return;
   // 列索引,行索引
            int colIndex = 0;
            int rowIndex = 0;
            //總可見列數,總可見行數
            int colCount = ExportGrid.Columns.GetColumnCount(DataGridVIEwElementStates.Visible);
            int rowCount = ExportGrid.Rows.GetRowCount(DataGridVIEwElementStates.Visible);

            //如果DataGridVIEw中沒有行,返回
            if (rowCount == 0)
                return;

            //保存對話框
            if (!SaveFileDialog())
                return;

            ParentWindow.Cursor = Cursors.WaitCursor;
            // 創建Excel對象                    
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
            if (xlApp == null)
            ...{
                MessageBox.Show("Excel無法啟動","系統信息");
                return;
            }
            // 創建Excel工作薄
            Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
     Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];

            // 設置標題,實測中發現執行設置字體大小和將字體設置為粗體的語句耗時較長,故注釋掉了
            Microsoft.Office.Interop.Excel.Range range = xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, colCount]);
            range.MergeCells = true;
            xlApp.ActiveCell.FormulaR1C1 = p_ReportName;
            //xlApp.ActiveCell.Font.Size = 20;
            //xlApp.ActiveCell.Font.Bold = true;
            xlApp.ActiveCell.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;

            // 創建緩存數據
            object[,] objData = new object[rowCount + 1, colCount];
            // 獲取列標題,隱藏的列不處理
            for (int i = 0; i < ExportGrid.ColumnCount; i++)
            ...{
                if (ExportGrid.Columns[i].Visible)
                    objData[rowIndex, colIndex++] = ExportGrid.Columns[i].HeaderText;
            }
            // 獲取數據,隱藏的列的數據忽略
            for (int i = 1; i <= rowCount; i++)
  ...{
                rowIndex++;
                colIndex = 0;
                for (int j = 0; j < ExportGrid.ColumnCount; j++)
                ...{
                    if (ExportGrid.Columns[j].Visible)
                        objData[rowIndex, colIndex++] = ExportGrid[j,rowIndex - 1].Value.ToString();
                }
                
                System.Windows.Forms.Application.DoEvents();
            }

            // 寫入Excel
            //xlApp.get_Range(xlApp.Cells[2, 1], xlApp.Cells[2, colIndex]).Font.Bold = true;
            range = xlSheet.get_Range(xlApp.Cells[2, 1], xlApp.Cells[rowCount + 2, colCount]);
            range.Value2 = objData;

            // 保存
            try
            ...{
                xlApp.Cells.EntireColumn.AutoFit();
         &nbsp;      xlApp.Cells.VerticalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
                xlApp.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
                //xlApp.Visible   =   true;   
                xlBook.Saved = true;
                xlBook.SaveCopyAs(FullFileName);
                MessageBox.Show("導出成功!","系統信息");
                ParentWindow.Cursor = Cursors.Default;
            }
            catch
            ...{
                MessageBox.Show("保存出錯,請檢查文件是否被正使用!", "系統信息");
                //return false;
            }
            finally
            ...{
                xlApp.Quit();
                GC.Collect();
                //KillProcess("Excel");
            }
            //return true;
        }
        #endregion

        殺死進程#region 殺死進程
        private void KillProcess(string processName)
        ...{
            System.Diagnostics.Process myproc = new System.Diagnostics.Process();
            //得到所有打開的進程 
            try
            ...{
                foreach (Process thisproc in Process.GetProcessesByName(processName))
                ...{
                    thisproc.Kill();
                }
            }
            catch (Exception Exc)
   ...{
                throw new Exception("", Exc);
            }
        }
        #endregion 
    }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved