Syncfusion XlsIO组件导出WinForms DataGridView时表头取自DataTable而非控件的问题
解决Syncfusion XlsIO导出DataGridView时使用自定义列头的问题
这个问题我之前也碰到过,在你用的Syncfusion XlsIO 16.3.0.21版本里,ImportDataGridView方法在DataGridView绑定DataTable且关闭自动列生成时,确实会默认读取DataTable的列名作为Excel表头,而不是你手动设置的DataGridView列头。解决思路是手动写入自定义表头,再导入数据(跳过自动生成表头),具体步骤如下:
具体实现步骤
- 遍历DataGridView的所有列,把每个列的
HeaderText写入Excel的第一行对应单元格 - 调用
ImportDataGridView时,将includeHeader参数设为false,并从第二行开始导入数据
修改后的完整导出代码
public static void ExportToExcel(DataGridView dgv, string lang, string tablename) { using (ExcelEngine excelEngine = new ExcelEngine()) { IApplication application = excelEngine.Excel; application.DefaultVersion = ExcelVersion.Excel2013; IWorkbook workbook = application.Workbooks.Create(1); IWorksheet worksheet = workbook.Worksheets[0]; // 手动写入自定义表头到Excel第一行 for (int colIndex = 0; colIndex < dgv.Columns.Count; colIndex++) { // Excel列索引从1开始,所以colIndex+1 worksheet.Range[1, colIndex + 1].Text = dgv.Columns[colIndex].HeaderText; // 这里可以保留你原来的表头样式设置,比如加粗、背景色等 worksheet.Range[1, colIndex + 1].CellStyle.Font.Bold = true; } // 从第二行开始导入数据,不自动生成表头 worksheet.ImportDataGridView(dgv, 2, 1, false, false); // 后续的筛选、自适应列行、样式设置保持不变 worksheet.AutoFilters.FilterRange = worksheet.Range; worksheet.Range.AutofitColumns(); worksheet.Range.AutofitRows(); //...更多代码 - 表头和单元格样式设置 SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "Excel XLS|*.xls"; saveFileDialog1.ShowDialog(); if (saveFileDialog1.FileName != "") { workbook.SaveAs(saveFileDialog1.FileName, ExcelSaveType.SaveAsXLS); System.Diagnostics.Process.Start(saveFileDialog1.FileName); } } }
补充说明
- 如果你原来有专门的表头样式逻辑,可以把手动写入表头的部分和样式代码结合起来,确保Excel表头和DataGridView的表头样式一致
- 这个方法避开了组件默认读取数据源列名的逻辑,完全依赖你在DataGridView中定义的自定义列头,能完美解决你的问题
内容的提问来源于stack exchange,提问作者Molnar Istvan
相关产品推荐
相关产品推荐

