如何通过Interop.Excel将多个DataGridView导出至同一Excel工作表?
解决方案
先纠正你现有代码里的明显问题:exportclipboard方法里选中了dataGridView1,但最后获取的是dataGridView2的剪贴板内容,这是笔误,得先修正。
要把四个DataGridView的数据导出到同一张Excel工作表,核心思路是依次导出每个DataGridView的数据,每次粘贴到工作表的下一个空白区域,避免内容重叠。具体实现如下:
修改后的完整代码
// 封装通用的DataGridView复制方法,传入要导出的DataGridView private void CopyDataGridViewToClipboard(DataGridView dgv) { dgv.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText; dgv.MultiSelect = true; dgv.SelectAll(); DataObject dataObj = dgv.GetClipboardContent(); if (dataObj != null) Clipboard.SetDataObject(dataObj); } private void btn_guardar_Click(object sender, EventArgs e) { // 创建Excel实例、工作簿和工作表 Excel.Application excel = new Excel.Application(); excel.Visible = true; Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value); Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1]; int startRow = 1; // 初始粘贴起始行 // 导出第一个DataGridView CopyDataGridViewToClipboard(dataGridView1); Excel.Range targetRange = worksheet.Cells[startRow, 1]; targetRange.Select(); worksheet.PasteSpecial(targetRange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true); // 更新起始行:当前表格行数(含表头)+2,留一行空白分隔 startRow += dataGridView1.Rows.Count + 2; // 导出第二个DataGridView CopyDataGridViewToClipboard(dataGridView2); targetRange = worksheet.Cells[startRow, 1]; targetRange.Select(); worksheet.PasteSpecial(targetRange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true); startRow += dataGridView2.Rows.Count + 2; // 导出第三个DataGridView CopyDataGridViewToClipboard(dataGridView3); targetRange = worksheet.Cells[startRow, 1]; targetRange.Select(); worksheet.PasteSpecial(targetRange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true); startRow += dataGridView3.Rows.Count + 2; // 导出第四个DataGridView CopyDataGridViewToClipboard(dataGridView4); targetRange = worksheet.Cells[startRow, 1]; targetRange.Select(); worksheet.PasteSpecial(targetRange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true); }
关键说明
- 封装了
CopyDataGridViewToClipboard通用方法,避免重复代码,传入任意DataGridView就能复制其内容(含表头)到剪贴板。 - 用
startRow变量跟踪每次粘贴的起始位置,每次导出后更新起始行,加上当前表格的行数(含表头)再留一行空白,让各表格内容分隔清晰。 - 移除了原代码里无效的局部变量
i(每次点击按钮时i都会重置为0,完全起不到控制逻辑的作用)。 - 全程使用同一个Excel工作表,不会重复创建新文件。
内容的提问来源于stack exchange,提问作者Rafael Suazo
相关产品推荐
相关产品推荐

