# ExcelApp **Repository Path**: nocjb/ExcelApp ## Basic Information - **Project Name**: ExcelApp - **Description**: ExcelApp 是一款专门用于处理英语模考成绩的智能化 Excel 数据处理工具。通过预设的模板匹配机制,能够自动识别不同格式的成绩表,并快速完成数据统计、平均分计算、班级排名等复杂操作。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-20 - **Last Updated**: 2025-11-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ExcelApp - 英语模考成绩智能处理工具 ## 📖 项目简介 ExcelApp 是一款专门用于处理英语模考成绩的智能化 Excel 数据处理工具。通过预设的模板匹配机制,能够自动识别不同格式的成绩表,并快速完成数据统计、平均分计算、班级排名等复杂操作。 ### ✨ 核心特性 - 🎯 **智能模板识别**:自动匹配 5 种预设模板,无需手动选择 - 📊 **多维度统计**:支持全校、班级、个人多层级数据统计 - 🧮 **自动计算**:智能计算听力、阅读、完型、语填、写作等各项平均分 - 📈 **智能排名**:自动生成班级排名和校级排名 - 🔄 **批量处理**:支持一次性处理多个 Excel 文件 - 📝 **数据清洗**:自动过滤无效数据(空值、零分等) --- ## 🏗️ 项目架构 ### 技术栈 | 技术 | 版本 | 用途 | |------|------|------| | **Java** | 11 | 核心语言 | | **Apache POI** | 5.2.3 | Excel 文件读写 | | **pinyin4j** | 2.5.1 | 中文拼音处理 | | **Log4j** | 2.21.1 | 日志记录 | | **Maven** | 3.x | 项目构建管理 | ### 核心模块 ``` ExcelApp/ ├── src/main/java/zgq/ │ ├── app/ │ │ └── EnglishMod.java # 主程序入口,包含所有业务逻辑 │ ├── pojo/ # 数据模型层 │ │ ├── ExcelTemplate.java # Excel 模板定义类 │ │ ├── ExprotBean.java # 字段导出配置类 │ │ ├── SheetBean.java # Excel 页面数据模型 │ │ ├── RowBean.java # Excel 行数据模型 │ │ ├── CellBean.java # Excel 单元格数据模型 │ │ └── enums/ │ │ └── BreakType.java # 数据跳过类型枚举 │ └── utils/ # 工具类层 │ ├── BeanMapUtil.java # Excel 读写核心工具类 │ ├── PinYinUtil.java # 拼音处理工具 │ └── ToolsUtil.java # 通用工具类 ├── 原始分Excel文件放这里面/ # 输入文件夹(待处理文件) ├── 备份/ # 备份文件夹 └── pom.xml # Maven 配置文件 ``` --- ## 🚀 快速开始 ### 环境要求 - **JDK**: 11 或更高版本 - **Maven**: 3.x - **操作系统**: Windows / Linux / macOS ### 安装步骤 #### 1️⃣ 克隆或下载项目 ```bash git clone cd ExcelApp ``` #### 2️⃣ Maven 构建 ```bash # 编译项目 mvn clean compile # 打包可执行 JAR(包含所有依赖) mvn assembly:assembly ``` #### 3️⃣ 准备输入文件 - 在项目根目录下找到 `原始分Excel文件放这里面/` 文件夹 - 将待处理的英语成绩 Excel 文件(`.xlsx` 格式)放入该文件夹 #### 4️⃣ 运行程序 **方式一:IDE 运行** ```java // 直接运行 EnglishMod.java 的 main 方法 zgq.app.EnglishMod ``` **方式二:命令行运行** ```bash # 运行打包后的 JAR java -jar target/ExcelApp-1.0-SNAPSHOT-jar-with-dependencies.jar ``` #### 5️⃣ 获取结果 处理完成后,会在项目根目录生成以下文件: - 单文件:`我是生成出来的.xlsx` - 多文件:`我是 [原文件名] 处理后的文件.xlsx` --- ## 📋 支持的模板类型 系统内置 **5 种模板**,通过智能匹配算法自动识别: | 模板名称 | 处理页数 | 表头行数 | 应用场景 | |---------|---------|---------|---------| | **模板1** | 2-16 页 | 1 行 | 多班级分页统计(标准格式1) | | **模板2单条** | 第 1 页 | 1 行 | 单页汇总表 | | **模板2** | 第 1 页 | 2 行 | 双表头汇总表 | | **模板3** | 2-16 页 | 1 行 | 多班级分页统计(标准格式2) | | **模板4** | 第 1 页 | 3 行 | 三表头汇总表(新生班级) | ### 模板匹配机制 系统会对每个模板计算**字段匹配相似度**,选择相似度最高的模板进行处理: ``` 匹配相似度 = 匹配成功字段数 / 总配置字段数 × 100% ``` 示例输出: ``` ========开始匹配模板============ -----开始匹配模板1 模板1正确数比例为:45/50=90% -----开始匹配模板2 模板2正确数比例为:30/50=60% ... 匹配结果相似排序:[1, 3, 2, 4, 5] 所以我们得到结论,将执行 模板1 对应的程序 ``` --- ## 🎯 核心功能详解 ### 1. 数据提取与清洗 - ✅ 自动读取 Excel 所有页面 - ✅ 识别并处理合并单元格 - ✅ 过滤无效数据(空值/零分) - ✅ 支持公式单元格计算 ### 2. 成绩统计 **分项成绩计算**: - 📍 **听力**:题目 1-20 分数求和 - 📍 **阅读**:题目 21-40 分数求和 - 📍 **完型**:题目 41-55 分数求和 - 📍 **语填**:指定列直接提取 - 📍 **小作文 / 大作文**:指定列直接提取 **统计维度**: - 各班级各项成绩平均分 - 全校各项成绩平均分 - 客观题 / 主观题分类统计 ### 3. 排名生成 - 🏆 按总分自动排序 - 🏆 生成班级排名 - 🏆 显示校级排名 ### 4. 数据输出 **输出格式**:标准化 Excel 文件(`.xlsx`) **输出内容**: - 第 1 页:全校平均分汇总表(含排名) - 后续页:各班级详细成绩单 **输出样式**: - ✨ 自动设置列宽 - ✨ 标题行加粗 - ✨ 单元格边框 - ✨ 居中对齐 - ✨ 数值类型自动识别 --- ## ⚙️ 配置说明 ### 字段配置(ExprotBean) 每个字段配置包含以下属性: | 属性 | 类型 | 说明 | |------|------|------| | `name` | String | 字段显示名称 | | `oldLetter` | String | 原 Excel 列号(如 "A"、"BC") | | `isNumber` | boolean | 是否为数值类型 | | `isNeedAvg` | boolean | 是否需要计算平均分 | | `with` | Integer | 列宽度(单位:1/256 字符) | | `sumIndex` | Integer[] | 需要求和的列号数组 | | `avgMsg` | String | 平均分后的描述文字 | | `breakType` | BreakType | 跳过条件(NULL / NULL_ZERO) | | `titleName` | String | Excel 表头匹配名称 | ### 示例配置 ```java // 班级字段:不求平均,不是数字,宽度 2048 ExprotBean班级 = new ExprotBean("班级", "A", false, false, 2048, "平均分"); // 总分字段:求平均,是数字,空值或零值跳过 ExprotBean总分 = new ExprotBean("总分", "B", true, true, 1963, BreakType.NULL_ZERO); // 听力字段:需要计算(列 O 开始,每隔 2 列取 20 个) ExprotBean听力 = new ExprotBean("听力", null, true, true, 1792); 听力.setSumIndex(getMyIndex("O", 20, 2)); ``` --- ## 📊 处理流程 ```mermaid graph TD A[开始] --> B[读取原始分Excel文件放这里面文件夹] B --> C{是否有文件?} C -->|否| D[输出:未放入Excel文件] C -->|是| E[遍历所有Excel文件] E --> F[读取Excel所有页面数据] F --> G[初始化5种模板配置] G --> H[计算每个模板匹配相似度] H --> I[选择相似度最高的模板] I --> J{模板类型?} J -->|模板1/3/4| K[执行应用1:多页统计] J -->|模板2/5| L[执行应用2:单页分组统计] K --> M[处理各班级成绩] L --> M M --> N[计算平均分] N --> O[生成班级排名] O --> P[汇总全校数据] P --> Q[创建输出Excel] Q --> R[写入标题样式] R --> S[写入数据] S --> T[保存文件到项目根目录] T --> U[输出耗时统计] U --> V[结束] ``` --- ## 📝 使用示例 ### 示例 1:处理单个文件 ```bash # 1. 将文件放入指定目录 原始分Excel文件放这里面/ └── 2024年高二英语第一次月考.xlsx # 2. 运行程序 java -jar ExcelApp-1.0-SNAPSHOT-jar-with-dependencies.jar # 3. 控制台输出 项目路径:E:\work\idea\old-idea\ExcelApp\ ===只有一个excel哦=== 【【【【【正在读取文件:2024年高二英语第一次月考.xlsx】】】】】 开始初始化模板 ========开始匹配模板============ -----开始匹配模板1 模板1正确数比例为:48/50=96% ... 所以我们得到结论,将执行 模板1 对应的程序 =======开始处理应用1======= ... 本次处理页数=15 生成文件:我是生成出来的.xlsx =======程序已执行完毕,共耗时 3245 毫秒======= ``` ### 示例 2:批量处理 ```bash # 1. 放入多个文件 原始分Excel文件放这里面/ ├── 高二1班.xlsx ├── 高二2班.xlsx └── 高二3班.xlsx # 2. 运行程序(自动批量处理) ===有多个excel哦=== 【【【【【正在读取文件:高二1班.xlsx】】】】】 ... 【【【【【正在读取文件:高二2班.xlsx】】】】】 ... 【【【【【正在读取文件:高二3班.xlsx】】】】】 ... # 3. 生成文件 我是 高二1班.xlsx 处理后的文件.xlsx 我是 高二2班.xlsx 处理后的文件.xlsx 我是 高二3班.xlsx 处理后的文件.xlsx ``` --- ## 🛠️ 开发指南 ### 添加新模板 如需支持新的成绩表格式,请按以下步骤操作: #### 1️⃣ 创建字段配置方法 ```java public static List avgConfig新模板() { List exprotBeans = new ArrayList<>(); // 定义字段 ExprotBean班级 = new ExprotBean("班级", "C", false, false, 1451); ExprotBean姓名 = new ExprotBean("姓名", "D", false, false, 1877, "平均分"); ExprotBean总分 = new ExprotBean("总分", "F", true, true, 1963, BreakType.NULL_ZERO); exprotBeans.add(班级); exprotBeans.add(姓名); exprotBeans.add(总分); return exprotBeans; } ``` #### 2️⃣ 在 initExcelTemplate() 中注册 ```java private static List initExcelTemplate() { List excelTemplateList = new ArrayList<>(); // 添加新模板 ExcelTemplate template新 = new ExcelTemplate( "模板新", // 模板名称 sheetNumbers, // 需要处理的页数 avgConfig新模板(), // 字段配置 1, // 表头行数 classConfig() // 输出配置 ); excelTemplateList.add(template新); return excelTemplateList; } ``` #### 3️⃣ 在 startApp() 中添加处理逻辑 ```java int modeType = ppList.get(0); if (modeType == 6) { // 新模板 apply1(excelTemplate, sheetBeans, dir, file, fileName, exportFileName, result, workbook); } ``` ### 自定义列宽 在 ExprotBean 构造函数中设置 `with` 参数: ```java // 宽度参考值(单位:1/256 字符) 1451 // 窄列(如:排名) 1877 // 中列(如:姓名) 1963 // 宽列(如:分数) 2048 // 超宽列(如:班级名称) ``` ### 调试技巧 ```java // 在 EnglishMod.java 中取消以下注释可查看详细数据 printDate(title, data); // 打印处理后的数据到控制台 ``` --- ## 🧪 测试 ### 单元测试 ```bash mvn test ``` ### 功能测试 测试文件位置:`src/test/java/` --- ## ⚡ 性能优化 - ✅ 使用 `XSSFWorkbook` 提高大文件处理速度 - ✅ 采用流式处理避免内存溢出 - ✅ 并行计算平均分提高效率 **参考性能**: - 单文件(15 页,约 1500 条数据):~3 秒 - 批量文件(3 个文件):~10 秒 --- ## 📌 注意事项 1. **文件格式**:仅支持 `.xlsx` 格式(不支持 `.xls` 老版本) 2. **文件路径**:确保文件路径中不包含特殊字符 3. **表头规范**:表头名称需与模板配置中的 `titleName` 一致 4. **数据完整性**:确保必填字段(如总分)不为空 5. **Excel 版本**:建议使用 Excel 2010 或更高版本创建的文件 --- ## 🐛 常见问题 ### Q1: 提示"目录不存在" **A**: 确保在项目根目录下存在 `原始分Excel文件放这里面/` 文件夹,可手动创建。 ### Q2: 处理后数据不正确 **A**: 检查 Excel 文件格式是否与某个模板匹配,查看控制台输出的匹配相似度。 ### Q3: 程序运行缓慢 **A**: 检查 Excel 文件大小,建议单个文件不超过 10MB。 ### Q4: 某些列数据丢失 **A**: 检查配置中的 `oldLetter` 是否正确,Excel 列号从 A 开始(A=1, B=2, ..., AA=27)。 --- ## 📜 开源协议 本项目暂未指定开源协议,仅供学习和内部使用。 --- ## 👨‍💻 作者 - **开发者**: zgq - **创建时间**: 2024/03/01 - **最后更新**: 2025/11/14 --- ## 📧 联系方式 如有问题或建议,请通过以下方式联系: - 📮 提交 Issue - 📧 发送邮件 --- ## 🙏 致谢 感谢以下开源项目的支持: - [Apache POI](https://poi.apache.org/) - Excel 文件处理 - [pinyin4j](https://github.com/belerweb/pinyin4j) - 中文拼音转换 ---
**⭐ 如果这个项目对你有帮助,请给个 Star 吧!⭐**