【转载】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()); } } } }