说明:多人同时在线编辑文件大多数会出现文档相互覆盖的问题,后保存的文档会覆盖先保存的文档。pageoffice的这个功能可以用程序控制不同用户打开文件后,编辑Word文档中属于自己的区域,并且不会互相影响。

1、环境:

前端:vue

后端:springboot、pageoffice5.4.0.3版本

vue+springboot集成pageoffice的具体步骤参考:Vue+springboot集成PageOffice实现在线编辑Word、excel文档

2、前端

在index.vue页面定义不同用户打开文件的按钮,调用pageoffice的POBrowser打开文件

<template>
<div class="Word">
<div style="text-align: center;">
<br/><br/>
<h1 style="color: rgb(114, 43, 207);">不同的用户在文档中可以编辑的区域不同</h1>
<input type="button" @click="openWord('zhangsan')" value="张三打开文件"/><br/><br/>
<input type="button" @click="openWord('lisi')" value="李四打开文件"/><br/>
</div>
</div>
</template> <script>
const axios=require('axios');
export default{
name: 'Word',
data(){
return {
}
},
methods:{
openWord(userId){
POBrowser.openWindowModeless('word?userId='+userId , 'width=1200px;height=800px;');
}
}
}
</script>

Word.vue页面通过axios请求后台获取pageoffice控件在页面解析

<template>
<div class="Word">
<div class="flow4">
<input type="button" @click="exit()" value="退出" />
<strong>当前用户:</strong>
<span style="color: Red;">{{user}}</span>
</div>
<div style="height: 800px; width: auto" v-html="poHtmlCode"/>
</div>
</template> <script>
const axios=require('axios');
export default{
name: 'Word',
data(){
return {
poHtmlCode:'',
user:'',
}
},
created: function(){
this.user = this.$route.query.userId;
axios.post("/api/SetDrByUserWord2/Word?user="+this.user).then((response) => {
this.poHtmlCode = response.data;
}).catch(function (err) {
console.log(err)
})
},
methods:{
exit(){
window.external.close();
},
Save() {
document.getElementById("PageOfficeCtrl1").WebSave();
},
//全屏/还原
IsFullScreen() {
document.getElementById("PageOfficeCtrl1").FullScreen = !document.getElementById("PageOfficeCtrl1").FullScreen;
}
},
mounted: function(){
// 将vue中的方法赋值给window
window.Save = this.Save;
window.IsFullScreen = this.IsFullScreen;
}
}
</script>

3、后端

后端打开test.doc文件,这个文件相当于一个模板,张三和李四两个用户分别编辑的区域是两个单独的文件,在打开文件的时候将content这两个文件插入到test.doc中。当任何一个用户保存时,只单独保存他编辑的文件,其他用户的区域不动。这样就达到了同时编辑的效果,并且互不影响。主要是用了pageoffice的拆分文档和合并文档的功能

package com.zhuozhengsoft.samplesspringbootback.controller;

