如何从同键不同值的HashMap列表生成指定格式Excel表格?
实现两个HashMap生成指定格式Excel的方法
针对你这种键集合一致、值不同的HashMap生成Excel的需求,下面提供两种Java生态里最常用的实现方案:
方案一:使用Apache POI(Java Excel操作标准库)
Apache POI是Java处理Office文档的老牌库,功能全面,适合大多数场景。
1. 引入依赖(Maven)
在pom.xml中添加以下依赖:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.5</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> </dependency>
2. 核心实现代码
import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapToExcel { public static void main(String[] args) throws IOException { // 初始化你的两个HashMap Map<String, String> map1 = new HashMap<>(); map1.put("t1", "val1"); map1.put("t2", "val2"); map1.put("t3", "val3"); Map<String, String> map2 = new HashMap<>(); map2.put("t1", "str1"); map2.put("t2", "str2"); map2.put("t3", "str3"); // 把所有Map放到列表里,方便批量处理 List<Map<String, String>> mapList = new ArrayList<>(); mapList.add(map1); mapList.add(map2); // 创建工作簿和工作表 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("数据"); // 1. 写入表头:从第一个Map取键(因为键集合一致) // 注意:HashMap是无序的,如果需要固定表头顺序,建议改用LinkedHashMap,或者提前定义表头列表 Row headerRow = sheet.createRow(0); int colIndex = 0; for (String key : map1.keySet()) { Cell cell = headerRow.createCell(colIndex++); cell.setCellValue(key); } // 2. 写入每行数据 int rowIndex = 1; for (Map<String, String> map : mapList) { Row dataRow = sheet.createRow(rowIndex++); colIndex = 0; for (String key : map1.keySet()) { // 用第一个Map的键保证列顺序一致 Cell cell = dataRow.createCell(colIndex++); cell.setCellValue(map.get(key)); } } // 自动调整列宽 for (int i = 0; i < map1.size(); i++) { sheet.autoSizeColumn(i); } // 输出到文件 try (FileOutputStream fos = new FileOutputStream("output.xlsx")) { workbook.write(fos); } workbook.close(); } }
方案二:使用EasyExcel(阿里开源轻量库)
EasyExcel是阿里开源的Excel处理库,相比POI更轻量,内存占用低,适合大数据量场景,代码也更简洁。
1. 引入依赖(Maven)
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency>
2. 核心实现代码
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.metadata.WriteSheet; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapToExcelEasy { public static void main(String[] args) { // 初始化你的两个HashMap Map<String, String> map1 = new HashMap<>(); map1.put("t1", "val1"); map1.put("t2", "val2"); map1.put("t3", "val3"); Map<String, String> map2 = new HashMap<>(); map2.put("t1", "str1"); map2.put("t2", "str2"); map2.put("t3", "str3"); // 准备数据列表 List<Map<String, String>> dataList = new ArrayList<>(); dataList.add(map1); dataList.add(map2); // 定义表头(如果需要固定顺序,这里可以直接指定有序的表头列表) List<String> headList = new ArrayList<>(map1.keySet()); // 写入Excel EasyExcel.write("easy_output.xlsx") .head(headList) .sheet("数据") .doWrite(dataList); } }
注意事项
- 关于顺序:HashMap本身是无序的,如果你的需求要求表头和数据列的顺序和示例完全一致(比如t1、t2、t3的顺序),建议把HashMap换成
LinkedHashMap,或者提前手动定义有序的表头列表(比如List<String> heads = Arrays.asList("t1", "t2", "t3")),避免因为哈希表的无序性导致列顺序混乱。 - 文件格式:上面的代码生成的是
.xlsx格式的Excel,如果需要.xls格式,Apache POI可以改用HSSFWorkbook,EasyExcel则不需要改代码,会自动适配。
内容的提问来源于stack exchange,提问作者user2755407
相关产品推荐
相关产品推荐

