【鸿蒙二开】WPS SDK 办公附件编辑+回传代码
鸿蒙办公审批里,附件编辑几乎是刚需:打开 Word 进 WPS、叠工号水印、关掉分享导出,用户关闭窗口后再把文件上传回业务系统。本文用 WPS Open SDK 把关键代码按注册、策略打开、关窗回传三段贴清楚,方便同事直接对照工程联调,减少「能打开但关不了回传」这类扯皮。
注册 ensureRegistered
未注册就 sendRequest 会 reject;1013 查包名与凭据。有激活序列号再 setWpsFileToken,不要塞到每次 OpenFileRequest.wpsToken。
let wpsReady = false;
async function ensureRegistered(ctx: UIAbilityContext) {
if (wpsReady) return;
const r = await WPSApi.sendRequest(
new RegisterAppRequest(ctx, APP_KEY, APP_SECRET)
);
if (r.code === ResultCode.ERROR_CODE_AUTH_FAILURE) {
throw new Error(`1013: ${r.msg}`);
}
if (r.code !== ResultCode.OK) {
throw new Error(`register ${r.code}`);
}
if (ACTIVATION_SN) {
WPSApi.setWpsFileToken(ACTIVATION_SN);
}
wpsReady = true;
}冷启动 await ensureRegistered,页面在 wpsReady 前禁用打开按钮。日志打 code/msg,Release 不打 secret。
策略打开:编辑 + 水印 + 关外发 + URI
选择器路径先 copy 到 filesDir,再构造请求。enableEdit 默认只读,必须显式 true。不落地时部分外发能力会被强制关掉,真机点菜单确认。
function toSandbox(ctx: UIAbilityContext, src: string): string {
const dir = `${ctx.filesDir}/wps_in`;
fs.mkdirSync(dir, true);
const dest = `${dir}/${Date.now()}.docx`;
fs.copyFileSync(src, dest);
return dest;
}
async function openPolicy(ctx: UIAbilityContext, src: string, stamp: string) {
await ensureRegistered(ctx);
const path = toSandbox(ctx, src);
const req = new OpenFileRequest(ctx, path);
req.enableEdit = true;
req.enableLocalization = false;
req.wpsTransferType = TransferType.URI;
const wm = new WaterMark();
wm.Enable = true;
wm.WaterMaskText = stamp;
wm.Angle = -30;
wm.FontColor = '#19000000';
wm.FontSize = 16;
req.wpsWaterMarkParams = wm;
const opt = new OpenFileExtraOptions();
opt.enableShare = false;
opt.enableCloud = false;
opt.enablePrint = false;
opt.enableExport = false;
opt.enableScreenShot = false;
req.extraOptions = opt;
return await WPSApi.sendRequest(req);
}联调建议分层:先可编辑,再叠不落地与 extraOptions,最后水印和回传,ERROR 更好定位。
关窗回传与落盘
切回应用 ≠ 关窗。OK 且无 data 是中间态。有 fileUri 再 copy 到本应用后入上传队列。
async function runEdit(ctx: UIAbilityContext, picker: string) {
const res = await openPolicy(ctx, picker, `${uid}|${dept}|内部`);
if (res.code !== ResultCode.OK) {
throw new Error(res.msg ?? String(res.code));
}
if (!res.data?.fileUri) {
return; // 未关窗
}
const f = fs.openSync(res.data.fileUri, fs.OpenMode.READ_ONLY);
const dest = `${ctx.filesDir}/wps_callback/${Date.now()}.docx`;
fs.mkdirSync(`${ctx.filesDir}/wps_callback`, true);
fs.copyFileSync(f.fd, dest);
fs.closeSync(f);
await upload(dest);
}排错速查
现象 | 查 |
reject | 注册时序 |
1013 | key/包名/HAR |
ERROR | 沙箱路径 |
只能预览 | enableEdit=true |
无 data | 是否关文档窗 |
仍能分享 | 不落地与 extraOptions |
真机回归时建议至少测:小 docx、大 xlsx;正常关窗与杀进程打断;上传失败重试不覆盖上次回传文件。冷启动连点「打开」应能 catch 到未注册 reject。换 HAR 后 clean 构建,多包名分别校验凭据。日志固定 requestType、code、msg,便于区分注册失败与打开失败。
页面侧示例:onCreate 里 await ensureRegistered;按钮里 if (!wpsReady) return; 再调 runEdit。水印文案拼工号与部门即可,业务差异尽量不要再拆第二套打开函数。
小结与获取 SDK
闭环三步:注册(按需 Token)→ 带水印/extraOptions/URI 回传打开 → copy 后上传。字段语义以官方文档为准。
更多参数见官方对接文档:https://365.kdocs.cn/l/clQl5cek2NoT
申请 SDK HAR 与凭据:m_open_sdk@wps.cn(注明包名与版本需求)。
技术交流 QQ 群:628436767