如何添加我的datagridview在现有的Excel文件中使用C#

你好,我有这个问题,代码只有它可以创build一个新的excle文件,但我想导出我的datagrid在现有的Excel文件。 任何帮助表示赞赏。

try { if (DataGridView1.DataSource != null) { SaveFileDialog fichero = new SaveFileDialog(); fichero.Filter = "Excel (*.xls)|*.xls"; if (fichero.ShowDialog() == DialogResult.OK) { Microsoft.Office.Interop.Excel.Application aplicacion; Microsoft.Office.Interop.Excel.Workbook libros_trabajo; Microsoft.Office.Interop.Excel.Worksheet hoja_trabajo; aplicacion = new Microsoft.Office.Interop.Excel.Application(); libros_trabajo = aplicacion.Workbooks.Add(); hoja_trabajo = (Microsoft.Office.Interop.Excel.Worksheet)libros_trabajo.Worksheets.get_Item(1); //exportar cabeceras DataGridView1 for (int i = 1; i <= this.DataGridView1.Columns.Count; i++) { hoja_trabajo.Cells[1, i] = this.DataGridView1.Columns[i - 1].HeaderText; } //Recorremos el DataGridView rellenando la hoja de trabajo con los datos for (int i = 0; i < this.DataGridView1.Rows.Count - 1; i++) { for (int j = 0; j < this.DataGridView1.Columns.Count; j++) { hoja_trabajo.Cells[i + 2, j + 1] = this.DataGridView1.Rows[i].Cells[j].Value.ToString(); } } libros_trabajo.SaveAs(fichero.FileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal); libros_trabajo.Close(true); aplicacion.Quit(); } } } 

与您的任务相关,使用底层的DataTable

 DataTable dt = DataGridView1.DataSource as DataTable; 

并使用以下过程将数据从该DataTable dt导出到Excel,该过程使用Microsoft.Office.Interop.Excel对象库:

 /// <summary> /// export DataTable to Excel (C#) /// </summary> internal static void Export2Excel(DataTable dataTable) { object misValue = System.Reflection.Missing.Value; Microsoft.Office.Interop.Excel.Application _appExcel = null; Microsoft.Office.Interop.Excel.Workbook _excelWorkbook = null; Microsoft.Office.Interop.Excel.Worksheet _excelWorksheet = null; try { // excel app object _appExcel = new Microsoft.Office.Interop.Excel.Application(); // excel workbook object added to app _excelWorkbook = _appExcel.Workbooks.Add(misValue); _excelWorksheet = _appExcel.ActiveWorkbook.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet; // column names row (range obj) Microsoft.Office.Interop.Excel.Range _columnsNameRange; _columnsNameRange = _excelWorksheet.get_Range("A1", misValue).get_Resize(1, dataTable.Columns.Count); // column names array to be assigned to _columnNameRange string[] _arrColumnNames = new string[dataTable.Columns.Count]; for (int i = 0; i < dataTable.Columns.Count; i++) { // array of column names _arrColumnNames[i] = dataTable.Columns[i].ColumnName; } // assign array to column headers range, make 'em bold _columnsNameRange.set_Value(misValue, _arrColumnNames); _columnsNameRange.Font.Bold = true; // populate data content row by row for (int Idx = 0; Idx < dataTable.Rows.Count; Idx++) { _excelWorksheet.Range["A2"].Offset[Idx].Resize[1, dataTable.Columns.Count].Value = dataTable.Rows[Idx].ItemArray; } // Autofit all Columns in the range _columnsNameRange.Columns.EntireColumn.AutoFit(); } catch { throw; } } 

只是把dt作为一个参数。 或者,在数据导出完成后,您可以保存WorkbookQuit Excel应用程序。 此外,如注释线程中提到的,您可以打开现有的Excel文件(例如“MyExcelFile”)并将数据导出到该文件,或者通过将新创build的Workbook (即_excelWorkbook )保存在旧的文件名。

提出的解决scheme的核心思想是在底层DataTable上运行数据导出过程,而不是DataGridView并一次性导出整个数据Row (而不是逐个单元格)以获得更好的性能。

希望这可能有帮助。