Vue+SpringBoot 集成 PageOffice实现在线编辑 Word、Excel 文档

Vue+SpringBoot 集成 PageOffice 实现在线编辑 Word、Excel 文档

说明

PageOffice 是一款在线 Office 编辑软件,帮助 Web 应用系统或 Web 网站实现用户在线编辑 Word、Excel、PowerPoint 文档。可以完美实现在线公文流转、领导批阅、盖章,可以给文件添加水印,在线安全预览防止用户下载和复制文件等。


一、环境要求

前端 Vue 项目

  • Node.js 10 及以上版本
  • 注意:当前集成方式不支持 Vue 3(Vue 3 不兼容 IE)

Vue 3 集成 PageOffice 请参考:Vue3 + Spring Boot 集成 PageOffice 在线编辑 Office 文件

后端 Spring Boot 项目

  • IntelliJ IDEA
  • JDK 1.8 及以上版本

二、前端项目配置

1. 在 index.html 中引入 PageOffice

public/index.html 文件中添加以下脚本引用:

html 复制代码
<script type="text/javascript" src="http://localhost:8081/samples-springboot-back/pageoffice.js"></script>

2. 配置 vue.config.js 代理

在项目根目录下的 vue.config.js 文件中配置代理:

javascript 复制代码
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:8081/samples-springboot-back', // 后端项目地址
        ws: true,
        changeOrigin: true, // 允许跨域
        pathRewrite: {
          '^/api': '' // 使用 '/api' 代替真实的接口地址
        }
      }
    }
  }
}

3. 创建入口页面(index.vue)

在需要打开文档的页面添加按钮,通过点击事件调用 POBrowser

vue 复制代码
<template>
  <div>
    <el-button type="primary" @click="openWord">打开Word文档</el-button>
  </div>
</template>

<script>
export default {
  methods: {
    openWord() {
      // 第一个参数 "SimpleWord/Word" 是 Vue 路由路径
      POBrowser.openWindowModeless('SimpleWord/Word', 'width=1150px;height=900px;')
    }
  }
}
</script>

4. 创建 Word.vue 页面

views/SimpleWord/Word.vue 中创建页面组件:

vue 复制代码
<template>
  <div class="Word">
    <div style="height: 800px; width: auto" v-html="poHtmlCode" />
  </div>
</template>

<script>
import axios from "axios";

export default {
  name: "Word",
  data() {
    return {
      poHtmlCode: ""
    };
  },
  created() {
    axios
      .post("/api/SimpleWord/Word")
      .then(response => {
        this.poHtmlCode = response.data;
      })
      .catch(err => {
        console.log(err);
      });
  },
  methods: {
    // PageOffice 控件中的方法,通过 poCtrl.addCustomToolButton 定义
    Save() {
      document.getElementById("PageOfficeCtrl1").WebSave();
    }
  },
  mounted() {
    // 将 PageOffice 控件中的方法挂载到 window 对象上
    window.Save = this.Save;
  }
};
</script>

5. 配置路由

在路由配置文件(如 router/index.js)中添加路由:

javascript 复制代码
{
  path: '/SimpleWord/Word',
  name: 'Word',
  component: () => import('@/views/SimpleWord/Word.vue')
}

注意 :如果需要在请求中添加 Token,可以在 main.js 中配置 Axios 拦截器。


三、后端项目配置

1. 添加 PageOffice 依赖

pom.xml 中添加:

xml 复制代码
<dependency>
    <groupId>com.zhuozhengsoft</groupId>
    <artifactId>pageoffice</artifactId>
    <version>5.4.0.3</version>
</dependency>

2. 配置 application.properties

properties 复制代码
# PageOffice 注册文件存放路径
po.sys.path=D:/pageoffice/license/

3. 配置 Servlet Bean(启动类)

在 Spring Boot 启动类中添加 ServletRegistrationBean 配置:

java 复制代码
@SpringBootApplication
public class SamplesSpringbootBackApplication {

    @Value("${po.sys.path}")
    private String poSysPath;

    public static void main(String[] args) {
        SpringApplication.run(SamplesSpringbootBackApplication.class, args);
    }

