将 DataGridView 记录导出到 Excel
Exporting DataGridView records to Excel
我有一个包含多个列和不同报告类型的数据网格视图,其中我有一种方法可以将记录导出到 Excel 电子表格,在此数据网格视图中,我保留了一些列,例如:visible = false
根据所选报告类型。
在电子表格的导出方法中,我有一个只考虑可见单元格的验证,正确但它不起作用。
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;
XLCol = 1;
// Controls for scrolling through records do DataGridView
for (int i = 0; i < datagrid.RowCount; i++)
{
for (int j = 0; j < datagrid.ColumnCount; j++)
{
DataGridViewCell cell = datagrid[j, i];
string conteudo = string.Empty;
if ((cell.Value != null) && (!string.IsNullOrEmpty(cell.Value.ToString())) && cell.Visible == true)
{
conteudo = cell.Value.ToString();
if ((Funcoes.EhNumerico(conteudo)) && (conteudo.Length > 8))
{
conteudo = string.Concat("'", conteudo);
}
xlWorkSheet.Cells[XLRow, XLCol++] = conteudo;
}
XLRow++;
XLCol = 1;
}
}
电子表格留下 visible = false
为白色的列,如下所示:
我该如何解决这个问题?
换句话说……在第一个 for
循环中……如果该列不可见……那么您不想增加 i
……这显然会弄乱 for
循环。因此,我建议创建两个 (2) int
变量……int XLRow
和 int XLColumn
,然后将这些索引专门用于 WORKSHEET。然后像您的代码一样使用 i
和 j
循环遍历网格列,但是,当发现列不可见时,您不想增加 XLCol
索引。
将 loops
i
或 j
变量也用作工作表列的索引将是一项具有挑战性的工作,因为它们可能是完全“不同”的索引。这就是为什么我说将它们从 git 中“分离”出来并保持简单。像……
根据 OP 评论进行编辑……
我有代码“递增”XLCol
“INSIDE” if
语句检查 null
单元格值或空字符串单元格值……意思是如果单元格为 null
或为空……然后 XLCol
不会递增。 xlWorkSheet.Cells[XLRow, XLCol++] = conteudo;
行应该在 if
语句的“外部”。我已经编辑了代码,它现在应该可以在“空”单元格中正常工作了。
int XLRow = 1;
int XLCol = 1;
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;
XLCol = 1;
for (int i = 0; i < datagrid.RowCount; i++) {
for (int j = 0; j < datagrid.ColumnCount; j++) {
if (datagrid.Columns[j].Visible) {
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; <- XLCol incremented ONLY if cell is not null or empty and this is wrong
}
xlWorkSheet.Cells[XLRow, XLCol++] = conteudo;
}
}
XLRow++;
XLCol = 1;
}
我有一个包含多个列和不同报告类型的数据网格视图,其中我有一种方法可以将记录导出到 Excel 电子表格,在此数据网格视图中,我保留了一些列,例如:visible = false
根据所选报告类型。
在电子表格的导出方法中,我有一个只考虑可见单元格的验证,正确但它不起作用。
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;
XLCol = 1;
// Controls for scrolling through records do DataGridView
for (int i = 0; i < datagrid.RowCount; i++)
{
for (int j = 0; j < datagrid.ColumnCount; j++)
{
DataGridViewCell cell = datagrid[j, i];
string conteudo = string.Empty;
if ((cell.Value != null) && (!string.IsNullOrEmpty(cell.Value.ToString())) && cell.Visible == true)
{
conteudo = cell.Value.ToString();
if ((Funcoes.EhNumerico(conteudo)) && (conteudo.Length > 8))
{
conteudo = string.Concat("'", conteudo);
}
xlWorkSheet.Cells[XLRow, XLCol++] = conteudo;
}
XLRow++;
XLCol = 1;
}
}
电子表格留下 visible = false
为白色的列,如下所示:
我该如何解决这个问题?
换句话说……在第一个 for
循环中……如果该列不可见……那么您不想增加 i
……这显然会弄乱 for
循环。因此,我建议创建两个 (2) int
变量……int XLRow
和 int XLColumn
,然后将这些索引专门用于 WORKSHEET。然后像您的代码一样使用 i
和 j
循环遍历网格列,但是,当发现列不可见时,您不想增加 XLCol
索引。
将 loops
i
或 j
变量也用作工作表列的索引将是一项具有挑战性的工作,因为它们可能是完全“不同”的索引。这就是为什么我说将它们从 git 中“分离”出来并保持简单。像……
根据 OP 评论进行编辑……
我有代码“递增”XLCol
“INSIDE” if
语句检查 null
单元格值或空字符串单元格值……意思是如果单元格为 null
或为空……然后 XLCol
不会递增。 xlWorkSheet.Cells[XLRow, XLCol++] = conteudo;
行应该在 if
语句的“外部”。我已经编辑了代码,它现在应该可以在“空”单元格中正常工作了。
int XLRow = 1;
int XLCol = 1;
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;
XLCol = 1;
for (int i = 0; i < datagrid.RowCount; i++) {
for (int j = 0; j < datagrid.ColumnCount; j++) {
if (datagrid.Columns[j].Visible) {
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; <- XLCol incremented ONLY if cell is not null or empty and this is wrong
}
xlWorkSheet.Cells[XLRow, XLCol++] = conteudo;
}
}
XLRow++;
XLCol = 1;
}