import com.zhuozhengsoft.pageoffice.OpenModeType;
import com.zhuozhengsoft.pageoffice.PageOfficeCtrl;
import com.zhuozhengsoft.pageoffice.wordwriter.DataRegion;
import com.zhuozhengsoft.pageoffice.wordwriter.WordDocument;
import com.zhuozhengsoft.samplesspringbootback.util.GetDirPathUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map; @RestController
@RequestMapping(value = "/SetDrByUserWord2/")
public class SetDrByUserWord2Controller { //获取doc目录的磁盘路径
private String dir = GetDirPathUtil.getDirPath() + "static/doc/"; @RequestMapping(value = "Word")
public String showWord(HttpServletRequest request) {
String userName = request.getParameter("user");
//***************************卓正PageOffice组件的使用********************************
WordDocument doc = new WordDocument();
//打开数据区域
DataRegion d1 = doc.openDataRegion("PO_com1");
DataRegion d2 = doc.openDataRegion("PO_com2"); //给数据区域赋值
d1.setValue("[word]/api/doc/SetDrByUserWord2/content1.doc[/word]");
d2.setValue("[word]/api/doc/SetDrByUserWord2/content2.doc[/word]"); //根据登录用户名设置数据区域可编辑性
//甲客户:zhangsan登录后
if (userName.equals("zhangsan")) {
d1.setEditing(true);
//若要将数据区域内容存入文件中,则必须设置属性“setSubmitAsFile”值为true
d1.setSubmitAsFile(true);
d2.setEditing(false);
}
//乙客户:lisi登录后
else if(userName.equals("lisi")) {
d2.setEditing(true);
d2.setSubmitAsFile(true);
d1.setEditing(false);
} PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
poCtrl.setWriter(doc);
//添加自定义按钮
poCtrl.addCustomToolButton("保存", "Save", 1);
poCtrl.addCustomToolButton("全屏/还原", "IsFullScreen", 4);
//设置服务器页面
poCtrl.setServerPage("/api/poserver.zz"); //此行必须
//设置保存方法
poCtrl.setSaveDataPage("/api/SetDrByUserWord2/save?userName=" + userName);
//打开Word文档,文档地址可以是磁盘路径也可以是url
poCtrl.webOpen("/api/doc/SetDrByUserWord2/test.doc", OpenModeType.docSubmitForm, userName);
return poCtrl.getHtmlCode("PageOfficeCtrl1");
} @RequestMapping("save")
public void save(HttpServletRequest request, HttpServletResponse response) throws IOException {
com.zhuozhengsoft.pageoffice.wordreader.WordDocument doc = new com.zhuozhengsoft.pageoffice.wordreader.WordDocument(request, response);
byte[] bytes = null;
String filePath = "";
if (request.getParameter("userName") != null && request.getParameter("userName").trim().equalsIgnoreCase("zhangsan")) {
bytes = doc.openDataRegion("PO_com1").getFileBytes();
filePath = "content1.doc";
} else if(request.getParameter("userName") != null && request.getParameter("userName").trim().equalsIgnoreCase("lisi")) {
bytes = doc.openDataRegion("PO_com2").getFileBytes();
filePath = "content2.doc";
}
doc.close(); filePath = dir + "SetDrByUserWord2/" + filePath;
FileOutputStream outputStream = new FileOutputStream(filePath);
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
} }

4、最后效果

转载 https://blog.csdn.net/qq_44306545/article/details/128237354

PageOffice调用本地office实现多人在线同时编辑Word文档的更多相关文章

  1. Java 如何在线打开编辑word文档?

    在一般的OA项目中经常会遇到在线处理Office文档的需求,先下载文件,编辑保存后再选择文件上传的方式太过原始,在如今早已是Office Online的时代,没有用户能接受这种蹩脚的操作方式. 虽然微 ...

  2. Asp.Net在线预览Word文档的解决方案与思路

    前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈. 这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档. 首先想到的是用第三方 ...

  3. 在线编辑word文档 可保存到服务器

    使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...

  4. [原创]Java在线编辑word文档调用PageOffice实现并发控制

    1.功能介绍 PageOffice的并发控制功能用来解决多个用户在线编辑同一篇文档可能造成的互相覆盖修改结果的技术难题. B/S架构下用户访问都是并发的,也就是说经常会出现同时N个用户对一个服务器页面 ...

  5. 在线编辑word文档代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  6. JSP实现word文档的上传,在线预览,下载

    前两天帮同学实现在线预览word文档中的内容,而且需要提供可以下载的链接!在网上找了好久,都没有什么可行的方法,只得用最笨的方法来实现了.希望得到各位大神的指教.下面我就具体谈谈自己的实现过程,总结一 ...

  7. java 在线拆分 word文档采用什么技术比较好?

    在Java项目开发中,偶尔会遇到通过程序动态拆分word文档的需求,由于Java本身不能操作Word文档,在网上也都是讨论如何动态合并word,所以这个需求实现起来相当困难,下面就将近期对于Word文 ...

  8. WPS Office for Mac如何修改Word文档文字排列?WPS office修改Word文档文字排列方向教程

    Word文档如何改变文字的排列方向?最新版WPS Office for Mac修复了文字排版相关的细节问题,可以更快捷的进行Word编辑,WPS Office在苹果电脑中如何修改Word文档文字排列方 ...

  9. .NET通过调用Office组件导出Word文档

    .NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...

  10. 调用Microsoft.Office.Interop.Word生成自定义Word文档

    具体思路: 1.先制作Word模版,使用文本框+书签的方式来设计模版: 2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件: 3.后台取得数据,参照网页渲染的方 ...

