package ext;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
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 ExcelUtils {
/**
* 将数据写入Excel文件
* @param data 包含数据的列表,每个元素是一个键值对的Map
* @param headers 表头字符串数组
* @param filePath Excel文件的路径
* @throws IOException 如果写入过程中发生I/O错误,则抛出该异常
*/
public static void writeExcel(List<Map<String, String>> data, String[] headers, String filePath) throws IOException {
writeExcel(data, headers, filePath, "Sheet1");
}
/**
* 将数据写入Excel表格
* @param data 要写入的数据,是一个包含多个键值对映射的列表
* @param headers 映射的键值对列表
* @param filePath 写入的文件路径
* @param sheetName 工作表的名称
* @throws IOException 如果在写入文件时发生I/O错误
*/
public static void writeExcel(List<Map<String, String>> data, String[] headers, String filePath, String sheetName) throws IOException {
// 创建一个新的工作簿
Workbook workbook = new XSSFWorkbook();
// 创建一个新的工作表
Sheet sheet = workbook.createSheet(sheetName);
int rowNum = 0;
// 创建表头行
Row headerRow = sheet.createRow(rowNum++);
int colNum = 0;
// 遍历headers数组
for (String header : headers) {
// 在表头行创建单元格,并设置单元格的值为header
Cell cell = headerRow.createCell(colNum++);
cell.setCellValue(header);
}
// 遍历数据列表中的每个元素(包含要写入的数据的映射)
for (Map<String, String> map : data) {
// 创建新的行
Row row = sheet.createRow(rowNum++);
colNum = 0;
// 遍历headers数组
for (String header : headers) {
// 在当前行创建单元格,并设置单元格的值为map的对应值
Cell cell = row.createCell(colNum++);
cell.setCellValue(map.get(header));
}
}
// 将工作簿写入到文件中
try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
workbook.write(fileOut);
}
}
/**
* 读取一行数据并将其转换为Map<String, String>类型
* @param row 要读取的行对象
* @param strHeaders 行的列名数组
* @return 转换后的Map对象,包含行的列值
*/
public static Map<String, String> readRow(Row row, String[] strHeaders) {
Map<String, String> rowMap = new HashMap<>();
for (int i = 0; i < row.getLastCellNum(); i++) {
Cell cell = row.getCell(i);
if (cell != null) {
// 将单元格的值添加到Map中
switch (cell.getCellTypeEnum()) {
case STRING:
rowMap.put(strHeaders[i], cell.getStringCellValue());
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
// 如果单元格的值是日期类型则跳过
continue;
}else{
rowMap.put(strHeaders[i], String.valueOf(cell.getNumericCellValue()));
}
break;
case BOOLEAN:
rowMap.put(strHeaders[i], String.valueOf(cell.getBooleanCellValue()));
break;
case FORMULA:
rowMap.put(strHeaders[i], cell.getCellFormula());
break;
case BLANK:
rowMap.put(strHeaders[i], "");
break;
case ERROR:
rowMap.put(strHeaders[i], "");
break;
case _NONE:
break;
}
}
}
return rowMap;
}
/**
* 读取Excel文件的数据并返回一个包含字符串类型数据的列表
* @param filePath Excel文件的路径
* @param sheetIndex 工作表的索引
* @param strHeaders 表头字符串数组
* @return 包含字符串类型数据的列表
* @throws IOException 如果发生输入输出异常
* @throws InvalidFormatException 如果工作簿的格式无效
*/
public static List<Map<String, String>> readExcel(String filePath, int sheetIndex, String[] strHeaders) throws IOException, InvalidFormatException {
List<Map<String, String>> data = new ArrayList<>();
Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath));
Sheet sheet = workbook.getSheetAt(sheetIndex);
for (int i = 0; i < sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
Map<String, String> map = readRow(row, strHeaders);
data.add(map);
}
return data;
}
}
Excel工具类
最新推荐文章于 2024-07-08 20:54:40 发布