This commit is contained in:
Leo
2026-01-16 18:02:54 +08:00
parent 9cb5e6a488
commit 18f541fdf7
3 changed files with 82 additions and 26 deletions

View File

@@ -95,21 +95,23 @@ public interface IWPS365ApiService {
* 读取AirSheet工作表数据
*
* @param accessToken 访问令牌
* @param worksheetId 工作表ID文件ID
* @param fileId 文件ID
* @param worksheetId 工作表ID整数通常为0表示第一个工作表
* @param range 单元格范围A1:B10可选
* @return 单元格数据
*/
JSONObject readAirSheetCells(String accessToken, String worksheetId, String range);
JSONObject readAirSheetCells(String accessToken, String fileId, String worksheetId, String range);
/**
* 更新AirSheet工作表数据
*
* @param accessToken 访问令牌
* @param worksheetId 工作表ID文件ID
* @param fileId 文件ID
* @param worksheetId 工作表ID整数通常为0表示第一个工作表
* @param range 单元格范围A1:B2
* @param values 单元格值(二维数组,第一维是行,第二维是列)
* @return 更新结果
*/
JSONObject updateAirSheetCells(String accessToken, String worksheetId, String range, List<List<Object>> values);
JSONObject updateAirSheetCells(String accessToken, String fileId, String worksheetId, String range, List<List<Object>> values);
}

View File

@@ -218,32 +218,75 @@ public class WPS365ApiServiceImpl implements IWPS365ApiService {
}
@Override
public JSONObject readAirSheetCells(String accessToken, String worksheetId, String range) {
public JSONObject readAirSheetCells(String accessToken, String fileId, String worksheetId, String range) {
try {
// WPS365 AirSheet API: GET https://openapi.wps.cn/v7/airsheet/{file_id}/worksheets/{worksheet_id}
// WPS365 AirSheet API路径格式
// 根据文档https://open.wps.cn/documents/app-integration-dev/wps365/server/airsheet/worksheets/VbHZwButmh
// 注意:worksheetId既是file_id也是worksheet_idAirSheet中文件ID就是工作表ID
// 注意:AirSheet中fileId和worksheetId可能是同一个值或者worksheetId是整数索引
// 如果用户只提供了一个IDfileId则fileId和worksheetId使用同一个值
String baseUrl = "https://openapi.wps.cn/v7";
String url = baseUrl + "/airsheet/" + worksheetId + "/worksheets/" + worksheetId;
// 如果worksheetId为空或与fileId相同说明用户只配置了一个ID类似腾讯文档
// 在AirSheet中这个ID既是file_id也是worksheet_id
String wsId;
if (worksheetId == null || worksheetId.trim().isEmpty() || worksheetId.equals(fileId)) {
// 使用fileId作为worksheetIdAirSheet中文件ID就是工作表ID
wsId = fileId;
} else {
// 使用提供的worksheetId可能是整数索引如"0"
wsId = worksheetId;
}
// 尝试不同的API路径格式
// 格式1: /v7/airsheet/{file_id}/worksheets/{worksheet_id}
String url = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId;
// 如果指定了range添加range参数
// 根据官方文档,可能需要使用 /values 子路径或者使用query参数
if (range != null && !range.trim().isEmpty()) {
// 先尝试作为query参数
url += "?range=" + java.net.URLEncoder.encode(range, "UTF-8");
}
log.debug("读取AirSheet数据 - url: {}, range: {}", url, range);
return WPS365ApiUtil.httpRequest("GET", url, accessToken, null);
log.debug("读取AirSheet数据 - url: {}, fileId: {}, worksheetId: {}, range: {}", url, fileId, wsId, range);
JSONObject result = WPS365ApiUtil.httpRequest("GET", url, accessToken, null);
return result;
} catch (Exception e) {
log.error("读取AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, e);
throw new RuntimeException("读取AirSheet数据失败: " + e.getMessage(), e);
log.error("读取AirSheet数据失败 - fileId: {}, worksheetId: {}, range: {}", fileId, worksheetId, range, e);
// 如果失败,尝试使用 /values 子路径
try {
String baseUrl = "https://openapi.wps.cn/v7";
String wsId = (worksheetId != null && !worksheetId.trim().isEmpty() && !worksheetId.equals(fileId)) ? worksheetId : fileId;
String url = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId + "/values";
if (range != null && !range.trim().isEmpty()) {
url += "?range=" + java.net.URLEncoder.encode(range, "UTF-8");
}
log.debug("尝试使用/values子路径 - url: {}", url);
return WPS365ApiUtil.httpRequest("GET", url, accessToken, null);
} catch (Exception e2) {
log.error("使用/values子路径也失败", e2);
throw new RuntimeException("读取AirSheet数据失败: " + e.getMessage(), e);
}
}
}
@Override
public JSONObject updateAirSheetCells(String accessToken, String worksheetId, String range, List<List<Object>> values) {
public JSONObject updateAirSheetCells(String accessToken, String fileId, String worksheetId, String range, List<List<Object>> values) {
try {
// WPS365 AirSheet API: PUT https://openapi.wps.cn/v7/airsheet/{file_id}/worksheets/{worksheet_id}
// 注意:worksheetId既是file_id也是worksheet_idAirSheet中文件ID就是工作表ID
// WPS365 AirSheet API路径格式
// 注意:AirSheet中fileId和worksheetId可能是同一个值
String baseUrl = "https://openapi.wps.cn/v7";
String url = baseUrl + "/airsheet/" + worksheetId + "/worksheets/" + worksheetId;
// 如果worksheetId为空或与fileId相同说明用户只配置了一个ID
String wsId;
if (worksheetId == null || worksheetId.trim().isEmpty() || worksheetId.equals(fileId)) {
wsId = fileId;
} else {
wsId = worksheetId;
}
// 尝试不同的API路径格式
String url = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId;
// 构建请求体
JSONObject requestBody = new JSONObject();
@@ -267,11 +310,20 @@ public class WPS365ApiServiceImpl implements IWPS365ApiService {
requestBody.put("values", valuesArray);
String bodyStr = requestBody.toJSONString();
log.debug("更新AirSheet数据 - url: {}, range: {}, values: {}", url, range, bodyStr);
log.debug("更新AirSheet数据 - url: {}, fileId: {}, worksheetId: {}, range: {}, values: {}",
url, fileId, wsId, range, bodyStr);
return WPS365ApiUtil.httpRequest("PUT", url, accessToken, bodyStr);
try {
return WPS365ApiUtil.httpRequest("PUT", url, accessToken, bodyStr);
} catch (Exception e) {
// 如果失败,尝试使用 /values 子路径
log.warn("使用基础路径失败,尝试/values子路径", e);
String urlWithValues = baseUrl + "/airsheet/" + fileId + "/worksheets/" + wsId + "/values";
log.debug("尝试使用/values子路径 - url: {}", urlWithValues);
return WPS365ApiUtil.httpRequest("PUT", urlWithValues, accessToken, bodyStr);
}
} catch (Exception e) {
log.error("更新AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, e);
log.error("更新AirSheet数据失败 - fileId: {}, worksheetId: {}, range: {}", fileId, worksheetId, range, e);
throw new RuntimeException("更新AirSheet数据失败: " + e.getMessage(), e);
}
}