请问java poi和multivaluemap实现2个表格数据的比对并输出结果
时间: 2024-02-15 14:04:58 浏览: 21
好的,您可以按照以下步骤来实现 Java POI 和 MultiValueMap 进行 2 个表格数据的比对并输出结果:
1. 使用 Java POI 读取两个 Excel 文件中的数据,并将数据存储在两个不同的 List 中。
2. 使用 MultiValueMap 将两个 List 中的数据进行分组,以便后续进行比对。
3. 遍历分组后的数据,比较每个数据的键和值是否相等。如果相等,则将结果输出到一个新的 Excel 文件中。
下面是示例代码:
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.commons.collections4.MultiMap;
import org.apache.commons.collections4.map.MultiValueMap;
public class CompareExcelData {
public static void main(String[] args) {
try {
// 读取第一个 Excel 文件中的数据
List<Map<String, Object>> list1 = readExcelData("file1.xlsx");
// 读取第二个 Excel 文件中的数据
List<Map<String, Object>> list2 = readExcelData("file2.xlsx");
// 使用 MultiValueMap 将两个 List 中的数据进行分组
MultiMap<Object, Map<String, Object>> groupedData1 = new MultiValueMap<>();
MultiMap<Object, Map<String, Object>> groupedData2 = new MultiValueMap<>();
for (Map<String, Object> data : list1) {
groupedData1.put(data.get("key"), data);
}
for (Map<String, Object> data : list2) {
groupedData2.put(data.get("key"), data);
}
// 比较两个分组后的数据,并将结果输出到新的 Excel 文件中
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Comparison Result");
int rowNum = 0;
XSSFRow row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue("Key");
row.createCell(1).setCellValue("Value in File1");
row.createCell(2).setCellValue("Value in File2");
for (Object key : groupedData1.keySet()) {
List<Map<String, Object>> dataList1 = (List<Map<String, Object>>) groupedData1.get(key);
List<Map<String, Object>> dataList2 = (List<Map<String, Object>>) groupedData2.get(key);
if (dataList2 == null) {
for (Map<String, Object> data : dataList1) {
row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(key.toString());
row.createCell(1).setCellValue(data.get("value").toString());
row.createCell(2).setCellValue("");
}
} else {
for (Map<String, Object> data1 : dataList1) {
boolean found = false;
for (Map<String, Object> data2 : dataList2) {
if (data1.get("value").equals(data2.get("value"))) {
found = true;
break;
}
}
if (!found) {
row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(key.toString());
row.createCell(1).setCellValue(data1.get("value").toString());
row.createCell(2).setCellValue("");
}
}
for (Map<String, Object> data2 : dataList2) {
boolean found = false;
for (Map<String, Object> data1 : dataList1) {
if (data2.get("value").equals(data1.get("value"))) {
found = true;
break;
}
}
if (!found) {
row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(key.toString());
row.createCell(1).setCellValue("");
row.createCell(2).setCellValue(data2.get("value").toString());
}
}
}
}
workbook.write(new FileOutputStream(new File("result.xlsx")));
workbook.close();
System.out.println("Comparison done. Results written to result.xlsx.");
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<Map<String, Object>> readExcelData(String fileName) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(fileName)));
Sheet sheet = workbook.getSheetAt(0);
List<Map<String, Object>> dataList = new ArrayList<>();
for (Row row : sheet) {
Map<String, Object> data = new HashMap<>();
Cell keyCell = row.getCell(0);
Cell valueCell = row.getCell(1);
data.put("key", keyCell.getStringCellValue());
data.put("value", valueCell.getStringCellValue());
dataList.add(data);
}
return dataList;
}
}
```
上面的代码中,readExcelData 方法用于读取 Excel 文件中的数据,返回一个包含键值对的 List。groupedData1 和 groupedData2 分别用于存储两个 Excel 文件中的数据,以 MultiValueMap 类型存储。最后,比较两个分组后的数据,并将结果输出到新的 Excel 文件中。