【问题标题】:How to remove blank columns from excel using EPPlus如何使用 EPPlus 从 excel 中删除空白列
【发布时间】:2020-10-30 08:32:07
【问题描述】:

我想删除不需要的列到最后一列或列之间没有标题的任何空白列,然后使用 EPPlus 从每一行和每一列的 Excel 工作表中删除格式。

请查看示例进度。

public static class EpPlusExtension
{
    public static string[] GetHeaderColumns(this ExcelWorksheet sheet)
    {
        List<string> columnNames = new List<string>();
        foreach (var firstRowCell in sheet.Cells[sheet.Dimension.Start.Row, sheet.Dimension.Start.Column, 1, sheet.Dimension.End.Column])
            columnNames.Add(firstRowCell.Text);
        return columnNames.ToArray();
    }

    public static ExcelWorksheet RemoveCellFormatter(this ExcelWorksheet worksheet)
    {
        try
        {
            dynamic cellValue = null;
            int lastColumnWithHeaderIndex = worksheet.GetHeaderColumns().Count();
                for (int i = worksheet.Dimension.Start.Row; i <= worksheet.Dimension.End.Row; i++)
                {
                    for (int j = worksheet.Dimension.Start.Column; j <= lastColumnWithHeaderIndex; j++)
                    {
                        if (worksheet.Cells[i, j].Value != null)
                        {
                            cellValue = worksheet.Cells[i, j].Value;
                            worksheet.Cells[i, j].Clear();
                            worksheet.Cells[i, j].Value = cellValue;
                            cellValue = null;
                        }
                    }
                }
            return worksheet;
        }
        catch (Exception ex)
        {
            _logger.LogError($"Error Message: Exception While clearing formatting from worksheet. |Exception: {ex.Message}");
            return worksheet;
        }
    }
}

示例代码处理最后不需要的列:

如何处理中间的空列?

提前致谢

【问题讨论】:

  • 创建一个循环检查所有标题for (int i = 1; i &lt;= worksheet.Dimension.End.Column; i++),如果没有则删除列worksheet.DeleteColumn(i);
  • 即使有标题也会删除列。它需要保留带有标题的列。

标签: c# epplus


【解决方案1】:

我不是 EPPlus 专家,无法找到删除“空”列的方法。但是,正如 VDWWD 所指出的,循环遍历一列的行并检查该列中的所有单元格是否为 null 应该不难,如果是,则删除该列。

显然,如果有很多行,那么这可能不是最好的方法。如果有很多行和列,可能还有另一种选择,但是,在这种情况下,我会假设执行时间是可以接受的。在我的测试中,工作表包含 735 行和 9 列以及两 (2) 列空列,并且只用了不到一秒钟。

鉴于此,一个简单的解决方案是遍历列。在每次列迭代中,循环遍历所有行。我们将使用两个变量:boolvalueFound 并将其设置为false。这将用于指示我们是否在单元格中找到了非空值。 List&lt;int&gt; emptyColIndexesints 的列表,用于保存工作表中“空”列的索引。

注意:很明显我们不想“删除”空的 一旦我们找到一个列。我们只想存储它的索引和 稍后删除列。原因……是……删除列 而通过列“循环”显然会导致问题。 因此,我们只想获取“空”的索引列表 列。

当循环遍历一列的行时,如果我们找到一个不是null 的值,那么我们将valueFound 设置为true 并使用break 命令退出行循环。如果我们遍历一列中的所有行并退出循环,我们将检查valueFound 变量,如果它是false,那么这意味着该列中的所有行值都是null,然后我们添加该列索引到 emptyColIndexes 列表。

最后,在收集所有“空”列索引后,我们循环遍历索引并删除列。

注意:此循环需要从“最后一个”列索引开始并移动 到第一个。这应该很明显,如果我们删除一列 在列表中另一列的左侧,则索引将得到 弄乱。基本上,我们想从右边删除列 左。因此,循环从最后一个索引开始,并转到 第一个索引。

此外,这并不重要,但似乎没有必要返回RemoveCellFormatter 中的工作表。

下面是演示上述内容的代码。

public static void RemoveEmptyColumns(ExcelWorksheet worksheet) {
  try {
    List<int> emptyColIndexes = new List<int>();
    bool valueFound;
    for (int curCol = worksheet.Dimension.Start.Column; curCol <= worksheet.Dimension.End.Column; curCol++) {
      valueFound = false;
      for (int curRow = worksheet.Dimension.Start.Row; curRow <= worksheet.Dimension.End.Row; curRow++) {
        if (worksheet.Cells[curRow, curCol].Value != null) {
          valueFound = true;
          break;
        }
      }
      if (!valueFound) {
        emptyColIndexes.Add(curCol);
      }
    }
    if (emptyColIndexes.Count > 0) {
      for (int i = emptyColIndexes.Count - 1; i >= 0; i--) {
        worksheet.DeleteColumn(emptyColIndexes[i]);
      }
    }
  }
  catch (Exception ex) {
    MessageBox.Show("Error Message: Exception while removing empty columns from worksheet. " + ex.Message);
  }
}

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多