玩轉DataGridView之將數據導出成Excel和Word格式


很多情況下我們需要將grid中的數據導出成Excel或Word格式。下面我們來說說如何實現它。

1 先用一個方法,篩選出有效的數據。

因為grid中可能會有隱藏列,而這些列中的數據我們一般都是不需要的,所以我們先將grid中的數據進行過濾,保存在一個DataTable中。

private DataTable exporeDataToTable(DataGridView dataGridView)
        {
            //將datagridview中的數據導入到表中
            DataTable tempTable = new DataTable("tempTable");
            //定義一個模板表,專門用來獲取列名
            DataTable modelTable = new DataTable("ModelTable");
            //創建列
            for (int column = 0; column < dataGridView.Columns.Count; column++)
            {
                //可見的列才顯示出來
                if (dataGridView.Columns[column].Visible == true)
                {
                    DataColumn tempColumn = new DataColumn(dataGridView.Columns[column].HeaderText, typeof(string));
                    tempTable.Columns.Add(tempColumn);
                    DataColumn modelColumn = new DataColumn(dataGridView.Columns[column].Name, typeof(string));
                    modelTable.Columns.Add(modelColumn);
                }
            }
            //添加datagridview中行的數據到表
            for (int row = 0; row < dataGridView.Rows.Count; row++)
            {
                if (dataGridView.Rows[row].Visible == false)
                {
                    continue;
                }
                DataRow tempRow = tempTable.NewRow();
                for (int i = 0; i < tempTable.Columns.Count; i++)
                {
                    tempRow[i] = dataGridView.Rows[row].Cells[modelTable.Columns[i].ColumnName].Value;
                }
                tempTable.Rows.Add(tempRow);
            }
            return tempTable;
        }

2 導出為Excel。

導出Excel會用到Microsoft.Office.Interop.Excel.dll,所以必須先在項目中引用這個DLL。

private void OutputAsExcelFile(DataGridView dataGridView)
        {
            //將datagridView中的數據導出到一張表中
            DataTable tempTable = this.exporeDataToTable(dataGridView);
            //導出信息到Excel表
            Microsoft.Office.Interop.Excel.ApplicationClass myExcel;
            Microsoft.Office.Interop.Excel.Workbooks myWorkBooks;
            Microsoft.Office.Interop.Excel.Workbook myWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet myWorkSheet;
            char myColumns;
            Microsoft.Office.Interop.Excel.Range myRange;
            object[,] myData = new object[500, 35];
            int i, j;//j代表行,i代表列
            myExcel = new Microsoft.Office.Interop.Excel.ApplicationClass();
            //顯示EXCEL
            myExcel.Visible = true;
            if (myExcel == null)
            {
                MessageBox.Show("本地Excel程序無法啟動!請檢查您的Microsoft Office正確安裝並能正常使用", "提示");
                return;
            }
            myWorkBooks = myExcel.Workbooks;
            myWorkBook = myWorkBooks.Add(System.Reflection.Missing.Value);
            myWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)myWorkBook.Worksheets[1];
            myColumns = (char)(tempTable.Columns.Count + 64);//設置列
            myRange = myWorkSheet.get_Range("A4", myColumns.ToString() + "5");//設置列寬
            int count = 0;
            //設置列名
            foreach (DataColumn myNewColumn in tempTable.Columns)
            {
                myData[0, count] = myNewColumn.ColumnName;
                count = count + 1;
            }
            //輸出datagridview中的數據記錄並放在一個二維數組中
            j = 1;
            foreach (DataRow myRow in tempTable.Rows)//循環行
            {
                for (i = 0; i < tempTable.Columns.Count; i++)//循環列
                {
                    myData[j, i] = myRow[i].ToString();
                }
                j++;
            }
            //將二維數組中的數據寫到Excel中
            myRange = myRange.get_Resize(tempTable.Rows.Count + 1, tempTable.Columns.Count);//創建列和行
            myRange.Value2 = myData;
            myRange.EntireColumn.AutoFit();
        }

 

3 導出為Word格式

同樣的,導出為Word要添加對Microsoft.Office.Interop.Word.Dll的引用。

private void OutPutAsWordFile(DataGridView dataGridView)
        {
            //轉換后的表
            DataTable table = exporeDataToTable(this.dataGridView1);

            Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
            Microsoft.Office.Interop.Word.Document document;
            Microsoft.Office.Interop.Word.Table wordTable;
            Microsoft.Office.Interop.Word.Selection wordSelection;
            object wordObj = System.Reflection.Missing.Value;

            document = wordApp.Documents.Add(ref wordObj, ref wordObj, ref wordObj, ref wordObj);
            wordSelection = wordApp.Selection;
            //顯示word文檔
            wordApp.Visible = true;
            if (wordApp == null)
            {
                MessageBox.Show("本地Word程序無法啟動!請檢查您的Microsoft Office正確安裝並能正常使用", "提示");
                return;
            }
            document.Select();
            wordTable = document.Tables.Add(wordSelection.Range, dataGridView.Rows.Count+1, dataGridView.Columns.Count, ref wordObj, ref wordObj);
            //設置列寬
            wordTable.Columns.SetWidth(50.0F, Microsoft.Office.Interop.Word.WdRulerStyle.wdAdjustSameWidth);
            
             //標題數據
            for (int i = 0; i < table.Columns.Count; i++)
            {
                wordTable.Cell(1, i + 1).Range.InsertAfter(table.Columns[i].ColumnName);
            }
            //輸出表中數據
            for (int i = 0; i <= table.Rows.Count - 1; i++)
            {
                for (int j = 0; j < table.Columns.Count; j++)
                {
                    if (table.Rows[i][j] != null)
                    {
                        wordTable.Cell(i + 2, j + 1).Range.InsertAfter(table.Rows[i][j].ToString());
                    }
                }
            } 
        }

代碼下載:DataGridDemo。項目中的Form1.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM