PageOffice 开发者中心 PageOffice 开发者中心
首页
文档
  • 后端Java手册 (opens new window)
  • 后端.netcore手册 (opens new window)
  • 前端JavaScript手册 (opens new window)
下载
购买 (opens new window)
首页
文档
  • 后端Java手册 (opens new window)
  • 后端.netcore手册 (opens new window)
  • 前端JavaScript手册 (opens new window)
下载
购买 (opens new window)
  • 开始

  • 通用控制

    • PageOffice最简单的打开保存文件
    • 磁盘路径打开文档
    • 修改标题栏文本内容
    • 自定义工具条上添加按钮
    • 隐藏标题栏
    • 隐藏Office工具栏
    • 隐藏自定义工具栏
    • 禁止保存
    • 禁止另存为
    • 禁止打印
    • 保存后给前台返回自定义结果
    • 给SaveFilePage指向的地址传参
    • 给SaveFilePage指向的地址传参(Vue)
    • SaveFilePage获取页面Form域
    • POBrowser回调父页面的函数传值
    • 给POBrowser打开的页面传参
    • 另存文件为HTML格式
    • 另存文件为PDF格式
    • 保存数据区域数据同时保存文档
      • 文档打开后触发的事件
      • POBrowser窗口关闭前触发的事件
      • 打开保存数据库中的文件
      • WebCreateNew新建文件
      • 控制POBrowser窗口的位置
      • 打开云对象存储上的文档
      • PageOffice控件铺满整个页面
      • 加盖印章和签字功能
      • Office文档在线预览方案
      • 弹出各种样式的消息框及菜单
      • 实现POBrowser窗口内切换打开不同文件
    • Word

    • Excel

    • PDF

    • FileMaker

    • PPT

    • 更多

    目录

    保存数据区域数据同时保存文档

    # 保存数据区域数据同时保存文档

    • 本示例关键代码的编写位置,请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码

    注意

    本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。

    在实际应用中,例如在线签订合同的时候,合同的签订日期,合同号等等这些信息既要保存到数据库,合同签订后又要将整个合同文件保存起来。这时候就需要用到PageOffice的保存数据区域数据的同时保存整个文件的功能。

    # 后端代码

    1.后端打开文件的接口方法中,在webOpen方法之前给SaveFilePage和SaveDataPage方法赋值(设置好保存时由哪个地址接口负责接收数据和处理控件上传的文件流)。

      PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
      // com.zhuozhengsoft.pageoffice.word命名空间的WordDocumentWriter
      WordDocumentWriter wordDoc = new WordDocumentWriter(); 
      //打开数据区域,openDataRegion方法的参数代表Word文档中的书签名称
      wordDoc.openDataRegion("PO_contractNum").setEditing(true);
      wordDoc.openDataRegion("PO_contractDate").setEditing(true);
      
      poCtrl.setWriter(wordDoc);// 必须。
      poCtrl.setSaveDataPage("saveData"); //设置保存数据时的接口地址
      poCtrl.setSaveFilePage("saveFile");//设置保存文件时的接口地址
      //webOpen的第一个参数支持能够输出下载文件的Url相对地址或者文件在服务器上的磁盘路径两种方式
      //查看详细,请在本站搜索“PageOffice属性或方法中涉及到的URL路径或磁盘路径的说明”
      poCtrl.webOpen("doc/test.docx", OpenModeType.docSubmitForm, "张三");
      
      PageOfficeNetCore.PageOfficeCtrl poCtrl = new PageOfficeNetCore.PageOfficeCtrl(Request);
      
      PageOfficeNetCore.Word.WordDocumentWriter wordDoc = new PageOfficeNetCore.Word.WordDocumentWriter();
      //打开数据区域,OpenDataRegion方法的参数代表Word文档中的书签名称
      wordDoc.OpenDataRegion("PO_userName").Editing = true;
      wordDoc.OpenDataRegion("PO_deptName").Editing = true;
      
      poCtrl.SetWriter(wordDoc);
      poCtrl.SaveDataPage = "SaveData";//设置保存数据的页面
      poCtrl.SaveFilePage = "SaveDoc";//设置保存文件的页面
      poCtrl.WebOpen("doc/test.docx", PageOfficeNetCore.OpenModeType.docSubmitForm, "tom");
      
      // Make sure to add code blocks to your code group

      2.(1)在SaveDataPage属性指向的地址接口中,创建com.zhuozhengsoft.pageoffice.word包下的WordDocumentReader对象获取数据。

        WordDocumentReader doc = new WordDocumentReader(request, response);
        //获取提交的数值
        String contractNum = doc.openDataRegion("PO_contractNum").getValue();
        String contractDate = doc.openDataRegion("PO_contractDate").getValue();
        String contractId = doc.getFormField("contractId");//getFormField的参数是Form控件的id
        /**
        *实际开发中,这块代码一般是连接数据库将上面获取的数据更新到数据库中
        */
        doc.close();
        
        PageOfficeNetCore.Word.WordDocumentReader doc = new PageOfficeNetCore.Word.WordDocumentReader(Request, Response);
        await doc.LoadAsync();
        //获取提交的数值
        String dataUserName = doc.OpenDataRegion("PO_userName").Value;
        String dataDeptName = doc.OpenDataRegion("PO_deptName").Value;
        String companyName = doc.GetFormField("txtCompany");//getFormField的参数是Form控件的id
        /**
        *实际开发中,这块代码一般是连接数据库将上面获取的数据更新到数据库中
        */
        return doc.Close();
        
        // Make sure to add code blocks to your code group

        2.(2)在SaveFilePage属性指向的地址接口中,创建FileSaver对象处理文件的保存工作。

          FileSaver fs = new FileSaver(request, response);
          fs.saveToFile(request.getSession().getServletContext().getRealPath("doc/") + fs.getFileName());
          fs.close();
          
          PageOfficeNetCore.FileSaver fs = new PageOfficeNetCore.FileSaver(Request, Response);
          await fs.LoadAsync();
          string webRootPath = _webHostEnvironment.WebRootPath;
          fs.SaveToFile(webRootPath + "/SaveDataAndFile/doc/" + fs.FileName);
          return fs.Close();
          
          // Make sure to add code blocks to your code group

          # 前端代码

          本示例无前端关键代码。

          # SaveFilePage和SaveDataPage的区别

          • SaveFilePage:指定的页面可接受二进制文件流、Form域,直接保存修改后的文件。指定的页面只能创建FileServer对象。

          • SaveDataPage:指定的页面可接收页面提交的Word数据区域、Excel表格数据、Form域。指定的页面只能创建WordDocumentReader或WorkbookReader及其相关的对象。

          • SaveFilePage的使用:只需要保存修改后的文档,而不需要提取文档内容时。

          • SaveDataPage的使用:需要提交文档内容或用户输入的文档内容时。

          # 保存文档和数据的事务实现

          在实际开发中,我们可能会遇到这样的问题:如果数据保存失败了,PageOffice是否会继续保存文档呢?事实上,PageOffice的保存机制是先保存数据,再保存文件。但是,如果我们想用事务控制来解决这个问题,可能会遇到一些困难。原因是处理保存数据的页面和保存文档的页面通常是两个不同的servlet或action,这与事务机制并不完全符合。但是我们可以通过模拟实现一个“事务”,例如,在Session中设置一个变量来标识状态,比如用flag来表示,初始值为false。当数据保存成功时,将flag设置为true;保存失败时,flag为false。然后,在保存文件的页面中,根据flag的值来判断数据是否保存成功,从而进一步判断是否要保存文件。

          上次更新: 2025/07/21, 15:21:36
          PageOffice | Copyright © 2013-2026 卓正软件 京ICP备12010902号-2 京公网安备 11010502019270号
          • 跟随系统
          • 浅色模式
          • 深色模式
          • 阅读模式