1
This commit is contained in:
@@ -500,7 +500,8 @@ public class WPS365Controller extends BaseController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping("/readAirSheetCells")
|
@GetMapping("/readAirSheetCells")
|
||||||
public AjaxResult readAirSheetCells(@RequestParam String userId,
|
public AjaxResult readAirSheetCells(@RequestParam String userId,
|
||||||
@RequestParam String worksheetId,
|
@RequestParam String fileId,
|
||||||
|
@RequestParam(required = false, defaultValue = "0") String worksheetId,
|
||||||
@RequestParam(required = false) String range) {
|
@RequestParam(required = false) String range) {
|
||||||
try {
|
try {
|
||||||
WPS365TokenInfo tokenInfo = wps365OAuthServiceImpl.getTokenByUserId(userId);
|
WPS365TokenInfo tokenInfo = wps365OAuthServiceImpl.getTokenByUserId(userId);
|
||||||
@@ -519,10 +520,10 @@ public class WPS365Controller extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject result = wps365ApiService.readAirSheetCells(tokenInfo.getAccessToken(), worksheetId, range);
|
JSONObject result = wps365ApiService.readAirSheetCells(tokenInfo.getAccessToken(), fileId, worksheetId, range);
|
||||||
return AjaxResult.success("读取AirSheet数据成功", result);
|
return AjaxResult.success("读取AirSheet数据成功", result);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("读取AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, e);
|
log.error("读取AirSheet数据失败 - fileId: {}, worksheetId: {}, range: {}", fileId, worksheetId, range, e);
|
||||||
return AjaxResult.error("读取AirSheet数据失败: " + e.getMessage());
|
return AjaxResult.error("读取AirSheet数据失败: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -534,13 +535,14 @@ public class WPS365Controller extends BaseController {
|
|||||||
public AjaxResult updateAirSheetCells(@RequestBody Map<String, Object> params) {
|
public AjaxResult updateAirSheetCells(@RequestBody Map<String, Object> params) {
|
||||||
try {
|
try {
|
||||||
String userId = (String) params.get("userId");
|
String userId = (String) params.get("userId");
|
||||||
String worksheetId = (String) params.get("worksheetId");
|
String fileId = (String) params.get("fileId");
|
||||||
|
String worksheetId = params.get("worksheetId") != null ? params.get("worksheetId").toString() : "0";
|
||||||
String range = (String) params.get("range");
|
String range = (String) params.get("range");
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
List<List<Object>> values = (List<List<Object>>) params.get("values");
|
List<List<Object>> values = (List<List<Object>>) params.get("values");
|
||||||
|
|
||||||
if (userId == null || worksheetId == null) {
|
if (userId == null || fileId == null) {
|
||||||
return AjaxResult.error("userId和worksheetId不能为空");
|
return AjaxResult.error("userId和fileId不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
WPS365TokenInfo tokenInfo = wps365OAuthServiceImpl.getTokenByUserId(userId);
|
WPS365TokenInfo tokenInfo = wps365OAuthServiceImpl.getTokenByUserId(userId);
|
||||||
@@ -559,7 +561,7 @@ public class WPS365Controller extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject result = wps365ApiService.updateAirSheetCells(tokenInfo.getAccessToken(), worksheetId, range, values);
|
JSONObject result = wps365ApiService.updateAirSheetCells(tokenInfo.getAccessToken(), fileId, worksheetId, range, values);
|
||||||
return AjaxResult.success("更新AirSheet数据成功", result);
|
return AjaxResult.success("更新AirSheet数据成功", result);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("更新AirSheet数据失败", e);
|
log.error("更新AirSheet数据失败", e);
|
||||||
|
|||||||
@@ -95,21 +95,23 @@ public interface IWPS365ApiService {
|
|||||||
* 读取AirSheet工作表数据
|
* 读取AirSheet工作表数据
|
||||||
*
|
*
|
||||||
* @param accessToken 访问令牌
|
* @param accessToken 访问令牌
|
||||||
* @param worksheetId 工作表ID(文件ID)
|
* @param fileId 文件ID
|
||||||
|
* @param worksheetId 工作表ID(整数,通常为0表示第一个工作表)
|
||||||
* @param range 单元格范围(如:A1:B10,可选)
|
* @param range 单元格范围(如:A1:B10,可选)
|
||||||
* @return 单元格数据
|
* @return 单元格数据
|
||||||
*/
|
*/
|
||||||
JSONObject readAirSheetCells(String accessToken, String worksheetId, String range);
|
JSONObject readAirSheetCells(String accessToken, String fileId, String worksheetId, String range);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新AirSheet工作表数据
|
* 更新AirSheet工作表数据
|
||||||
*
|
*
|
||||||
* @param accessToken 访问令牌
|
* @param accessToken 访问令牌
|
||||||
* @param worksheetId 工作表ID(文件ID)
|
* @param fileId 文件ID
|
||||||
|
* @param worksheetId 工作表ID(整数,通常为0表示第一个工作表)
|
||||||
* @param range 单元格范围(如:A1:B2)
|
* @param range 单元格范围(如:A1:B2)
|
||||||
* @param values 单元格值(二维数组,第一维是行,第二维是列)
|
* @param values 单元格值(二维数组,第一维是行,第二维是列)
|
||||||
* @return 更新结果
|
* @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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -218,32 +218,75 @@ public class WPS365ApiServiceImpl implements IWPS365ApiService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSONObject readAirSheetCells(String accessToken, String worksheetId, String range) {
|
public JSONObject readAirSheetCells(String accessToken, String fileId, String worksheetId, String range) {
|
||||||
try {
|
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
|
// 根据文档:https://open.wps.cn/documents/app-integration-dev/wps365/server/airsheet/worksheets/VbHZwButmh
|
||||||
// 注意:worksheetId既是file_id也是worksheet_id(AirSheet中文件ID就是工作表ID)
|
// 注意:AirSheet中,fileId和worksheetId可能是同一个值,或者worksheetId是整数索引
|
||||||
|
// 如果用户只提供了一个ID(fileId),则fileId和worksheetId使用同一个值
|
||||||
String baseUrl = "https://openapi.wps.cn/v7";
|
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作为worksheetId(AirSheet中文件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()) {
|
if (range != null && !range.trim().isEmpty()) {
|
||||||
|
// 先尝试作为query参数
|
||||||
url += "?range=" + java.net.URLEncoder.encode(range, "UTF-8");
|
url += "?range=" + java.net.URLEncoder.encode(range, "UTF-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("读取AirSheet数据 - url: {}, range: {}", url, range);
|
log.debug("读取AirSheet数据 - url: {}, fileId: {}, worksheetId: {}, range: {}", url, fileId, wsId, range);
|
||||||
return WPS365ApiUtil.httpRequest("GET", url, accessToken, null);
|
JSONObject result = WPS365ApiUtil.httpRequest("GET", url, accessToken, null);
|
||||||
|
return result;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("读取AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, 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);
|
throw new RuntimeException("读取AirSheet数据失败: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@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 {
|
try {
|
||||||
// WPS365 AirSheet API: PUT https://openapi.wps.cn/v7/airsheet/{file_id}/worksheets/{worksheet_id}
|
// WPS365 AirSheet API路径格式
|
||||||
// 注意:worksheetId既是file_id也是worksheet_id(AirSheet中文件ID就是工作表ID)
|
// 注意:AirSheet中,fileId和worksheetId可能是同一个值
|
||||||
String baseUrl = "https://openapi.wps.cn/v7";
|
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();
|
JSONObject requestBody = new JSONObject();
|
||||||
@@ -267,11 +310,20 @@ public class WPS365ApiServiceImpl implements IWPS365ApiService {
|
|||||||
requestBody.put("values", valuesArray);
|
requestBody.put("values", valuesArray);
|
||||||
|
|
||||||
String bodyStr = requestBody.toJSONString();
|
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);
|
||||||
|
|
||||||
|
try {
|
||||||
return WPS365ApiUtil.httpRequest("PUT", url, accessToken, bodyStr);
|
return WPS365ApiUtil.httpRequest("PUT", url, accessToken, bodyStr);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("更新AirSheet数据失败 - worksheetId: {}, range: {}", worksheetId, range, 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数据失败 - fileId: {}, worksheetId: {}, range: {}", fileId, worksheetId, range, e);
|
||||||
throw new RuntimeException("更新AirSheet数据失败: " + e.getMessage(), e);
|
throw new RuntimeException("更新AirSheet数据失败: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user