扫码关注官方订阅号
正文
0
聖光之護
发布时间:2025-07-21 21:26:01
448人浏览过
来源于php中文网
原创
在java中,java.util.hashmap是一种常用的键值对存储结构。然而,hashmap的内部实现是基于哈希表,它不保证元素的迭代顺序。这意味着当你将excel表格中的列名和值存入hashmap时,即使你按照从左到右的顺序插入,hashmap在迭代时也可能以任意顺序返回这些键值对。这对于需要严格保持列顺序的场景(如将数据写回excel或按原顺序处理数据)来说,是一个显著的问题。
例如,一个Excel表格的列顺序是 column1, column2:
column1 column2 value1 value2 value3 value4
如果使用HashMap存储,得到的Map可能呈现如下无序状态:
0 = "column2" -> value2 "column1" -> value1 1 = "column2" -> value4 "column1" -> value3
这与我们期望的 column1 -> value1, column2 -> value2 的顺序不符。
为了解决HashMap的无序性问题,Java提供了java.util.LinkedHashMap。LinkedHashMap继承自HashMap,并额外维护了一个双向链表,用于记录元素的插入顺序。因此,当你遍历LinkedHashMap时,它会按照键值对被插入的顺序返回它们。这正是我们读取Excel数据并希望保持列顺序所需的特性。
立即学习“Java免费学习笔记(深入)”;
Autoppt:打造高效与精美PPT的AI工具
以下是修改后的readExcelSheet方法,它将HashMap替换为LinkedHashMap,以确保列的顺序得到保留。
import org.apache.poi.ss.usermodel.*; import java.util.*; public class ExcelReaderUtil { /** * 从Excel工作表中读取数据,并以有序的List>形式返回。 * 每个Map代表一行数据,Map中的键值对顺序与Excel列的插入顺序一致。 * * @param sheet 要读取的Excel工作表对象 * @return 包含Excel数据的List,如果工作表为空则返回空列表 */ public static List> readExcelSheet(Sheet sheet) { // 获取行的迭代器 Iterator rows = sheet.iterator(); // 如果没有行,则返回空列表 if (!rows.hasNext()) { return Collections.emptyList(); } // 读取表头(第一行)作为Map的键 Row header = rows.next(); List keys = new ArrayList<>(); // 遍历表头单元格,获取列名 for (Cell cell : header) { String value = getCellValueAsString(cell); // 使用辅助方法获取单元格值 if (!value.isEmpty()) { keys.add(value); } else { // 遇到空列名时,可以根据实际需求选择跳出或继续 // 这里选择跳出,认为后续列可能不再是有效表头 break; } } // 初始化结果列表 List> result = new ArrayList<>(); // 遍历剩余的每一行数据 while (rows.hasNext()) { Row row = rows.next(); // 使用LinkedHashMap来保证列的插入顺序 Map rowMap = new LinkedHashMap<>(); // 遍历表头键,按顺序填充当前行的数据 for (int i = 0; i < keys.size(); ++i) { // 获取单元格,如果不存在则创建为空白单元格 Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); String value = getCellValueAsString(cell); // 使用辅助方法获取单元格值 rowMap.put(keys.get(i), value); } // 只有当行不为空时才添加到结果列表 // 判断行是否为空:检查Map中所有值是否都为空字符串 if (!rowMap.values().stream().allMatch(String::isEmpty)) { result.add(rowMap); } } return result; } /** * 辅助方法:安全地获取单元格的字符串值,处理不同类型的单元格。 * * @param cell 单元格对象 * @return 单元格的字符串表示,如果单元格为null或空白,则返回空字符串 */ private static String getCellValueAsString(Cell cell) { if (cell == null) { return ""; } switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: // 对于日期类型,需要额外处理,这里简化为数值 if (DateUtil.isCellDateFormatted(cell)) { return cell.getDateCellValue().toString(); // 或者格式化为特定日期字符串 } else { return String.valueOf(cell.getNumericCellValue()); } case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: // 对于公式单元格,可以尝试获取计算后的值 try { return String.valueOf(cell.getNumericCellValue()); // 尝试获取数值结果 } catch (IllegalStateException e) { try { return cell.getStringCellValue(); // 尝试获取字符串结果 } catch (IllegalStateException ex) { return ""; // 无法获取值 } } case BLANK: return ""; default: return ""; // 默认返回空字符串 } } // 示例用法 (需要Apache POI库) public static void main(String[] args) throws Exception { // 假设有一个名为 "example.xlsx" 的Excel文件 // 创建一个模拟的Workbook和Sheet用于测试 Workbook workbook = new org.apache.poi.xssf.usermodel.XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 创建表头 Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("column1"); headerRow.createCell(1).setCellValue("column2"); headerRow.createCell(2).setCellValue("column3"); // 增加一列测试 // 创建数据行1 Row dataRow1 = sheet.createRow(1); dataRow1.createCell(0).setCellValue("value1"); dataRow1.createCell(1).setCellValue("value2"); dataRow1.createCell(2).setCellValue(123); // 测试数值类型 // 创建数据行2 Row dataRow2 = sheet.createRow(2); dataRow2.createCell(0).setCellValue("value3"); dataRow2.createCell(1).setCellValue("value4"); dataRow2.createCell(2).setCellValue(true); // 测试布尔类型 // 创建空行(应被过滤) sheet.createRow(3); // 调用读取方法 List> data = readExcelSheet(sheet); // 打印结果,观察列顺序 for (Map rowMap : data) { System.out.println("--- Row ---"); rowMap.forEach((key, value) -> System.out.println(" " + key + " -> " + value)); } workbook.close(); } }
代码改进说明:
除了LinkedHashMap,Java还提供了其他Map实现,它们在特定场景下也可能有用:
org.apache.poi poi 5.2.3 org.apache.poi poi-ooxml 5.2.3
通过将HashMap替换为LinkedHashMap,可以有效地解决在Java中读取Excel数据时列顺序混乱的问题,确保数据在内存中保持与源文件一致的结构,从而简化后续的数据处理和回写操作。
相关文章
Java常用文件上传下载类库与Apache Commons
如何在 Apache Camel 中解组后保留并访问原始输入消息
Apache Camel 中如何在反序列化后保留并访问原始输入消息
如何为 Apache ActiveMQ Artemis 指定专用 JDK
如何为 Apache ActiveMQ Artemis 配置专用 JDK
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
如何安全移除 Elementor 生成的 HTML 标签,仅保留内部文本内容
2026-01-16 22:04
如何在 Cypress 中正确处理外部文件下载而不导致测试卡死
2026-01-16 22:19
标题:将评分范围按不等长区间划分并映射到消息数组的高效算法实现
如何实现 HTML 下拉菜单中的嵌套子菜单(二级下拉)
2026-01-16 22:29
Cypress 中正确处理文件下载的完整实践指南
2026-01-16 22:32
如何在 Go 程序中正确使用 os/exec 调用 go build 命令
2026-01-16 22:35
如何在 Go Web 应用中正确托管 CSS 文件并解决 404 错误
2026-01-16 22:40
如何在 Go Web 应用中正确托管 CSS 静态资源避免 404 错误
标题:装饰器模式的适用边界与类型兼容性约束
2026-01-16 22:59
如何使用 cURL 正确发送 JSON 数据到 PHP 接口
2026-01-16 23:36
热门AI工具
DeepSeek
幻方量化公司旗下的开源大模型平台
AI大模型
开放平台
豆包大模型
字节跳动自主研发的一系列大型语言模型
通义千问
阿里巴巴推出的全能AI助手
腾讯元宝
腾讯混元平台推出的AI助手
文档处理
Excel 表格
文心一言
文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。
中文写作
讯飞写作
基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿
写作工具
即梦AI
一站式AI创作平台,免费AI图片和视频生成。
图片拼接
图画生成
ChatGPT
最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
智谱清言 - 免费全能的AI助手
PDF 文档
相关专题
Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。
836
2023.06.15
java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。
741
2023.07.05
Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。
736
2023.07.31
Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。
397
2023.08.01
Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。
399
2023.08.02
java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。
446
java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。
430
Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。
16926
2023.08.03
本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。
72
2026.01.16
热门下载
相关下载
精品课程
共22课时 | 1.7万人学习
共18课时 | 3.2万人学习
共14课时 | 3.1万人学习
共6课时 | 7.9万人学习
共79课时 | 151.3万人学习
共6课时 | 53.4万人学习
共4课时 | 4.3万人学习
共13课时 | 0.9万人学习
最新文章
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部