计算本地Excel某两列的差异值

需求:分析一个D盘下的excel名字叫test.xlsx 文件内容A列数据比c列数据都多出那些数据,还要考虑重复出现的次数,比如 A列某个值出现5次,而 C列出现3次,那么也算"多出2个"。统计每个值在 A 和 C 中的出现次数,计算差值,输出差值>0的项及其多出的数量。

java 复制代码
package com.datalook.dao.dkyw;

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

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

public class ExcelAnalyzer {


    public static void main(String[] args) {
        String filePath = "D:\\test.xlsx";

        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(0);
            if (sheet == null) {
                System.out.println("Excel中没有Sheet");
                return;
            }

            DataFormatter dataFormatter = new DataFormatter();

            Map<String, Integer> countA = new HashMap<>();
            Map<String, Integer> countC = new HashMap<>();

            for (Row row : sheet) {
                if (row == null) continue;

                Cell cellA = row.getCell(0);
                Cell cellC = row.getCell(2);

                String valA = cellA != null ? dataFormatter.formatCellValue(cellA).trim() : null;
                String valC = cellC != null ? dataFormatter.formatCellValue(cellC).trim() : null;

                if (valA != null && !valA.isEmpty()) {
                    countA.put(valA, countA.getOrDefault(valA, 0) + 1);
                }
                if (valC != null && !valC.isEmpty()) {
                    countC.put(valC, countC.getOrDefault(valC, 0) + 1);
                }
            }

            List<String> extraEntries = new ArrayList<>();

            for (Map.Entry<String, Integer> entry : countA.entrySet()) {
                String key = entry.getKey();
                int freqA = entry.getValue();
                int freqC = countC.getOrDefault(key, 0);
                int diff = freqA - freqC;
                if (diff > 0) {
                    for (int i = 0; i < diff; i++) {
                        extraEntries.add(key);
                    }
                }
            }

            System.out.println("A列比C列多出的数据(共 " + extraEntries.size() + " 条):");
            for (String val : extraEntries) {
                System.out.println("'" + val + "'");
            }

        } catch (IOException e) {
            System.err.println("读取Excel文件错误:" + e.getMessage());
            e.printStackTrace();
        }
    }


//    public static void main(String[] args) {
//        String filePath = "D:\\test.xlsx";
//
//        try (FileInputStream fis = new FileInputStream(filePath);
//             Workbook workbook = new XSSFWorkbook(fis)) {
//
//            Sheet sheet = workbook.getSheetAt(0); // 读取第一个sheet
//            if (sheet == null) {
//                System.out.println("Excel中没有Sheet");
//                return;
//            }
//
//            DataFormatter dataFormatter = new DataFormatter();
//
//            // 用于存放A列和C列的所有数据(去重)
//            Set<String> setA = new HashSet<>();
//            Set<String> setC = new HashSet<>();
//
//            // 读取所有行,跳过空行
//            for (Row row : sheet) {
//                if (row == null) continue;
//
//                // A列索引是0,C列索引是2
//                Cell cellA = row.getCell(0);
//                Cell cellC = row.getCell(2);
//
//                // 使用DataFormatter获取单元格字符串,避免数据格式问题
//                String valA = cellA != null ? dataFormatter.formatCellValue(cellA).trim() : null;
//                String valC = cellC != null ? dataFormatter.formatCellValue(cellC).trim() : null;
//
//                if (valA != null && !valA.isEmpty()) {
//                    setA.add(valA);
//                }
//                if (valC != null && !valC.isEmpty()) {
//                    setC.add(valC);
//                }
//            }
//
//            // 找出A列中但不在C列中的数据
//            Set<String> difference = new HashSet<>(setA);
//            difference.removeAll(setC);
//
//            System.out.println("A列比C列多出的数据如下:");
//            if (difference.isEmpty()) {
//                System.out.println("无多出数据");
//            } else {
//                difference.forEach(System.out::println);
//            }
//
//        } catch (IOException e) {
//            System.err.println("读取Excel文件时出错:" + e.getMessage());
//            e.printStackTrace();
//        }
//    }
}

控制台输出结果,不管有那些差异当前程序都能循环比对出来

相关推荐
2601_9620994622 分钟前
Python xlwt设置excel单元格字体及格式
python·excel·xlwt·样式设置·单元格格式
葡萄城技术团队9 小时前
不会写 SUMIFS 也能做汇总?用 SpreadJS AI 生成并解释 Excel 公式
人工智能·excel
2501_9336707911 小时前
采购运营校招Excel能力清单:函数、透视表、ERP数据与SQL入门
数据库·sql·excel
netho01 天前
影刀RPA初级证书+ Excel 全自动数据看板
excel·rpa
2501_930707781 天前
使用C#代码设置 Excel 单元格的背景颜色和图案
excel
ms365copilot1 天前
Excel Copilot聊天历史|关闭文件后,还能找回之前的AI分析对话
人工智能·excel·copilot
SL-staff1 天前
规则引擎如何实现风控报告的自动化?JVS-Rules提供解决方案
大数据·自动化·excel·规则引擎·jvs-rules·风控报告·数据溯源
2501_933670791 天前
内容电商运营岗位能力模型:SQL、Excel、投放数据与AI工具怎么准备
人工智能·sql·excel
AIGS0011 天前
工艺参数散在Excel和纸质文件里,能不能统一管、随查随用
服务器·数据库·excel·经验沉淀·知识管理·工艺知识·本体语义
小刘在重生~1 天前
Django|Excel 批量上传、Form/ModelForm 文件上传、Media 媒体文件配置
python·django·excel