将DataGridView记录导出到Excel时过滤隐藏列功能失效如何解决
问题根因
- 行号递增、列号重置逻辑位置错误:你将
XLRow++、XLCol = 1的操作放在了列遍历的内层循环中,意味着每处理完1个单元格(无论是否可见)就直接换行、重置列号,完全打乱了Excel的行列对应关系。 - 可见性判断逻辑可以优化:当列设置为
Visible = false时,列下所有单元格默认不可见,直接判断列的可见性即可,不需要重复判断单元格的Visible属性。
修正方案
调整行列计数逻辑的位置,优化可见性判断,修正后的代码如下:
int XLRow = 1; int XLCol = 1; // Export header for (int i = 0; i < datagrid.Columns.Count; i++) { if (datagrid.Columns[i].Visible == true) xlWorkSheet.Cells[XLRow, XLCol++] = datagrid.Columns[i].HeaderText; } XLRow = 2; // 遍历行 for (int i = 0; i < datagrid.RowCount; i++) { XLCol = 1; // 每行开始前重置列号 // 遍历列 for (int j = 0; j < datagrid.ColumnCount; j++) { // 先判断列是否可见,不可见直接跳过 if (!datagrid.Columns[j].Visible) continue; DataGridViewCell cell = datagrid[j, i]; string conteudo = string.Empty; if (cell.Value != null && !string.IsNullOrEmpty(cell.Value.ToString())) { conteudo = cell.Value.ToString(); if (Funcoes.EhNumerico(conteudo) && conteudo.Length > 8) { conteudo = string.Concat("'", conteudo); } xlWorkSheet.Cells[XLRow, XLCol++] = conteudo; } } XLRow++; // 整行处理完成后再换行 }
修正后会自动跳过所有隐藏列,不会在Excel中留空白列,同时行列对应关系完全和DataGridView的可见内容一致。
内容的提问来源于stack exchange,提问作者Favieri
相关产品推荐
相关产品推荐

