office在线编辑ONLYOFFICE集成java和前端

news/2024/11/30 18:37:58/

准备:

onlyoffice/documentServer在线编辑保存

启动一个documentServer的容器

docker run -it --name documentServer -d -p 9090:80 onlyoffice/documentserver

 使得可以访问http://localhost:9090/web-apps/apps/api/documents/api.js

============================================

VUE + ONLYOFFICE

基本配置使用

1 引入后台配置好的office服务器

<script type="text/javascript" src="https://documentserver/web-apps/apps/api/documents/api.js"></script>

 

2 封装组件

<template><div id="monitorOffice"></div>
</template>
<script>
import {handleDocType} from "../common/utils"export default {props: {option: {type: Object,default: () => {return {}}}},data() {return {doctype: ''}},mounted() {if (this.option.url)this.setEditor(this.option)},methods: {setEditor(option) {this.doctype = handleDocType(option.fileType);// office配置参数let config = {document: {fileType: option.fileType,key: "",title: option.title,permissions: {comment: false,download: false,modifyContentControl: true,modifyFilter: true,print: false,edit: option.isEdit,//是否可以编辑: 只能查看,传false// "fillForms": true,//是否可以填写表格,如果将mode参数设置为edit,则填写表单仅对文档编辑器可用。 默认值与edit或review参数的值一致。// "review": true //跟踪变化},url: option.url},documentType: this.doctype,editorConfig: {callbackUrl: option.editUrl,//"编辑word后保存时回调的地址,这个api需要自己写了,将编辑后的文件通过这个api保存到自己想要的位置lang: "zh",//语言设置customization: {autosave: false,//是否自动保存chat: false,comments: false,help: false,// "hideRightMenu": false,//定义在第一次加载时是显示还是隐藏右侧菜单。 默认值为falselogo: {image: "https://file.iviewui.com/icon/viewlogo.png",imageEmbedded: "https://file.iviewui.com/icon/viewlogo.png",},spellcheck: true,//拼写检查},},width: "100%",height: "100%",};let docEditor = new DocsAPI.DocEditor("monitorOffice", config);},},watch: {option: {handler: function (n, o) {this.setEditor(n);this.doctype = handleDocType(n.fileType);},deep: true,}}}
</script>

 

3 配置项参考官网

4 使用(一般就是编辑+查看两个功能)

1)编辑

<!--* @Author: zhengxiaoxiao* @Date: 2020-06-18 15:38:59* @Description: 监查报告
-->
<template><div class="monitor-report"><Upload ref="upload" accept=".doc,.docx" :action="action" :headers="header" :format="['doc','docx']":on-success="handleSuccess":show-upload-list="false" :before-upload="handleBeforeUpload" :on-format-error="handleFormatError"><Button :loading="loading" class="up-class">上传</Button><span>(文件格式为:doc,docx)</span></Upload><div class="office" v-if="pageLoading"><MonitorOffice :option="option"></MonitorOffice></div></div>
</template>
<script>// jsimport axios from "axios"import {GetMonitorReport} from "../../../../api/template"import {USER_NAME_SESSION, USER_ID_SESSION} from "../../../../common/storage";// 组件import MonitorOffice from "../../../../components/monitor-office"export default {components: {MonitorOffice},data() {return {// 上传文件参数header: {Authorization: `bearer ${sessionStorage.getItem("token")}`,},action: axios.defaults.baseURL + "/report/document/template",file: null,loading: false,// office配置参数option: {url: "",isEdit: false,fileType: "",title: ""},pageLoading: false}},mounted() {this.init();},methods: {init() {this.GetMonitorReport();},// 上传文件的格式验证handleFormatError(file) {this.$Message.warning(file.name + '格式不正确');this.loading = false;},// 上传之前handleBeforeUpload(file) {this.file = file;this.onUpload();return false;},onUpload() {this.loading = true;let _baseURL = axios.defaults.baseURL;this.action = `${_baseURL}/report/document/template`;setTimeout(() => {this.$refs.upload.post(this.file);}, 1000)},// 导入成功时handleSuccess(res) {this.loading = false;if (res.status) {this.$Message.success("上传成功");// 这里重新上传文件,only office不会覆盖,所以先刷新解决// location.reload();this.GetMonitorReport();}},// 获取项目下监察报告模板GetMonitorReport() {this.pageLoading = falseGetMonitorReport().then(res => {if (res.status) {let data = res.data;if (data) {this.option = {url: data.fileViewPath,fileType: data.fileType,title: "",isEdit: false,}}this.pageLoading = true}})}}}
</script>
<style lang="less" scoped>.monitor-report {.up-class {margin-bottom: 10px;}.office {height: 100vh;}}
</style>

2)查看
通过文件id请求查看文件

5 配置项中documentType 动态设置

export function handleDocType(fileType) {let docType = '';let fileTypesDoc = ['doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'epub', 'fodt', 'htm', 'html', 'mht', 'odt', 'ott', 'pdf', 'rtf', 'txt', 'djvu', 'xps'];let fileTypesCsv = ['csv', 'fods', 'ods', 'ots', 'xls', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx'];let fileTypesPPt = ['fodp', 'odp', 'otp', 'pot', 'potm', 'potx', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx'];if (fileTypesDoc.includes(fileType)) {docType = 'text'}if (fileTypesCsv.includes(fileType)) {docType = 'spreadsheet'}if (fileTypesPPt.includes(fileType)) {docType = 'presentation'}return docType;
}

============================================

html集成首先实现前端预览功能:

<div id="fileEdit"></div>
// 页面引入document的api.js
<script type="text/javascript" src="http://localhost:9090/web-apps/apps/api/documents/api.js"></script>
// 调用js创建预览对象
new DocsAPI.DocEditor("fileEdit", // 元素id{"document": {"permissions": {"edit": true,},"fileType": "docx", // 展示文件的类型"title": "页面展示的文件名称","url":"下载文件的接口" //读取文件进行展示},"documentType": "text","editorConfig": {"lang" : "zh-CN",// 回调接口,用于编辑后实现保存的功能,(关闭页面5秒左右会触发)"callbackUrl": "保存文件的接口?path=告诉保存接口需要覆盖的文件"},"height": "1000px","width": "100%"})

 

1.我们在config配置了callbackUrl,文档加载时会调用这个接口,此时status = 1,我们给onlyoffice的服务返回{"error":"0"}的信息,这样onlyoffice会认为回调接口是没问题的,这样就可以在线编辑文档了,否则的话会弹出窗口说明
The document could not be saved. Please check connection settings or contact your administrator.
When you click the 'OK' button, you will be prompted to download the document.
Find more information about connecting Document Server当我们关闭编辑窗口后,十秒钟左右onlyoffice会将它存储的我们的编辑后的文件,,此时status = 2,通过request发给我们,我们需要做的就是接收到文件然后回写该文件。tips:回调接口中要给唯一标识,让程序知道要回写的文件;2.post接口
后端保存接口@ApiOperation(value = "文档保存")@RequestMapping(value = "/docx/save",method = RequestMethod.POST,produces = "application/json;charset=UTF-8")@ResponseBodypublic void saveWord(HttpServletRequest request, HttpServletResponse response) {try {PrintWriter writer = response.getWriter();String body = "";try{Scanner scanner = new Scanner(request.getInputStream());scanner.useDelimiter("\\A");body = scanner.hasNext() ? scanner.next() : "";scanner.close();}catch (Exception ex){writer.write("get request.getInputStream error:" + ex.getMessage());return;}if (body.isEmpty()){writer.write("empty request.getInputStream");return;}JSONObject jsonObj = JSON.parseObject(body);int status = (Integer) jsonObj.get("status");int saved = 0;if(status == 2 || status == 3)//MustSave, Corrupted{String downloadUri = (String) jsonObj.get("url");try{URL url = new URL(downloadUri);java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();InputStream stream = connection.getInputStream();if (stream == null){throw new Exception("Stream is null");}// 从请求中获取要覆盖的文件参数定义"path"String path = request.getParameter("path");File savedFile = new File(path);try (FileOutputStream out = new FileOutputStream(savedFile)){int read;final byte[] bytes = new byte[1024];while ((read = stream.read(bytes)) != -1){out.write(bytes, 0, read);}out.flush();}connection.disconnect();}catch (Exception ex){saved = 1;ex.printStackTrace();}}System.out.print("编辑完成--------------11111");writer.write("{\"error\":" + saved + "}");} catch (IOException e) {e.printStackTrace();}}

demo下载:

https://download.csdn.net/download/qq_38567039/12915876


http://www.ppmy.cn/news/706234.html

相关文章

Java开发中OnlyOffice、OpenOffice和LibreOffice怎么选?

我把官网贴在下面如果大家有好的使用方法可以分享下。 onlyoffice官网&#xff1a;https://www.onlyoffice.com/ Api官方地址(英文)&#xff1a;https://api.onlyoffice.com/editors/basic Api中文地址(中文)&#xff1a;https://www.onlyoffice.org.cn/guide/usage-mode.html …

Java实现在线预览--openOffice实现

#Java实现在线预览–openOffice实现 ##简介 之前有写了poi实现在线预览的文章&#xff0c;里面也说到了使用openOffice也可以做到&#xff0c;这里就详细介绍一下。 我的实现逻辑有两种&#xff1a; 一、利用jodconverter(基于OpenOffice服务)将文件(.doc、.docx、.xls、.ppt)转…

安卓dj专业打碟机软件_DJ打碟机调速杆,你真的会用吗?

嗨&#xff0c;亲爱的dj爱好者朋友们 你们好 我还是你们的好盆友 Etine 在dj基础混音过程中有一个设备上的功能是大家一定会用到的&#xff0c;那就是调速杆&#xff0c;我们也叫他pitch(音调)杆&#xff01; 在两首舞曲速度不一样的时候&#xff0c;我们可以通过调速杆的调节将…

怎么自学python,大概需要学多久?

前言 自学Python是当前非常热门的话题&#xff0c;Python作为一种简洁而又功能强大的编程语言&#xff0c;在各个领域都有广泛的应用。然而&#xff0c;对于新手来说&#xff0c;怎样自学Python并在多长时间内掌握它&#xff0c;可能是一个困扰的问题。 自学任何一门编程语言…

外媒:中国手机品牌欲以低价策略攻占印度市场

美国《华尔街日报》网站八月十一日发表题为《华夏手机品牌登陆印度吹响代价战号角》的文章&#xff0c;称在印度的原土手机出售商场&#xff0c;本地坐蓐商除了要应答来自三星、苹果等国外权威公司的竞赛以外&#xff0c;他们也渐渐感受到了来自中国手机厂商对其听凭的还击。 以…

代码评审的18个军规,收藏好!

前言 大家好&#xff01; 我们开发完需求&#xff0c;提测前&#xff0c;一般都需要代码评审。小伙伴们&#xff0c;你们知道代码评审&#xff0c;一般都有哪些军规嘛&#xff1f;今天田螺哥给你带来代码评审的18个军规。 公众号&#xff1a;捡田螺的小男孩 &#xff08;有田…

【C++】泛型算法之std::for_each

std::for_each用于逐个遍历容器元素&#xff0c;它对迭代器区间[first, last)所指的每一个元素&#xff0c;执行由单参数函数对象f所定义的操作。它是for循环的一种替代方案。 std::for_each 如需使用std::for_each&#xff0c;需要引入头文件&#xff1a; #include <algo…

Fluttter的ClipRRect控件

ClipRRect简介 ClipRRect&#xff08;Rounded Rectangle Clip&#xff09;是Flutter中的一个控件&#xff0c;用于将其子控件剪裁为圆角矩形形状。 使用场景 ClipRRect通常在需要给子控件添加圆角效果时使用。它可以用于创建圆角图片、圆角容器等各种UI元素。 主要属性 bo…