pageoffice xls预览_android 预览 xls - CSDN
精华内容
参与话题
  • 使用PageOffice实现文档(word,excel,pdf)在线预览编辑

    万次阅读 热门讨论 2017-10-31 20:14:29
    最近发现一款不错的插件的PageOffice,地址是:http://www.zhuozhengsoft.com/Technical/ 他可以实现word,excel、pdf在线预览以及在线编辑。虽然商用的话需要收费,但是有免费的试用版,在实现自己毕业设计或是做...
    最近发现一款不错的插件的PageOffice,地址是:http://www.zhuozhengsoft.com/Technical/  他可以实现word,excel、pdf在线预览以及在线编辑。虽然商用的话需要收费,但是有免费的试用版,在实现自己毕业设计或是做样品的时候 是一个不错的选择。他同时支持java\c#\php.一旦有了正真的项目花钱再买也可以。同时自己也可以熟悉如何使用。接着下面实现在线预览。
    首先自己需要安装PageOffice控件 目前最新版本是4.2 。下载地址是:http://www.zhuozhengsoft.com/dowm/ 其中包括实例代码。
    1、安装完后需要给自己的项目添加pageoffice4.jar 和java 添加jar包没有区别。
    2、启动的时候第一次使用试用版会弹出一个框,需要添加一些信息,有一个序列号在最后我写了。剩下 那个就是随便填写就可以。同时他会生成一个文件就是license.lic。他会在tomcat 项目部署的lib下。假如每次启动都需要添加的话。你就需要把tomcat 部署项目lib 里的license.lic 复制到你的本地项目中。
    3、预览后台代码:
    	public String openbar(HttpServletRequest request, HttpServletResponse response, @PathVariable int id,
    			@PathVariable int flag) {
    		// 设置PageOffice服务器组件
    		PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
    		request.setAttribute("poCtrl1", poCtrl1);
    		poCtrl1.setServerPage(request.getContextPath() + "/poserver.zz"); // 此行必须
    		poCtrl1.setTitlebar(false); // 隐藏标题栏(pageoffice的标题)
    		poCtrl1.setMenubar(false); // 隐藏菜单栏(文件一个设置)
    		poCtrl1.setOfficeToolbars(false);// 隐藏Office工具条(word 的编辑按钮)
    		// poCtrl1.setCustomToolbar(false);// 隐藏自定义工具栏(保存 关闭 全屏)
    		poCtrl1.addCustomToolButton("打印", "ShowPrintDlg()", 6);
    		poCtrl1.addCustomToolButton("全屏切换", "SwitchFullScreen()", 4);
    		poCtrl1.addCustomToolButton("关闭", "close", 21);
    		List<FileMeta> entity = fileMetaService.getList(getEntity(flag, id));
    		String path = ZipService.getPath(entity.get(0));
    		String realpath = path.replace("/", "\\\\");
    		String suffix = path.substring(path.lastIndexOf(".") + 1);
    		if ("doc".equals(suffix) || "docx".equals(suffix)) {
    			poCtrl1.webOpen(realpath, OpenModeType.docReadOnly, "张三");
    		} else if ("xls".equals(suffix) || "xlsx".equals(suffix)) {
    			poCtrl1.webOpen(realpath, OpenModeType.xlsReadOnly, "张三");
    		}
    		// 打开文件
    		return "OpenWord";
    	}

    4'、在线编辑:
    /**
    	 * 在线编辑
    	 * 
    	 * @param request
    	 * @param response
    	 * @param id
    	 * @param flag
    	 * @return
    	 */
    	@RequestMapping("openword/{flag}/{id}")
    	public String openword(HttpServletRequest request, HttpServletResponse response, @PathVariable int id,
    			@PathVariable int flag) {
    		PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
    		request.setAttribute("poCtrl", poCtrl);
    		poCtrl.setTitlebar(false);
    		// 设置服务页面
    		poCtrl.setServerPage(request.getContextPath() + "/poserver.zz");
    		// 添加保存按钮
    		poCtrl.addCustomToolButton("保存并关闭", "Save", 1);
    		poCtrl.addCustomToolButton("打印", "ShowPrintDlg()", 6);
    		poCtrl.addCustomToolButton("全屏切换", "SwitchFullScreen()", 4);
    		// 设置保存的action
    		poCtrl.setSaveFilePage(request.getContextPath() + "/wep/savefile/" + flag);
    		// 打开word
    		List<FileMeta> entity = fileMetaService.getList(getEntity(flag, id));
    		String path = ZipService.getPath(entity.get(0));
    		String realpath = path.replace("/", "\\\\");
    		String suffix = path.substring(path.lastIndexOf(".") + 1);
    		if ("doc".equals(suffix) || "docx".equals(suffix)) {
    			poCtrl.webOpen(realpath, OpenModeType.docNormalEdit, "张三");
    		} else if ("xls".equals(suffix) || "xlsx".equals(suffix)) {
    			poCtrl.webOpen(realpath, OpenModeType.xlsNormalEdit, "张三");
    		}
    		return "Word";
    	}

    5、在线编辑需要保存,所以有在线保存:
    /**
    	 * 保存
    	 * 
    	 * @param request
    	 * @param response
    	 * @param flag
    	 */
    	@RequestMapping("savefile/{flag}")
    	public void savefile(HttpServletRequest request, HttpServletResponse response, @PathVariable int flag) {
    		FileSaver fs = new FileSaver(request, response);
    		if (flag == 1) {// hse 保存路径
    			fs.saveToFile("D:\\Demo\\conhse\\" + fs.getFileName());
    		} else if (flag == 2) {
    			fs.saveToFile("D:\\Demo\\doc\\" + fs.getFileName());
    		} else if (flag == 3) {
    			fs.saveToFile("D:\\Demo\\hsequa\\" + fs.getFileName());
    		} else if (flag == 4) {
    			fs.saveToFile("D:\\Demo\\eva\\" + fs.getFileName());
    		} else if (flag == 5) {
    			fs.saveToFile("D:\\Demo\\leg\\" + fs.getFileName());
    		} else if (flag == 6) {
    			fs.saveToFile("D:\\Demo\\plan\\" + fs.getFileName());	
    		}
    		fs.close();
    	}
    6、web-xml配置
    <!-- PageOffice Begin -->
    	<servlet>
    		<servlet-name>poserver</servlet-name>
    		<servlet-class>com.zhuozhengsoft.pageoffice.poserver.Server</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>poserver</servlet-name>
    		<url-pattern>/poserver.zz</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>poserver</servlet-name>
    		<url-pattern>/sealsetup.exe</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>poserver</servlet-name>
    		<url-pattern>/posetup.exe</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>poserver</servlet-name>
    		<url-pattern>/pageoffice.js</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>poserver</servlet-name>
    		<url-pattern>/jquery.min.js</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>poserver</servlet-name>
    		<url-pattern>/pobstyle.css</url-pattern>
    	</servlet-mapping>
    	<servlet>
    		<servlet-name>adminseal</servlet-name>
    		<servlet-class>com.zhuozhengsoft.pageoffice.poserver.AdminSeal</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>adminseal</servlet-name>
    		<url-pattern>/adminseal.zz</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>adminseal</servlet-name>
    		<url-pattern>/loginseal.zz</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>adminseal</servlet-name>
    		<url-pattern>/sealimage.zz</url-pattern>
    	</servlet-mapping>
    	<mime-mapping>
    		<extension>mht</extension>
    		<mime-type>message/rfc822</mime-type>
    	</mime-mapping>
    	<context-param>
    		<param-name>adminseal-password</param-name>
    		<param-value>111111</param-value>
    	</context-param>
    	<!-- PageOffice End -->
    7、jsp配置

    <%@ page language="java"
    	import="java.util.*,com.zhuozhengsoft.pageoffice.*"
    	pageEncoding="UTF-8"%>
    <%
    	PageOfficeCtrl poCtrl = (PageOfficeCtrl) request.getAttribute("poCtrl");
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>最简单的打开保存Word文件</title>
    <!-- <script type="text/javascript" >
    function getPageOfficeJsUrl(){var d=document.URL;var c=d.substring(0,find(d,"/",3)+1);var a=d.substring(0,find(d,"/",4)+1);var f=new Array();f[0]=c;f[1]=a;for(var b=0;b<f.length;b++){var e="pageoffice.js";ajax({url:f[b]+"/pageoffice.js",type:"GET",data:{name:"super"},dataType:"json",success:function(h,k){if(d.indexOf("?")>0){d=d.substring(0,d.indexOf("?"))}var g=countChar(d.substring(f[b].length),"/");for(var i=0;i<g;i++){e="../"+e}alert('src="'+e+'"')},fail:function(g){}})}}function countChar(d,e){var b=0;for(var a=0;a<d.length;a++){if(d.charAt(a)==e){b++}}return b}function find(e,b,c){var a=0;for(var d=0;d<c;d++){a=e.indexOf(b,a+1)}return a}getPageOfficeJsUrl();function ajax(a){a=a||{};a.type=(a.type||"GET").toUpperCase();a.dataType=a.dataType||"json";var c=formatParams(a.data);if(window.XMLHttpRequest){var b=new XMLHttpRequest()}else{var b=new ActiveXObject("Microsoft.XMLHTTP")}b.onreadystatechange=function(){if(b.readyState==4){var d=b.status;if(d>=200&&d<300){a.success&&a.success(b.responseText,b.responseXML)}else{a.fail&&a.fail(d)}}};if(a.type=="GET"){b.open("GET",a.url+"?"+c,false);b.send(null)}else{if(a.type=="POST"){b.open("POST",a.url,false);b.setRequestHeader("Content-Type","application/x-www-form-urlencoded");b.send(c)}}}function formatParams(c){var a=[];for(var b in c){a.push(encodeURIComponent(b)+"="+encodeURIComponent(c[b]))}a.push(("v="+Math.random()).replace(".",""));return a.join("&")};
    </script> -->
    <script type="text/javascript" src="../../../jquery.min.js"></script>
    <script type="text/javascript" src="../../../pageoffice.js" id="po_js_main"></script>
    </head>
    <body>
    	<div style="width: 100%; height: 100%;">
    		<%=poCtrl.getHtmlCode("PageOfficeCtrl1")%>
    	</div>
    	<script type="text/javascript">
    		function Save() {
    			document.getElementById("PageOfficeCtrl1").WebSave();
    			POBrowser.closeWindow();//关闭POBrowser窗口
    		}
    		function ShowPrintDlg() {
    			document.getElementById("PageOfficeCtrl1").ShowDialog(4); //打印对话框
    		}
    		function SwitchFullScreen() {//全屏
    			document.getElementById("PageOfficeCtrl1").FullScreen = !document
    					.getElementById("PageOfficeCtrl1").FullScreen;
    		}
    	</script>
    </body>
    </html>

    注意:有时候jsp 和他的js 不在同一个目录, 这时候在jsp页面 使用<script type="text/javascript" >
    function getPageOfficeJsUrl(){var d=document.URL;var c=d.substring(0,find(d,"/",3)+1);var a=d.substring(0,find(d,"/",4)+1);var f=new Array();f[0]=c;f[1]=a;for(var b=0;b<f.length;b++){var e="pageoffice.js";ajax({url:f[b]+"/pageoffice.js",type:"GET",data:{name:"super"},dataType:"json",success:function(h,k){if(d.indexOf("?")>0){d=d.substring(0,d.indexOf("?"))}var g=countChar(d.substring(f[b].length),"/");for(var i=0;i<g;i++){e="../"+e}alert('src="'+e+'"')},fail:function(g){}})}}function countChar(d,e){var b=0;for(var a=0;a<d.length;a++){if(d.charAt(a)==e){b++}}return b}function find(e,b,c){var a=0;for(var d=0;d<c;d++){a=e.indexOf(b,a+1)}return a}getPageOfficeJsUrl();function ajax(a){a=a||{};a.type=(a.type||"GET").toUpperCase();a.dataType=a.dataType||"json";var c=formatParams(a.data);if(window.XMLHttpRequest){var b=new XMLHttpRequest()}else{var b=new ActiveXObject("Microsoft.XMLHTTP")}b.onreadystatechange=function(){if(b.readyState==4){var d=b.status;if(d>=200&&d<300){a.success&&a.success(b.responseText,b.responseXML)}else{a.fail&&a.fail(d)}}};if(a.type=="GET"){b.open("GET",a.url+"?"+c,false);b.send(null)}else{if(a.type=="POST"){b.open("POST",a.url,false);b.setRequestHeader("Content-Type","application/x-www-form-urlencoded");b.send(c)}}}function formatParams(c){var a=[];for(var b in c){a.push(encodeURIComponent(b)+"="+encodeURIComponent(c[b]))}a.push(("v="+Math.random()).replace(".",""));return a.join("&")};
    </script>
    就可以输出你本页面pageoffice.js具体位置。
    这就是简单的使用更详细具体需要去官网API看看。还有一些可以参考使用的,还有一些图标对应使用。
    PageOffice V4.0 标准版试用序列号:5LB6J-1JIL-XE8X-AYY44
    PageOffice V4.0 专业版试用序列号:I1I92-4M46-R6B2-E15TX
    PageOffice V4.0 企业版试用序列号:I7TGD-71VV-FYD8-4NMYP




    展开全文
  • PageOffice在线预览word/excel/ppt/pdf

    千次阅读 2019-08-23 12:24:00
    import com.zhuozhengsoft.pageoffice.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot...

    因为PageOffice集成了Thymeleaf,所以需要在resources目录下新建如下页面
    在这里插入图片描述
    Index.html点击预览操作页面

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
        <head>
            <title>Index</title>
            <script type="text/javascript" src="jquery.min.js"></script>
         	<script type="text/javascript" src="pageoffice.js" id="po_js_main"></script>
    
        </head>
        <body>
            <h1 th:inline="text">文件预览</h1>
            <a href="javascript:POBrowser.openWindowModeless('/word?filepath=/opt/oa/enclosure/notice/1.doc','width=1200px;height=800px;');">打开文件 </a>
        </body>
    </html>
    

    Word.html预览页面

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
        <head>
            <title>Hello World!</title>
            <script type="text/javascript">
              	function Save() {
                  	document.getElementById("PageOfficeCtrl1").WebSave();
            	}
            </script>
            <script type="text/javascript">
             function AddSeal() {
    			try{
            		  document.getElementById("PageOfficeCtrl1").ZoomSeal.AddSeal();
    			}catch (e){ };
            	}
      		</script>
            
        </head>
        <body>
            <h1 th:inline="text"></h1>
            <div style="width:1000px;height:700px;" th:utext="${pageoffice}"></div>
        </body>
    </html>
    

    在application.yml中配置thymleaf和PageOffice的许可证书和印章密码

    spring:
      application:
        name: test
      thymeleaf:
        prefix: classpath:/templates/
        suffix: .html
        cache: false
    posyspath: /home/version
    popassword: 111111
    

    在pom中添加所需依赖

     <!-- 添加Sqlite依赖(可选:如果不需要使用印章功能的话,不需要添加此依赖 )-->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.7.2</version>
        </dependency>
        <!-- 添加PageOffice依赖(必须) -->
        <dependency>
            <groupId>com.zhuozhengsoft</groupId>
            <artifactId>pageoffice</artifactId>
            <version>4.4.0.4</version>
        </dependency>
        <!-- thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    

    Controller层

    import com.zhuozhengsoft.pageoffice.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    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.UnsupportedEncodingException;
    import java.util.Map;
            
    /**
     * PageOffice在线预览
     */
    @RestController
    public class PageOfficeController {
        private Logger logger = LoggerFactory.getLogger(PageOfficeController.class);
    
        @Value("${posyspath}")
        private String poSysPath;
        @Value("${popassword}")
        private String poPassWord;
    
        @RequestMapping(value = "/index", method = RequestMethod.GET)
        public ModelAndView showIndex() {
            ModelAndView mv = new ModelAndView("Index");
            return mv;
        }
    
        /**
         * 打开文件
         *
         * @return
         */
        @RequestMapping("/word")
        public ModelAndView word(HttpServletRequest request, Map<String, Object> map, @RequestParam("filepath") String filepath) {
            //word、excel、ppt服务组件
            PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
            poCtrl.setServerPage("/poserver.zz");//设置服务页面
            poCtrl.setTitlebar(true); // 隐藏标题栏(pageoffice的标题)
            poCtrl.setMenubar(false); // 隐藏菜单栏(文件一个设置)
            poCtrl.setOfficeToolbars(false);// 隐藏Office工具条(word 的编辑按钮)
            poCtrl.setCustomToolbar(false);// 隐藏自定义工具栏(保存 关闭 全屏)
            //poCtrl.addCustomToolButton("保存","Save",1);//添加自定义保存按钮
            //poCtrl.addCustomToolButton("盖章","AddSeal",2);//添加自定义盖章按钮
            //poCtrl.setSaveFilePage("/save");//设置处理文件保存的请求方法
    
            //pdf服务组件
            PDFCtrl pdfCtrl = new PDFCtrl(request);
            pdfCtrl.setServerPage("/poserver.zz");
            pdfCtrl.setTitlebar(true); // 隐藏标题栏(pageoffice的标题)
            pdfCtrl.setMenubar(false); // 隐藏菜单栏(文件一个设置)
            pdfCtrl.setCustomToolbar(false);// 隐藏自定义工具栏(保存 关闭 全屏)
    
            //String path = path.replace("/", "\\\\");//windows路径转换 Windows下路径d:\\file\\test.doc Linux下路径"file://" + /home/mobileoa/files2019_05_28/test.doc
            String path = "file://"+filepath;
            logger.info("路径" + path);
            String suffix = path.substring(path.lastIndexOf(".") + 1);
            if ("doc".equals(suffix) || "docx".equals(suffix)||"DOC".equals(suffix) || "DOCX".equals(suffix)) {
                poCtrl.webOpen(path, OpenModeType.docReadOnly, "张三");
                map.put("pageoffice", poCtrl.getHtmlCode("PageOfficeCtrl1"));
            } else if ("xls".equals(suffix) || "xlsx".equals(suffix)||"XLS".equals(suffix) || "XLSX".equals(suffix)) {
                poCtrl.webOpen(path, OpenModeType.xlsReadOnly, "张三");
                map.put("pageoffice", poCtrl.getHtmlCode("PageOfficeCtrl1"));
            } else if ("ppt".equals(suffix) || "pptx".equals(suffix)||"PPT".equals(suffix) || "PPTX".equals(suffix)) {
                poCtrl.webOpen(path, OpenModeType.pptReadOnly, "张三");
                map.put("pageoffice", poCtrl.getHtmlCode("PageOfficeCtrl1"));
            } else if ("pdf".equals(suffix)||"PDF".equals(suffix)) {
                pdfCtrl.webOpen(path);
                map.put("pageoffice", pdfCtrl.getHtmlCode("PageOfficeCtrl1"));
            }
    
            ModelAndView mv = new ModelAndView("Word");
            return mv;
        }
    
    /**
     * 保存
     *
     * @return
     */
    @RequestMapping("/save")
    public void saveFile(HttpServletRequest request, HttpServletResponse response) {
        FileSaver fs = new FileSaver(request, response);
        fs.saveToFile("d:\\" + fs.getFileName());
        fs.close();
    }
    
    
    /**
     * 添加PageOffice的服务器端授权程序Servlet(必须)
     *
     * @return
     */
    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        com.zhuozhengsoft.pageoffice.poserver.Server poserver = new com.zhuozhengsoft.pageoffice.poserver.Server();
        poserver.setSysPath(poSysPath);//设置PageOffice注册成功后,license.lic文件存放的目录
        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;
    }
    
    /**
     * 添加印章管理程序Servlet(可选)
     *
     * @return
     */
    @Bean
    public ServletRegistrationBean servletRegistrationBean2() {
        com.zhuozhengsoft.pageoffice.poserver.AdminSeal adminSeal = new com.zhuozhengsoft.pageoffice.poserver.AdminSeal();
        adminSeal.setAdminPassword(poPassWord);//设置印章管理员admin的登录密码
        adminSeal.setSysPath(poSysPath);//设置印章数据库文件poseal.db存放的目录
        ServletRegistrationBean srb = new ServletRegistrationBean(adminSeal);
        srb.addUrlMappings("/adminseal.zz");
        srb.addUrlMappings("/sealimage.zz");
        srb.addUrlMappings("/loginseal.zz");
        return srb;
    }
    

    }

    展开全文
  • 背景:我们项目的文档是存放在fastdfs服务器上面的,现有需求需要实现将fastdfs上面的各种office文档在网站页面进行预览和编辑保存 方案:由于fastdfs目前是不支持文档的更新的,所以只能通过插入新文档,删除老文档...

    背景:我们项目的文档是存放在fastdfs服务器上面的,现有需求需要实现将fastdfs上面的各种office文档在网站页面进行预览和编辑保存

    方案:由于fastdfs目前是不支持文档的更新的,所以只能通过插入新文档,删除老文档的方式来实现,同时需要将原有数据库表中存储的文件uuid给更新掉,然后pageoffice只能支持文档在本服务器内的预览和编辑,因此需要在应用服务器中先下载fastdfs服务器中的文件,然后本地保存为临时文件,然后给pageoffice预览编辑,保存后再通过删除和插入来更新fastdfs的文件,从而达到目的。

    补充:需要定时清理由此产生的应用服务器下载的临时文件

    大部分代码可以参考pageoffice官网文档中的

    PageOffice 4.5 for JAVA (同时支持IEChromeFirefox)

    PageOffice 4.5 for Spring Boot[示例代码]

    放代码:

    pageoffice初始配置类

    @Configuration
    public class PageOfficeConfiguration {

        /**
         * 添加PageOffice的服务器端授权程序Servlet(必须)
         */
        @Bean
        public ServletRegistrationBean servletRegistrationBean() {
            com.zhuozhengsoft.pageoffice.poserver.Server poserver = new com.zhuozhengsoft.pageoffice.poserver.Server();
            //设置PageOffice注册成功后,license.lic文件存放的目录
            //服务器可以存放在/geelyapp/pageoffice
            poserver.setSysPath("d:\\lic\\");
            ServletRegistrationBean srb = new ServletRegistrationBean(poserver);
            srb.addUrlMappings("/xx/pageoffice/poserver.zz");
            srb.addUrlMappings("/xx/pageoffice/posetup.exe");
            srb.addUrlMappings("/xx/pageoffice/pageoffice.js");
            srb.addUrlMappings("/xx/pageoffice/jquery.min.js");
            srb.addUrlMappings("/xx/pageoffice/pobstyle.css");
            srb.addUrlMappings("/xx/pageoffice/sealsetup.exe");
             return srb;// 
        }
    }

    应用controller类

    @Controller
    @RequestMapping("/xx/pageoffice")
    @Api(value = "文档在线编辑接口")
    public class PageOfficeController {
        @Value("${pageoffice.path.doc:'D:/doc/'}")
        private String pageofficeDocPath;
        
        @Autowired
        private StorageService storageService;//fastdfs封装服务类
        @Autowired
        private ICommonUtilService commonUtilService;
        
        private static final Logger LOGGER = LoggerFactory.getLogger(PageOfficeController.class);
        
        @RequestMapping(value="/index", method=RequestMethod.GET)
        public ModelAndView showIndex(
            @ApiParam(name = "busi", required = true, value = "业务代码")
            @RequestParam(name = "busi", required = true) String busi,
            @ApiParam(name = "filePath", required = true, value = "文件远程路径(相对路径,不是包含http的全路径)")
            @RequestParam(name = "filePath", required = true) String filePath,
            Map<String,Object> map) {
            map.put("busi",busi);
            map.put("filePath",filePath);
            ModelAndView mv = new ModelAndView("Index");
            return mv;
        }
        
    @RequestMapping(value="/word", method=RequestMethod.GET)
        public ModelAndView showWord(HttpServletRequest request, Map<String,Object> map,
                @ApiParam(name = "busi", required = false, value = "业务代码")
                @RequestParam(name = "busi", required = false) String busi,
                @ApiParam(name = "filePath", required = false, value = "文件远程路径(相对路径,不是包含http的全路径)")
                @RequestParam(name = "filePath", required = false) String filePath){
            String[] param = busi.split("%");//这里因为使用&符合传递多个参数时会导致被编译为&amp;导致无法调用成功
            busi = param[0];
            filePath = param[2];
    //        pageofficeDocPath = "D:\\doc\\"; //本地开发环境时可使用
            String[] filePathArr = filePath.split("/");
            String url = pageofficeDocPath+filePathArr[filePathArr.length-1];
            LOGGER.info("showWord url:"+url);
            File tmpFile = new File(url);
            try (FileOutputStream fos = new FileOutputStream(tmpFile)){
                fos.write(this.storageService.readFileContent(filePath));
            } catch (Exception e) {
                LOGGER.error("预览临时文件生成错误",e);
                throw BusinessException.withErrorCode(Errors.System.ILLEAGAL_DATA);
            }
            //--- PageOffice的调用代码 开始 -----
            PageOfficeCtrl poCtrl=new PageOfficeCtrl(request);
            poCtrl.setServerPage("/xx/pageoffice/poserver.zz");//设置授权程序servlet
            poCtrl.addCustomToolButton("保存","Save",1); //添加自定义按钮
            poCtrl.setSaveFilePage("/xx/pageoffice/save?filePath="+filePath+"&busi="+busi+"&url="+url);//设置保存时的action
            String prefix = "file://";//linux服务器查找文件需要额外前缀
            url = prefix + url;
            LOGGER.info("showWord pageoffice url:"+url);
            if(filePath.endsWith(".doc")||filePath.endsWith(".docx")) {
                poCtrl.webOpen(url,OpenModeType.docAdmin,SessionContextUtil.getSrmUserName());
            }else if(filePath.endsWith(".xls")||filePath.endsWith(".xlsx")) {
                poCtrl.webOpen(url,OpenModeType.xlsNormalEdit,SessionContextUtil.getSrmUserName());
            }else if(filePath.endsWith(".ppt")||filePath.endsWith(".pptx")) {
                poCtrl.webOpen(url,OpenModeType.pptNormalEdit,SessionContextUtil.getSrmUserName());
            }
            map.put("pageoffice",poCtrl.getHtmlCode("PageOfficeCtrl1"));
            //--- PageOffice的调用代码 结束 -----
            ModelAndView mv = new ModelAndView("Word");
            return mv;
        }
        
        @RequestMapping("/save")
        public void saveFile(HttpServletRequest request, HttpServletResponse response,
            @ApiParam(name = "busi", required = true, value = "业务代码")
            @RequestParam(name = "busi", required = true) String busi,
            @ApiParam(name = "url", required = false, value = "临时文件url")
            @RequestParam(name = "url", required = false) String url,
            @ApiParam(name = "filePath", required = true, value = "文件远程路径(相对路径,不是包含http的全路径)")
            @RequestParam(name = "filePath", required = true) String filePath){
            FileSaver fs = new FileSaver(request, response);
            //由于fastdfs并不支持文件更新
            //目前考虑删除原有的文件,重新生成文件
            //TODO 后面可以考虑支持文件的更新,即框架来做删除插入,并且新插入的uuid需要跟删除的一致
            String newCode = this.storageService.store(fs.getFileName(), fs.getFileStream());
            //将原来业务表中的文档uuid更新
            commonUtilService.updateFilePath(busi,filePath,newCode);
            this.storageService.delete(filePath);
    //        fs.saveToFile(url);
            fs.close();

            File tmpFile = new File(url);
            tmpFile.delete();
        }
    }

    Index.ftl

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title>Index</title>
            <script type="text/javascript" src="jquery.min.js"></script>
             <script type="text/javascript" src="pageoffice.js" id="po_js_main"></script>

        </head>
        <body>
            <h1>PageOffice预览准备</h1>
            
            <a href="javascript:POBrowser.openWindowModeless('/xx/pageoffice/word?busi=${busi}%filePath%${filePath}','width=1200px;height=800px;');">打开文件 </a>
        </body>
    </html>

    Word.ftl

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title>Hello World!</title>
            <script type="text/javascript">
                  function Save() {
                      document.getElementById("PageOfficeCtrl1").WebSave();
                }
            </script>
            <script type="text/javascript">
             function AddSeal() {
                try{
                      document.getElementById("PageOfficeCtrl1").ZoomSeal.AddSeal();
                }catch (e){ };
                }
              </script>
        </head>
        <body>
            <div style="width:1000px;height:700px;">${pageoffice}</div>
        </body>
    </html>

    转载于:https://my.oschina.net/ffse54s/blog/3095160

    展开全文
  • 一、前言 二、 三、 注册成功后,正常打开Word文件,之后就可以进行自己的神操作了…

    一、前言

    1. PageOffice官网: http://www.zhuozhengsoft.com/
    2. PageOffice集成说明: https://www.kancloud.cn/pageoffice_course_group/pageoffice_course/652260
    准备集成环境

    下载jar依赖:http://www.zhuozhengsoft.com/dowm/
    在这里插入图片描述
    在这里插入图片描述

    二、SpringBoot整合PageOffice实现在线编辑Word和Excel

    本文基于springboot2.3.1.RELEASE版本集成pageoffice

    1、pom.xml中新增相关依赖

    将下载的jar依赖放进项目的lib包下 ( 注:这里也可以自定义存放位置,然后修改本地引入位置${project.basedir}/lib/pageoffice4.6.0.4.jar即可 )
    在这里插入图片描述

    <!-- =================================== ↓↓↓↓↓↓ PageOffice所需依赖 start ↓↓↓↓↓↓ ==================================== -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
    <!-- 添加Sqlite依赖(可选:如果不需要使用印章功能的话,不需要添加此依赖)-->
    <dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.7.2</version>
    </dependency>
    <!-- 添加PageOffice依赖(必须) -->
    <dependency>
      <groupId>com.zhuozheng</groupId>
      <artifactId>pageoffice</artifactId>
      <version>4.6.0.4</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/lib/pageoffice4.6.0.4.jar</systemPath>
    </dependency>
    <!-- =================================== ↑↑↑↑↑↑ PageOffice所需依赖 end ↑↑↑↑↑↑ ==================================== -->
    

    本地jar包引入需再新增如下,可参考文末源码demo
    在这里插入图片描述

    2、application.yml中新增pageoffice配置

    spring:
      # THYMELEAF (ThymeleafAutoConfiguration)
      thymeleaf:
        prefix: classpath:/templates/
        suffix: .html
        cache: false
    
    # ======================== ↓↓↓↓↓↓ PageOffice相关配置 ↓↓↓↓↓↓ ===============================
    pageoffice:
      # 本地文件所在磁盘位置
      docpath: /pageoffice/doc/
      # 设置PageOffice自带印章管理程序的登录密码
      popassword: 123456
      # 指定一个磁盘目录用来存放PageOffice注册成功之后生成的license.lic文件
      posyspath: /pageoffice/lic/
    

    3、resources/templates下新增如下3个文件

    在这里插入图片描述

    ① Excel.html
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
      <title>打开Excel文件</title>
      <script type="text/javascript">
        function Save() {
          document.getElementById("PageOfficeCtrl1").WebSave();
        }
      </script>
      <script type="text/javascript">
        function AddSeal() {
          try {
            document.getElementById("PageOfficeCtrl1").ZoomSeal.AddSeal();
          } catch (e) {
          }
        }
      </script>
    
    </head>
    <body>
    <div style="width:auto;height:700px;" th:utext="${pageoffice}"></div>
    </body>
    </html>
    
    ② Word.html
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
      <title>打开Word文件</title>
      <script type="text/javascript">
        function Save() {
          document.getElementById("PageOfficeCtrl1").WebSave();
        }
    
      </script>
      <script type="text/javascript">
        function AddSeal() {
          try {
            document.getElementById("PageOfficeCtrl1").ZoomSeal.AddSeal();
          } catch (e) {
          }
        }
      </script>
    
    </head>
    <body>
    <div style="width:auto;height:700px;" th:utext="${pageoffice}"></div>
    </body>
    </html>
    
    ③ index.html
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>HelloWorld</title>
      <style>
        #main {
          width: 15%;
          text-align: center;
        }
    
        ol {
          text-align: left;
          border: solid 1px gray;
        "
        }
    
        ol li {
          text-align: left;
          border-bottom: dotted 1px gray;
          height: 30px;
          margin-top: 10px;
        }
      </style>
      <!-- 引用后端项目中的pageoffice.js文件 -->
      <script type="text/javascript" src="http://localhost:8080/pageoffice.js"></script>
    </head>
    <body>
    <div id="main">
      <h3>HelloWorld</h3>
      <ol>
        <li>
          <!-- openWindowModeless用法参考:http://www.zhuozhengsoft.com/help/js3/pobrowser/function/openwindowmodeless.htm -->
          <a href="javascript:POBrowser.openWindowModeless('http://localhost:8080/api/word','width=1200px;height=800px;');">打开Word文档</a>
        </li>
        <li>
          <a href="javascript:POBrowser.openWindowModeless('http://localhost:8080/api/excel','width=1200px;height=800px;');">打开Excel文档</a>
        </li>
      </ol>
    </div>
    </body>
    </html>
    

    4、全局常用变量

    public class Constants {
        /**
         * 项目根目录
         */
        public static final String PROJECT_ROOT_DIRECTORY = System.getProperty("user.dir");
        /**
         * word文件名
         */
        public static final String FILE_NAME_WORD = "test.doc";
        /**
         * excel文件名
         */
        public static final String FILE_NAME_EXCEL = "test.xls";
    }
    

    5、编写测试Controller

    @Slf4j
    @RestController
    @RequestMapping("/api")
    public class DemoController {
    
        @Value("${pageoffice.posyspath}")
        private String poSysPath;
    
        @Value("${pageoffice.popassword}")
        private String poPassWord;
    
        @Value("${pageoffice.docpath}")
        private String docPath;
    
        /**
         * 被`@PostConstruct`修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
         */
        @PostConstruct
        public void init() {
            poSysPath = Constants.PROJECT_ROOT_DIRECTORY + poSysPath;
            docPath = Constants.PROJECT_ROOT_DIRECTORY + docPath;
        }
    
        @RequestMapping("/hello")
        public String hello() {
            log.info("hello ...");
            return "HelloWorld~";
        }
    
        @RequestMapping(value = "/word", method = RequestMethod.GET)
        public ModelAndView showWord(HttpServletRequest request, Map<String, Object> map) {
            log.info("编辑word ...");
            PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
            // 设置服务页面
            poCtrl.setServerPage("/poserver.zz");
            // 添加自定义保存按钮
            poCtrl.addCustomToolButton("保存", "Save", 1);
            // 添加自定义盖章按钮
            poCtrl.addCustomToolButton("盖章", "AddSeal", 2);
            // 拿到请求前缀做拼接保存文件方法
            String requestApiPrefix = request.getServletPath().replace("/word", "");
            // 设置处理文件保存的请求方法
            poCtrl.setSaveFilePage(requestApiPrefix + "/save");
            // 打开word
            poCtrl.webOpen("file://" + docPath + Constants.FILE_NAME_WORD, OpenModeType.docAdmin, "张三");
            map.put("pageoffice", poCtrl.getHtmlCode("PageOfficeCtrl1"));
    
            ModelAndView mv = new ModelAndView("Word");
            return mv;
        }
    
        @RequestMapping(value = "/excel", method = RequestMethod.GET)
        public ModelAndView showExcel(HttpServletRequest request, Map<String, Object> map) {
            log.info("编辑excel ...");
            PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
            // 设置服务页面
            poCtrl.setServerPage("/poserver.zz");
            // 添加自定义保存按钮
            poCtrl.addCustomToolButton("保存", "Save", 1);
            // 添加自定义盖章按钮
            poCtrl.addCustomToolButton("盖章", "AddSeal", 2);
            // 拿到请求前缀做拼接保存文件方法
            String requestApiPrefix = request.getServletPath().replace("/excel", "");
            // 设置处理文件保存的请求方法
            poCtrl.setSaveFilePage(requestApiPrefix + "/save");
            // 打开word
            poCtrl.webOpen("file://" + docPath + Constants.FILE_NAME_EXCEL, OpenModeType.xlsNormalEdit, "张三");
            map.put("pageoffice", poCtrl.getHtmlCode("PageOfficeCtrl1"));
    
            ModelAndView mv = new ModelAndView("Excel");
            return mv;
        }
    
        @RequestMapping("/save")
        public void saveFile(HttpServletRequest request, HttpServletResponse response) {
            log.info("保存文件 ...");
            FileSaver fs = new FileSaver(request, response);
            fs.saveToFile(docPath + fs.getFileName());
            fs.close();
        }
    
        /**
         * 添加PageOffice的服务器端授权程序Servlet(必须)
         *
         * @return
         */
        @Bean
        public ServletRegistrationBean servletRegistrationBean() {
            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;
        }
    
        /**
         * 添加印章管理程序Servlet(可选)
         */
        @Bean
        public ServletRegistrationBean servletRegistrationBean2() {
            com.zhuozhengsoft.pageoffice.poserver.AdminSeal adminSeal =
                new com.zhuozhengsoft.pageoffice.poserver.AdminSeal();
            // 设置印章管理员admin的登录密码
            adminSeal.setAdminPassword(poPassWord);
            // 设置印章数据库文件poseal.db存放的目录
            adminSeal.setSysPath(poSysPath);
            ServletRegistrationBean srb = new ServletRegistrationBean(adminSeal);
            srb.addUrlMappings("/adminseal.zz");
            srb.addUrlMappings("/sealimage.zz");
            srb.addUrlMappings("/loginseal.zz");
            return srb;
        }
    }
    

    6、准备测试word和excel文件

    注意将测试word和excel文件(文件不能为0字节)放在项目根目录/pageoffice/doc目录下,以及新建lic文件夹…

    在这里插入图片描述

    三、测试

    访问http://localhost:8080/,点击打开Word文档
    在这里插入图片描述
    第一次使用的时候会提示安装PageOffice,直接下一步安装即可~

    可参考PageOffice客户端安装步骤:https://www.kancloud.cn/pageoffice_course_group/pageoffice_course/654031

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    安装完成之后回到页面再次点击打开Word文档,这时候需要填写注册信息,序列号在之前下载的包里面可以找到
    在这里插入图片描述
    在这里插入图片描述
    注册成功后,正常打开Word文件,之后就可以进行自己的神操作了…
    在这里插入图片描述
    打开Excel文档如下:
    在这里插入图片描述

    四、Vue页面集成PageOffice

    1、项目的index.html中引入pageoffice.js

    <!-- 引用后端项目中的pageoffice.js文件 -->
    <script type="text/javascript" src="http://localhost:8080/pageoffice.js"></script>
    

    2、页面

    <template>
      <div class="app-container">
        <el-button><a href="javascript:POBrowser.openWindowModeless('http://localhost:8080/api/word','width=1200px;height=800px;');">打开Word文档</a></el-button>
        <el-button><a href="javascript:POBrowser.openWindowModeless('http://localhost:8080/api/excel','width=1200px;height=800px;');">打开Excel文档</a></el-button>
      </div>
    </template>
    <style lang="scss" scoped></style>
    

    这里页面很简单就2个按钮…
    在这里插入图片描述
    主要通过openWindowModeless 使用非模态框的形式打开文件

    用法可参考:http://www.zhuozhengsoft.com/help/js3/pobrowser/function/openwindowmodeless.htm

    3、后端解决前后端分离情况下跨域问题

    @Configuration
    public class CorsConfig {
    
        private CorsConfiguration config() {
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            corsConfiguration.setAllowCredentials(true);
            // ① 设置你要允许的网站域名,如果全允许则设为 *
            corsConfiguration.addAllowedOrigin("*");
            // corsConfiguration.addAllowedOrigin("http://www.zhengqingya.com");
            // ② 如果要限制 HEADER 或 METHOD 请自行更改
            corsConfiguration.addAllowedHeader("*");
            corsConfiguration.addAllowedMethod("*");
            return corsConfiguration;
        }
    
        @Bean
        public CorsFilter corsFilter() {
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", config());
            return new CorsFilter(source);
        }
    
    }
    

    五、问题 -> 使用Pageoffice打开Word时报0x80040154错误

    问题出现可能原因:安装WPS时关联了.doc.xls.ppt等文件,导致Office无法自动关联

    解决:

    1. 想办法去掉默认关联
    2. 直接卸载WPS
    3. 自行谷歌

    本文案例demo源码

    https://gitee.com/zhengqingya/java-workspace

    展开全文
  • 超详细的OpenOffice实现前端在线预览office文档记录 最近搞一个数字化共享平台,是一个java web项目,使用框架ssm,其中项目有一个需要在线预览PDF、excle、ppt、word文件的功能,也是各种谷歌百度,乱七八糟,要么...
  • php 在线预览office 相关文档

    千次阅读 2020-07-06 14:22:20
    若不使用第三方的软件,类如卓正公司的PageOffice等专业工具,要想实现在自己平台上word,excel,ppt,pdf等格式的在线预览。推荐使用一些方法。 1.Excel 引用第三方的平台,通过调用地址,传入地址的方式来预览文件...
  • java实现office文件预览

    2019-04-30 00:47:42
    不知觉就过了这个久了,继上篇java实现文件上传下载后,今天给大家分享一篇java实现的对office文件预览功能。 相信大家在平常的项目中会遇到需要对文件实现预览功能,这里不用下载节省很多事。大家请擦亮眼睛下面...
  • SpringBoot PageOffice 在线编辑 (完整版、有源码)

    千次阅读 热门讨论 2019-05-28 10:26:31
    文章目录简介实例环境准备生成license.lic文件把jar安装到maven使项目能够使用maven引入pom.xml 配置application.properties配置项目结构、代码介绍项目结构:BeanLinitConf类说明,PageOffice注入OfficeOnlineApi类...
  • 首先自己需要安装PageOffice控件 目前最新版本是4.2 。下载地址是:http://www.zhuozhengsoft.com/dowm/ 其中包括实例代码。 1、安装完后需要给自己的项目添加pageoffice4.jar 和java 添加jar包没有区别...
  • 在线预览Office(可另存图片)

    千次阅读 2017-06-21 11:18:36
    支持的文件类型包括pdf,xls,xlsx,ppt,pptx,docx,doc,Cache.cs:using System; using System.Runtime.Caching; using Newtonsoft.Json.Linq;namespace Online.Core { /// /// 缓存框架 /// </summary>
  • vue项目前端预览pdf、doc、xls

    千次阅读 2020-04-24 14:42:49
    预览pdf、doc、xlsoffice online私人文档预览云服务pdfdocxls office online 微软office平台提供的文档预览服务 https://view.officeapps.live.com/op/view.aspx?src+文档地址 文档地址必须是域名80端口且公开访问 ...
  • 也许Java天生不适合处理Office文件吧,POI的使用一堆问题,现在SpringMVC+Spring+Mybatis的web项目想实现在线预览也是问题一大堆。马的,开始时打算使用OpenOffice+SWFTools+FlexPaper的,但是该方案是使用flash的,...
  • 一、服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件,然后再利用免费的swftools.exe工具生成swf格式的Flash文件,...
  • 网上找了很多相关文档,也爬过很多坑,现在基于最新版本的软件(OpenOffice 4.1.3)和jar(Jodconverter Core--4.0.0-RELEASE)包整理出一份可以实现office文件预览功能,供参考。(linux环境安装linux版本的openoffice,...
  • 1、开发前准备  1)下载第三方软件或插件进行安装  openOffice:官方下载:http://www.openoffice.org/download/  百度网盘:http://pan.baidu.com/s/1mpxdL    swftools:官方下载:...
  • 附件在线预览控件实现的市场调研

    万次阅读 多人点赞 2019-07-31 18:40:08
    附件在线预览控件实现的市场调研
1 2 3 4 5 ... 20
收藏数 487
精华内容 194
关键字:

pageoffice xls预览