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

参考资料

相关推荐
Zhencode2 小时前
深入Vue3响应式核心:computed 的实现原理与应用
前端·javascript·vue.js
wsfk12342 小时前
总结:Spring Boot 之spring.factories
java·spring boot·spring
!chen3 小时前
基于 Spring Boot 3.5.x + Sa-Token + MyBatis 企业级文件管理系统
spring boot·后端·mybatis
❀͜͡傀儡师3 小时前
Spring Boot 实现PDF水印的完整指南
spring boot·后端·pdf
SuniaWang3 小时前
Spring Boot + Spring AI + Vue 3 + TypeScript + Milvus 项目实战
java·人工智能·spring boot·spring·typescript·框架·前端开发
摇滚侠3 小时前
Spring SpringMVC SpringBoot SpringCloud SpringAI 分别是做什么的
spring boot·spring·spring cloud
青柠代码录3 小时前
【JWT】整合 SpringBoot 实现认证和鉴权
spring boot
Coder_Boy_3 小时前
从单体并发工具类到分布式并发:思想演进与最佳实践
java·spring boot·分布式·微服务
是欢欢啊3 小时前
全新的table组件,vue3+element Plus
前端·javascript·vue.js