JoeJin 发表于 2023-8-2 10:17:05

GcExcel 如何删除数据中的所有空行

本帖最后由 JoeJin 于 2023-8-2 10:17 编辑

删除空行是数据清洗中常见的一个环节,比如我们有如下一个Excel数据。

图中橙色的部分是空行,需要被删除,但是同时也包含一些空单元格,需要保留,用绿色标记出来了。



经过研究代码如下:
public void RemoveEmptyRow() {
      Workbook workbook = new Workbook();
      workbook.open("resources/example.xlsx");
      IWorksheet sheet = workbook.getActiveSheet();

      IRange range = sheet.getUsedRange();
      int firstColumn = range.getColumn();
      int lastColumn = range.getLastColumn();
      int firstRow = range.getRow();
      int lastRow = range.getLastRow();
      IRange deleteRange = sheet.getRange(lastRow + 1, lastColumn + 1);
      for (int r = firstRow; r <= lastRow; r++) {
            boolean isEmptyRow = true;
            for (int c = firstColumn; c <= lastColumn; c++) {
                if (sheet.getRange(r, c).getValue() != null) {
                  isEmptyRow = false;
                  break;
                }
            }
            if (isEmptyRow) {
                deleteRange = deleteRange.union(sheet.getRange(r, firstColumn, 1, lastColumn - firstColumn));
            }
      }
      int count = deleteRange.getAreas().getAreaCount();
      for (int i = count - 1; i >= 0; i--) {
            deleteRange.getAreas().getArea(i).getEntireRow().delete();
      }

      workbook.save("new.xlsx");
    }


先看看最后的结果:


代码逻辑如下:
1. 打开Excel文件后。
2. 使用 sheet.getUsedRange(); 获取整个文档的数据 range。
3. 通过 API 获取第一行和第一列,最后一行和最后一列的index.
    int firstColumn = range.getColumn();
    int lastColumn = range.getLastColumn();
    int firstRow = range.getRow();
    int lastRow = range.getLastRow();
4. 循环遍历每一个格子,用一个标记来判断每一行是否全为空。
5. 把找到的空行记录下来,通过Range的union合并在一起。
6. 循环遍历,逆序删除整行。
    请注意:一定要逆袭删除,删除一行后,下面的内容会上移,因此正序删除会导致错误删除需要的数据。



页: [1]
查看完整版本: GcExcel 如何删除数据中的所有空行