Excel防重 Java实现

在许多应用场景中,我们需要对Excel表格中的数据进行去重处理。比如,客户信息的维护、商品库存的数据管理等。如果数据未进行去重,会导致重复账目、重复订单等问题,从而影响企业运营的效率。

本文将介绍如何使用Java从Excel文件中读取数据,并去除重复的数据项。我们将使用Apache POI库来处理Excel文件,并以简洁的示例代码帮助您理解整个过程。

1. 环境准备

首先,确保您的开发环境中已经添加Apache POI依赖。您可以通过Maven来引入这些依赖。在pom.xml中添加以下内容:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>4.4</version>
    </dependency>
</dependencies>

2. 读取Excel文件

使用Apache POI可以轻松读取Excel文件中的数据。以下是一个简单的读取Excel文件的示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;

public class ExcelReader {
    public static void main(String[] args) {
        String excelFilePath = "data.xlsx";
        try {
            FileInputStream fileInputStream = new FileInputStream(new File(excelFilePath));
            Workbook workbook = new XSSFWorkbook(fileInputStream);
            Sheet sheet = workbook.getSheetAt(0);
            HashSet<String> uniqueData = new HashSet<>();

            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                Cell cell = row.getCell(0); // 读取第一列数据
                if (cell != null) {
                    uniqueData.add(cell.getStringCellValue());
                }
            }
            workbook.close();
            fileInputStream.close();
            System.out.println("Unique Data: " + uniqueData);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码解析

  1. 导入依赖:首先导入Apache POI库中的相关类。
  2. 读取Excel文件:使用FileInputStream读取Excel文件,并创建Workbook对象。
  3. 遍历行数据:通过Iterator遍历Excel表格中的每一行,并将第一列的数据添加到HashSet中,以达到去重的效果。
  4. 输出结果:程序的最后,将打印出唯一的数据集合。

3. 写入去重后的数据

去重之后,您可能想将这些数据写回到Excel文件中。下面是一段实现数据写入的代码:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashSet;

public class ExcelWriter {
    public static void writeUniqueData(HashSet<String> uniqueData) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Unique Data");

        int rowIndex = 0;
        for (String data : uniqueData) {
            Row row = sheet.createRow(rowIndex++);
            Cell cell = row.createCell(0);
            cell.setCellValue(data);
        }

        try (FileOutputStream outputStream = new FileOutputStream("unique_data.xlsx")) {
            workbook.write(outputStream);
            workbook.close();
            System.out.println("Unique data written to 'unique_data.xlsx'");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码解析

  1. 创建工作簿:首先创建一个Workbook对象和一个工作表。
  2. 写入数据:循环uniqueData集合中的每一项,通过createRowcreateCell方法逐行写入Excel。
  3. 保存文件:使用FileOutputStream将数据写入新文件中,并在最后关闭工作簿。

4. 完整示例

结合以上两个部分,我们可以创建一个完整的程序来实现Excel去重的功能:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;

public class ExcelDeduplication {
    public static void main(String[] args) {
        String excelFilePath = "data.xlsx";
        HashSet<String> uniqueData = new HashSet<>();

        // 读取Excel文件并去重
        try {
            FileInputStream fileInputStream = new FileInputStream(new File(excelFilePath));
            Workbook workbook = new XSSFWorkbook(fileInputStream);
            Sheet sheet = workbook.getSheetAt(0);

            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                Cell cell = row.getCell(0);
                if (cell != null) {
                    uniqueData.add(cell.getStringCellValue());
                }
            }
            workbook.close();
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 将去重后的数据写入新的Excel文件
        writeUniqueData(uniqueData);
    }

    public static void writeUniqueData(HashSet<String> uniqueData) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Unique Data");

        int rowIndex = 0;
        for (String data : uniqueData) {
            Row row = sheet.createRow(rowIndex++);
            Cell cell = row.createCell(0);
            cell.setCellValue(data);
        }

        try (FileOutputStream outputStream = new FileOutputStream("unique_data.xlsx")) {
            workbook.write(outputStream);
            workbook.close();
            System.out.println("Unique data written to 'unique_data.xlsx'");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. 关系图

以下是处理Excel防重的流程关系图:

erDiagram
    EXCEL_FILE {
        string fileName
        string sheetName
    }
    READING_DATA {
        int rowIndex
        string cellValue
    }
    UNIQUE_DATA {
        string uniqueValue
    }

    EXCEL_FILE ||--o{ READING_DATA : contains
    READING_DATA ||--o{ UNIQUE_DATA : generates

6. 结尾

本文详细介绍了如何使用Java及Apache POI库读取Excel文件、去除重复数据并将结果写回Excel文件的全过程。通过简单的代码示例,您可以理解每一个步骤的关键功能。

如果您有任何问题或建议,欢迎通过评论区交流。希望这篇文章能够帮助您在实际项目中更轻松地处理Excel数据去重的需求。