From 3b0b8712a816f5f4c4363493dc4f071a20ed3791 Mon Sep 17 00:00:00 2001 From: liushuang Date: Wed, 5 Nov 2025 11:02:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(sheet):=E4=BF=AE=E5=A4=8D=E8=A1=8C=E6=95=B0?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=86=99=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复行数不足时的计算逻辑,使用 Math.abs 确保正数 -优化数据写入时的行映射逻辑,避免重复键冲突 - 调整表格选项设置中的行数范围,防止越界错误 - 增加对现有行数的读取逻辑,确保操作不会超出限制 --- src/main/java/cn/isliu/FsHelper.java | 9 +++++++-- .../java/cn/isliu/core/builder/MapWriteBuilder.java | 2 +- src/main/java/cn/isliu/core/builder/WriteBuilder.java | 7 +++++-- src/main/java/cn/isliu/core/utils/FsTableUtil.java | 10 +++++++--- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/cn/isliu/FsHelper.java b/src/main/java/cn/isliu/FsHelper.java index dd86664..a2146ef 100644 --- a/src/main/java/cn/isliu/FsHelper.java +++ b/src/main/java/cn/isliu/FsHelper.java @@ -260,7 +260,12 @@ public class FsHelper { FeishuClient client = FsClient.getInstance().getClient(); Sheet sheet = FsApiUtil.getSheetMetadata(sheetId, client, spreadsheetToken); List fsTableDataList = FsTableUtil.getFsTableData(sheet, spreadsheetToken, tableConf, fieldsMap); - Map currTableRowMap = fsTableDataList.stream().collect(Collectors.toMap(FsTableData::getUniqueId, FsTableData::getRow)); + + Map currTableRowMap = fsTableDataList.stream() + .collect(Collectors.toMap( + FsTableData::getUniqueId, + FsTableData::getRow, + (existing, replacement) -> existing)); final Integer[] row = {tableConf.headLine()}; fsTableDataList.forEach(fsTableData -> { @@ -345,7 +350,7 @@ public class FsHelper { int rowTotal = sheet.getGridProperties().getRowCount(); int rowNum = rowCount.get(); if (rowNum >= rowTotal) { - FsApiUtil.addRowColumns(sheetId, spreadsheetToken, "ROWS", rowTotal - rowNum, client); + FsApiUtil.addRowColumns(sheetId, spreadsheetToken, "ROWS", Math.abs(rowTotal - rowNum), client); } Object resp = FsApiUtil.batchPutValues(sheetId, spreadsheetToken, resultValuesBuilder.build(), client); diff --git a/src/main/java/cn/isliu/core/builder/MapWriteBuilder.java b/src/main/java/cn/isliu/core/builder/MapWriteBuilder.java index adeaf50..6dfbea7 100644 --- a/src/main/java/cn/isliu/core/builder/MapWriteBuilder.java +++ b/src/main/java/cn/isliu/core/builder/MapWriteBuilder.java @@ -345,7 +345,7 @@ public class MapWriteBuilder { private void ensureSufficientRows(Sheet sheet, int requiredRows, FeishuClient client) { int rowTotal = sheet.getGridProperties().getRowCount(); if (requiredRows >= rowTotal) { - FsApiUtil.addRowColumns(sheetId, spreadsheetToken, "ROWS", requiredRows - rowTotal, client); + FsApiUtil.addRowColumns(sheetId, spreadsheetToken, "ROWS", Math.abs(requiredRows - rowTotal), client); } } diff --git a/src/main/java/cn/isliu/core/builder/WriteBuilder.java b/src/main/java/cn/isliu/core/builder/WriteBuilder.java index a2fe033..f258fbf 100644 --- a/src/main/java/cn/isliu/core/builder/WriteBuilder.java +++ b/src/main/java/cn/isliu/core/builder/WriteBuilder.java @@ -163,7 +163,10 @@ public class WriteBuilder { Map currTableRowMap = fsTableDataList.stream() .filter(fsTableData -> fsTableData.getRow() >= tableConf.headLine()) - .collect(Collectors.toMap(FsTableData::getUniqueId, FsTableData::getRow)); + .collect(Collectors.toMap( + FsTableData::getUniqueId, + FsTableData::getRow, + (existing, replacement) -> existing)); final Integer[] row = {tableConf.headLine()}; fsTableDataList.forEach(fsTableData -> { @@ -246,7 +249,7 @@ public class WriteBuilder { int rowTotal = sheet.getGridProperties().getRowCount(); int rowNum = rowCount.get(); if (rowNum >= rowTotal) { - FsApiUtil.addRowColumns(sheetId, spreadsheetToken, "ROWS", rowTotal - rowNum, client); + FsApiUtil.addRowColumns(sheetId, spreadsheetToken, "ROWS", Math.abs(rowTotal - rowNum), client); } fileDataList.forEach(fileData -> { diff --git a/src/main/java/cn/isliu/core/utils/FsTableUtil.java b/src/main/java/cn/isliu/core/utils/FsTableUtil.java index 876f3d0..23a1ec9 100644 --- a/src/main/java/cn/isliu/core/utils/FsTableUtil.java +++ b/src/main/java/cn/isliu/core/utils/FsTableUtil.java @@ -186,7 +186,7 @@ public class FsTableUtil { List> values = new LinkedList<>(); for (int i = 0; i < batchCount; i++) { int startRowIndex = startOffset + i * rowCount; - int endRowIndex = Math.max(startRowIndex + rowCount - 1, totalRow - 1); + int endRowIndex = Math.min(startRowIndex + rowCount - 1, totalRow - 1); // 3. 获取工作表数据 ValuesBatch valuesBatch = FsApiUtil.getSheetData(sheet.getSheetId(), spreadsheetToken, @@ -498,6 +498,9 @@ public class FsTableUtil { public static void setTableOptions(String spreadsheetToken, List headers, Map fieldsMap, String sheetId, boolean enableDesc, Map customProperties) { + // 读取sheet数据,查询有现有行数(超出会报错) + Sheet sheet = FsApiUtil.getSheetMetadata(sheetId, FsClient.getInstance().getClient(), spreadsheetToken); + int rowCount = sheet.getGridProperties().getRowCount(); List list = Arrays.asList(headers.toArray()); int line = getMaxLevel(fieldsMap) + (enableDesc ? 2 : 1); @@ -534,8 +537,9 @@ public class FsTableUtil { } if (result != null && !result.isEmpty()) { - FsApiUtil.setOptions(sheetId, FsClient.getInstance().getClient(), spreadsheetToken, tableProperty.type() == TypeEnum.MULTI_SELECT, position + line, position + 200, - result); + FsApiUtil.setOptions(sheetId, FsClient.getInstance().getClient(), spreadsheetToken, + tableProperty.type() == TypeEnum.MULTI_SELECT, + position + line, position + rowCount, result); } } }