public class Xlsx { public static <T> int[] handleBatch(String uri, Function<Row, T> convertFunction, Function<List<T>, Integer> handleFunction, int skipHeader) throws IOException { return handleBatch(uri, convertFunction, handleFunction, skipHeader, 100); } public static <T> int[] handleBatch(String uri, Function<Row, T> convertFunction, Function<List<T>, Integer> handleFunction, int skipHeader, int batchSize) throws IOException { Workbook workbook = WorkbookFactory.create(new File(uri)); Sheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.rowIterator(); int i = 0; while (i < skipHeader) { if (rowIterator.hasNext()) { rowIterator.next(); } i++; } int count = 0; List<T> batch = new LinkedList<>(); int success = 0; while (rowIterator.hasNext()) { Row row = rowIterator.next(); batch.add(convertFunction.apply(row)); if (batch.size() == batchSize) { success += handleFunction.apply(batch); batch.clear(); } count += 1; } workbook.close(); return new int[]{count, success}; } public static <T> List<T> handleBatch(InputStream inputStream, Function2<Row, Map<String, Integer>, T> convertFunction, int headerRowNum) throws IOException { Workbook workbook = WorkbookFactory.create(inputStream); Sheet sheet = workbook.getSheetAt(0); headerRowNum = Math.max(headerRowNum, 1); Map<String, Integer> headMap = new HashMap<>(64); int i = 0; Iterator<Row> rowIterator = sheet.rowIterator(); while (i < headerRowNum) { Row row = rowIterator.next(); for (Iterator<Cell> it = row.cellIterator(); it.hasNext(); ) { Cell cell = it.next(); headMap.put(cell.getStringCellValue(), cell.getColumnIndex()); } i++; } List<T> batch = new ArrayList<>(); int success = 0; while (rowIterator.hasNext()) { Row row = rowIterator.next(); batch.add(convertFunction.invoke(row, headMap)); } workbook.close(); return batch; } }
时间: 2024-02-14 16:30:57 浏览: 99
2003Excel文件转List<T>
这段代码是一个名为 "Xlsx" 的类,它提供了处理 Excel 文件的一些方法。让我解释一下每个方法的作用。
1. `handleBatch(String uri, Function<Row, T> convertFunction, Function<List<T>, Integer> handleFunction, int skipHeader)`:这个方法用于处理 Excel 文件的批量数据。它接受一个文件路径 `uri`,一个将行转换为对象的函数 `convertFunction`,一个处理批量数据的函数 `handleFunction`,以及一个跳过表头的参数 `skipHeader`。它默认使用批量大小为 100 进行处理,并返回一个包含总行数和成功处理的行数的整型数组。
2. `handleBatch(String uri, Function<Row, T> convertFunction, Function<List<T>, Integer> handleFunction, int skipHeader, int batchSize)`:这个方法与前一个方法类似,但它允许自定义批量大小。
3. `handleBatch(InputStream inputStream, Function2<Row, Map<String, Integer>, T> convertFunction, int headerRowNum)`:这个方法用于处理 Excel 文件的批量数据,但是接受一个输入流而不是文件路径。它还接受一个将行和头部映射为对象的函数 `convertFunction`,以及表头所在的行号 `headerRowNum`。它返回一个包含处理后对象的列表。
这些方法使用 Apache POI 库来读取和处理 Excel 文件。它们将文件加载到 Workbook 对象中,然后根据需要遍历行,并使用给定的函数将行转换为对象或处理批量数据。最后,它们关闭 Workbook 对象,并返回结果。
阅读全文