随机推荐

  1. Array and Set work process

    目录 Array work principle 分析Array操作步骤数 read find insert delete Set work principle 分析Set操作步骤数 read find ...

  2. Docker学习路线9:运行容器

    要启动一个新的容器,我们使用 docker run 命令,后跟镜像名称.基本语法如下: docker run [选项] 镜像 [COMMAND] [ARG...] 例如,要运行官方的 Nginx 镜像 ...

  3. C# 属性概述

    属性概述 属性允许类公开获取和设置值的公共方法,而隐藏实现或验证代码. get 属性访问器用于返回属性值,而 set 属性访问器用于分配新值. 这些访问器可以具有不同的访问级别. 有关详细信息,请参阅 ...

  4. 我只用了3步,实现了一个逼真的3D场景渲染

    给3D模型及环境场景渲染出兼具质感和真实感的材质效果,需要经历几步? 显然,目前的3D模型材质渲染技术,还无法实现简单几步就能搞定的标准化作业来量化,完成一个质量过关的3D模型渲染,一般需要: 1.准 ...

  5. 生成 MFC ActiveX (OCX)时,报错:MSB801:未能注册输出

    我们在生成 ocx 控件时,报错:MSB801:未能注册输出,如下图: 解决方法: 1.打开 项目属性 -> 链接器 -> 常规  :  逐用户重定向 改为  是 2. 重新生成 如果此时 ...

  6. 动态库 DLL 封装四:对dll二次封装,开放回调函数,并减少回调函数中参数个数

    背景: 我需要对一个dll进行二次封装,其中有一个接口,里面的参数需要传回调函数. 需求: 这个回调函数,我需要开放出去,并且减少回调函数参数的个数 示例: // 回调原型 VOID __stdcal ...

  7. 基于OT与CRDT协同算法的文档划词评论能力实现

    基于OT与CRDT协同算法的文档划词评论能力实现 当我们实现在线文档平台时,划词评论的功能是非常必要的,特别是在重文档管理流程的在线文档产品中,文档反馈是非常重要的一环,这样可以帮助文档维护者提高文档 ...

  8. 20个Python 正则表达式应用与技巧

    本文分享自华为云社区<Python 正则表达式大揭秘应用与技巧全解析>,作者:柠檬味拥抱. Python 中的 re 模块是用于处理正则表达式的强大工具.正则表达式是一种用来匹配字符串的模 ...

  9. HarmonyOS应用兼容稳定性云测试

      兼容性测试 兼容性测试主要验证HarmonyOS应用在华为真机设备上运行的兼容性问题,包括首次安装.再次安装.启动.卸载.崩溃.黑白屏.闪退.运行错误.无法回退.无响应.设计约束场景.具体兼容性测 ...

  10. CentOS升级内核-- CentOS9 Stream/CentOS8 Stream/CentOS7

    官方文档在此 升级原因 当我们安装一些软件(对,我说的就是Kubernetes),可能需要新内核的支持,而CentOS又比较保守,不太升级,所以需要我们手工升级. # 看下目前是什么版本内核 unam ...