    @Bean
    public ServletRegistrationBean pageofficeRegistrationBean() {
        com.zhuozhengsoft.pageoffice.poserver.Server poserver = 
            new com.zhuozhengsoft.pageoffice.poserver.Server();
        // 设置 PageOffice 注册成功后 license.lic 文件存放的目录
        poserver.setSysPath(poSysPath);
        
        ServletRegistrationBean srb = new ServletRegistrationBean(poserver);
        srb.addUrlMappings("/poserver.zz");
        srb.addUrlMappings("/posetup.exe");
        srb.addUrlMappings("/pageoffice.js");
        srb.addUrlMappings("/jquery.min.js");
        srb.addUrlMappings("/pobstyle.css");
        srb.addUrlMappings("/sealsetup.exe");
        return srb;
    }
}

注意/poserver.zz 等请求不要被拦截,需要放行 GET 和 POST 请求。

4. 创建 Controller(打开文档)

java 复制代码
@RestController
@RequestMapping("/SimpleWord")
public class SimpleWordController {

    @RequestMapping("/Word")
    public String showWord(HttpServletRequest request) {
        PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
        // 设置服务页面(注意:/api 是前端代理配置)
        poCtrl.setServerPage("/api/poserver.zz");
        
        // 添加自定义按钮
        poCtrl.addCustomToolButton("保存", "Save", 1);
        
        // 设置保存接口
        poCtrl.setSaveFilePage("/api/SimpleWord/save");
        
        // 打开 Word 文档(磁盘路径必须使用双反斜杠)
        poCtrl.webOpen("D:\\doc\\test.docx", 
                      OpenModeType.docNormalEdit, 
                      "张三");
        
        return poCtrl.getHtmlCode("PageOfficeCtrl1");
    }

    @RequestMapping("/save")
    public void save(HttpServletRequest request, HttpServletResponse response) {
        FileSaver fs = new FileSaver(request, response);
        fs.saveToFile("D:\\doc\\" + fs.getFileName());
        fs.close();
    }
}

关键点说明

  • setServerPagesetSaveFilePage 中的 /api 前缀对应前端配置的代理
  • webOpen 的第一个参数是文件在服务器上的绝对路径
  • 保存文件时可以自定义保存逻辑,这里简单保存到原目录

5. 配置跨域(可选)

如果遇到跨域问题,可以添加 CORS 配置:

java 复制代码
@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:8080") // Vue 项目地址
                        .allowedMethods("*")
                        .allowedHeaders("*")
                        .allowCredentials(true);
            }
        };
    }
}

四、最终效果

  1. 访问 Vue 项目页面,点击"打开Word文档"按钮
  2. 弹出 PageOffice 编辑窗口,显示 Word 文档内容
  3. 工具栏显示自定义的"保存"按钮
  4. 编辑文档后点击保存,文档内容被保存到服务器指定位置

常见问题

1. PageOffice 控件无法加载

  • 检查 index.html 中引用的 pageoffice.js 路径是否正确
  • 确认后端 poserver.zz 等相关请求未被拦截
  • 检查浏览器是否允许运行 ActiveX 控件(IE 浏览器需要设置)

2. 保存失败

  • 检查保存路径是否存在且有写入权限
  • 确认 setSaveFilePage 的 URL 正确
  • 查看后端日志是否有异常信息

3. 跨域问题

  • 确认前端代理配置正确
  • 检查后端是否配置了 CORS

参考资料

相关推荐
皮皮林5512 小时前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
codingWhat6 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
踩着两条虫6 小时前
VTJ.PRO 双向代码转换原理揭秘
前端·vue.js·人工智能
SuperEugene10 小时前
Vue生态精选篇:Element Plus 的“企业后台常用组件”用法扫盲
前端·vue.js·面试
bluceli14 小时前
Vue 3 Composition API深度解析:构建可复用逻辑的终极方案
前端·vue.js
程序员ys14 小时前
前端权限控制设计
前端·vue.js·react.js
滕青山14 小时前
腾讯域名拦截查询 在线工具核心JS实现
前端·javascript·vue.js
wuhen_n17 小时前
TypeScript 强力护航:PropType 与组件事件类型的声明
前端·javascript·vue.js
wuhen_n17 小时前
组件设计原则:如何设计一个高内聚、低耦合的 Vue 组件
前端·javascript·vue.js
独泪了无痕1 天前
Vue调试神器:Vue DevTools使用指南
vue.js·前端工程化