如何使用C#将我的DataGridView添加到现有的Excel文件中

3

你好,我有一个问题。这段代码只能创建一个新的Excel文件,但是我想把我的数据表格导出到一个已经存在的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();
                }
            }
        }
1个回答

0
与您的任务相关,使用底层的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”)并将数据导出到该文件,或者通过将新创建的_excelWorkbook另存为旧文件名来重写现有文件。

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

希望这可以帮助到您。


这很有帮助,但是您的 OP 想要将数据导出到现有的工作表中,所以他真正想要的不是在您的代码中使用 _excelWorkbook = _appExcel.Workbooks.Add(misValue);,而是 _excelWorkbook = _appExcel.Workbooks.Open("FileName");。您可能需要将文件名作为您发布的函数的参数添加进去。 - user1274820
@user1274820:没错,主要的数据导出流程可以根据特定任务进一步定制。核心的概念/功能是在下面的解决方案中对基础DataTable执行数据导出。此致敬礼。 - Alexander Bell
我已经删除了我的回答,但是如果你看他的代码,你会发现他已经有了数据导出的方法 - 他只是在尝试找出如何将数据导出到一个已存在的工作簿中。 - user1274820
@user1274820: 我明白了。用户可以通过将新文件保存为旧文件名来重新编写现有文件,或打开并保存现有文件。如果在底层 DataTable 上执行数据导出过程,则效率更高,而不是在 DataGridView 上执行。最好的祝福。 - Alexander Bell
我非常困惑,我有接近656个完整的行,我想在我的Excel文件中提取更多信息或添加额外的行。 - Fran Andrade
抱歉,我不太理解您的额外问题/问题。您能否单独发布它以避免过长的评论线程?感谢您的配合。 - Alexander Bell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接