springboot 整合eWebOffice
这里我用的是官方给的数据库,即编辑页面,是一个简单的demo,没有签章等功能,这个控件是需要购买的,不购买的话有试用版,但虽然可以用,但保存会有有使用字样的图片,而且外面的框上也会有使用字样。
网上没有相关使用资料及介绍,能找到的只有demo和API文档,所以写下这篇,给后面的人提供个思路。
1、将下载的试用版控件解压,
2、把jar包添加到本地仓库,方便后面我们用pom的方式
代码语言:javascript复制mvn install:install-file -DgroupId=com.sunnada.gaia -DartifactId=eWebOffice -Dversion=0.1 -Dpackaging=jar -Dfile=E:/eWebOfficeServer.jar3、把它的eWebOffice这个文件全部复制到resources的static下,SpringBoot默认读取,还有jquery,
4、配置application.properties
这里我们将eWebOffice的授权码放到配置文件里。
代码语言:javascript复制# orcle
spring.datasource.url=jdbc:oracle:thin:@******:orcl
spring.datasource.username= ***
spring.datasource.password= ***
spring.datasource.driverClassName = oracle.jdbc.OracleDriver
# 旧版的Oracle JDBC Driver Class :oracle.jdbc.driver.OracleDriver
# 新版的Oracle JDBC Driver Class :oracle.jdbc.OracleDriver
spring.datasource.hikari.maximum-pool-size=5
#缓存
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/page/
spring.thymeleaf.check-template-location=true
#调试日志打印
logging.level.com.sunnada.gaia.task.dao=DEBUG
#eWebOffice授权码
eWebOfficeLicense=***5、pom:
代码语言:javascript复制
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> src/main/resources/mybatis-generator.xml
我们可以简单的做两个页面,
第一个页面是文件列表,第二个页面是编辑页面
default.html
代码语言:javascript复制
| 名称 | 操作 |
| 编辑 |
documnet_edit.html
代码语言:javascript复制
//控件初始化事件
//标题栏、快捷工具栏、边框等界面相关设置可以在此事件中作,使得界面上不会有转变过程显现
//如:隐藏快捷工具栏。当访问此网页时,如在OnLoad中设,则会先显示出工具栏,再看到工具栏没了。如在OnInit中设,直接打开就看不到。没有这个变化过程。
eWebOfficeJS.SetWorkModeOnInit("eWebOffice1", [[${param.ms_Action}]]);
alert();
//文档打开后触发此事件
//在此事件中设置初始Office菜单、工具栏、痕迹、保护等。
eWebOfficeJS.SetWorkModeOnOpen("eWebOffice1", [[${param.ms_Action}]]);
var http = window.location.protocol;//协议
var ip = document.domain;//域名
var port = window.location.port;//端口
eWebOffice1.WebUrl = http+"//"+ip+":"+port+"/loadWord";
// eWebOffice1.WebUrl = "http://127.0.0.1:8080/loadWord";//加载文件的url
// alert("域名;"+document.domain);
// alert("端口:"+window.location.port);
// alert("协议:"+window.location.protocol);
eWebOffice1.RecordID = [[${param.recordId}]];
eWebOffice1.FileName = [[${param.fileName}]];
eWebOffice1.FileType = [[${param.fileType}]];
eWebOffice1.QuickBarVisible=true;//快捷工具栏是否显示
eWebOffice1.QuickBarFileVisible=true;//快捷工具栏下的文件操作相关功能按钮是否显示
eWebOffice1.QuickBarSkin="BLUE1";//设置工具栏皮肤
eWebOffice1.SetRibbonVisible("TabAddIns",false);//隐藏加载项
//本地保存,新建,打开按钮隐藏
eWebOffice1.SetQuickBarItemVisible("SYS_QB_LocalSave",false);//设置指定按钮是否可见
eWebOffice1.SetQuickBarItemVisible("SYS_QB_New",false);
eWebOffice1.SetQuickBarItemVisible("SYS_QB_Open",false);
eWebOffice1.FFSBVisible=false;//右上角的全屏按钮是否显示
eWebOffice1.RefreshQuickBar();//在设置按钮后要刷新才效果,
//使用下载到本地,再打开的方式,使用WebOpen方式会一直提示“无效文档”
// eWebOffice1.WebOpen();//这个方式不行,不能使用;不管是使用Word二进制还是字符串二进制都不能打开
//为保证浏览器不访问相同的url,在最后增加了时间戳
eWebOffice1.WebOpenFromUrl(http+"//"+ip+":"+port+"/getFile?recordId="+[[${param.recordId}]]+"&fileName="+[[${param.fileName}]]+"&timeStamp="+(new Date()).valueOf());
//s_Key: 为自定义按钮关键字,可以随便定义,不要与系统自带冲突即可,演示中为了区别,快捷工具栏上的按钮定义为"QB_"开头,Office文件菜单下的按钮定义为"File_"开头。
switch(s_Key){
case "QB_ViewThumbnails":
eWebOffice1.WebObject.Application.ActiveWindow.Thumbnails = true;
break;
case "QB_ViewDocumentMap":
eWebOffice1.WebObject.Application.ActiveWindow.DocumentMap = true;
break;
case "QB_ViewPage":
eWebOffice1.WebObject.Application.ActiveWindow.Thumbnails = false;
eWebOffice1.WebObject.Application.ActiveWindow.DocumentMap = false;
break;
case "QB_Print":
eWebOffice1.PrintDialog();
break;
case "QB_WebSave":
eWebOffice1.WebSave();
break;
}
function DoCheckSubmit(){
if (document.getElementById("d_subject").value==""){
alert("主题不能为空!");
return false;
}
if (document.getElementById("d_author").value==""){
alert("作者不能为空!");
return false;
}
try{
// return eWebOffice1.WebSave();
}catch(e){
alert("请选安装eWebOffice控件,再操作!");
return false;
}
}
eWebOfficeJS.Create("eWebOffice1", "100%", "700px");
重点代码是OnLoad()方法里的,文件打开的url、参数获取、及操作按钮工具栏设置等都在里面。
我的理解是这样的,控件本身也是有异步操作的。当我们在接收到第一个页面default.html的请求时,获取到各种参数,并在Init方法里初始化工具栏,我们也可以在Onload方法里设置,但是在Init方法里设置的,在页面显示到我们看到到最终都不会发生变化,但是在OnLoad方法里设置的,如果和Init方法里的不一样,本身加载文件也不会很快,所以按钮变化很明显。
在打开Word后,窗口的左上角有一个“全屏显示”的按钮,所以,我们可以把右上角的那个“全屏”按钮给隐藏,eWebOffice1.FFSBVisible=false;//右上角的全屏按钮是否显示
最后记得在所有设置完后调用:eWebOffice1.RefreshQuickBar();//在设置按钮后要刷新才效果,
才有效果。
7、然后是按钮设置。
按照自己的需求修改就可以了。
有一点我要提一下,就是js里的switch是严格比较,等价于“===”所有,我们在传入参数给s_WorkModeFlag时,我们知道是字符串,但是我们要明确他的类型,所以
8、页面基本设置完了,开始后台设置。
首先创建一个controller
代码语言:javascript复制package com.sunnada.gaia.task.controller;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sunnada.gaia.task.model.DocumentFile;
import com.sunnada.gaia.task.service.DocumentFileService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* eweboffice在线文档编辑
*
* @author 李瑞益
*/
@Controller
public class EwebOfficeTestController {
@Resource
private DocumentFileService documentFileService;
/**
* 默认页面
* @param model
* @return
*/
@GetMapping("/index")
public String index(Model model){
List
model.addAttribute("dataList",all);
return "default";
}
/**
* 跳转到编辑页面
* @param request
* @param response
* @return
*/
@GetMapping("/edit")
public String edit( HttpServletRequest request,HttpServletResponse response)
{
return "document_edit";
}
/**
* 使用下载本地打开的方式
* @param recordId
* @param fileName
* @param response
*/
@RequestMapping("/getFile")
public void getFile(String recordId,String fileName,HttpServletResponse response){
DocumentFile model = documentFileService.getByRecordId(recordId);
response.setContentType("ms-word");
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
OutputStream os = null;
try {
os = response.getOutputStream();
os.write(model.getdFilebody());
os.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(os != null)
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}然后是servlet;为什么我们要用servlet我在这里讲一下:
控件有一个方法WebMsgLoad(PageContext),我们后续那些获取参数设置参数都是以这个为前提。而这个PageContext是jsp的内置对象,所以我们只能构造他
代码语言:javascript复制package com.sunnada.gaia.task.controller;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ewebsoft.eweboffice.eWebOfficeServer;
import com.sunnada.gaia.task.model.DocumentFile;
import com.sunnada.gaia.task.service.DocumentFileService;
import com.sunnada.gaia.task.util.EWebOfficeUtil;
/**
*
*
* @author 李瑞益
*/
@WebServlet(urlPatterns = "/loadWord")
public class LoadFileServelt extends HttpServlet {
/**
* eWebOffice的授权码
*/
@Value("${eWebOfficeLicense}")
private String license;
@Resource
private DocumentFileService documentFileService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
eWebOfficeServer wos = new eWebOfficeServer();
wos.SetLicense(license);
//加载数据
if (!wos.WebMsgLoad(getPageContext(this,req,resp))) {
return;
}
//获取到前端的操作符,进行操作判断
//判断什么操作
String s_action = wos.WebMsgGetString("Action");
//加载数据我们不在这里做,
if (s_action.equals("SAVEFILE")) {
//保存文件
save(wos);
}
}
//
// /**
// * 该方法弃用
// * @param wos
// */
// public void loadFile(eWebOfficeServer wos,String recordId){
// DocumentFile model = documentFileService.getByRecordId(recordId);
// //设置文档名和类型
// if(model.getdFiletype() != null)
// wos.WebMsgSetString("fileType",model.getdFiletype());
// //设置文档数据
// wos.WebMsgSetStream("fileBoby",model.getdFilebody());
// //加载文件
wos.WebMsgSetFile("word","C:\\Users\\LI\\Desktop\\test5.doc");
write(model.getdFilebody());
// //文档加载状态
// wos.WebMsgStatus("TRUE", "文件加载成功!");
// //将服务端数据发送到前端
// wos.WebMsgSend();
// }
public void save(eWebOfficeServer wos){
String s_RecordID = wos.WebMsgGetString("RecordID");
byte[] a_FileBody = wos.WebMsgGetStream("FileBody");
wos.WebMsgClear();
DocumentFile documentFile = documentFileService.getByRecordId(s_RecordID);
documentFile.setdFilebody(a_FileBody);
int update = documentFileService.update(documentFile);
//测试写入
// testWrite(documentFileService.getByRecordId(s_RecordID).getdFilebody());
if (update > 0) {
wos.WebMsgStatus("true","保存成功");
}
}
/**
* 获取servlet的PageContext对象
* @param servlet servlet对象
* @param request 请求
* @param response 响应
* @return
*/
public PageContext getPageContext(Servlet servlet,HttpServletRequest request,HttpServletResponse response){
return JspFactory.getDefaultFactory().getPageContext(servlet,request,response,null,true,8192,true);
}
public void testWrite(byte[] data){
OutputStream os = null;
try {
os = new FileOutputStream("C:\\Users\\LI\\Desktop\\changeWord.doc");
os.write(data);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if(os != null)
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}最后不要忘了在主程序中加上servlet扫描
代码语言:javascript复制@SpringBootApplication
@MapperScan("com.sunnada.gaia.task.dao")
@ServletComponentScan("com.sunnada.gaia.task.controller")
public class Appliaction {
public static void main(String[] args){
SpringApplication.run(Appliaction.class);
}
}至此,简单的在线编辑结束。
最新发布
-
花简记审核要多久?
2025-10-24 08:24:33 -
《魔女小卡》盛夏狂欢庆典:魔法学院争霸赛暨2025年度限定皮肤免费送
2025-07-09 22:56:38 -
夏至未至
2025-10-30 02:30:45 -
少年歌行·幻音武林盛典——2025江湖新生季暨三周年全服庆典
2025-07-09 17:53:37 -
三国戏赵云传:虎卫降临,英雄集结!
2025-06-13 18:01:36 -
魔灵骑士:暗影觉醒——全服大狂欢
2025-04-13 00:21:53 -
降龙之刃:龙之试炼挑战赛
2025-06-07 16:40:09 -
《英雄与魔法》2025年春季盛典:英雄集结,魔法觉醒!
2025-04-14 21:33:10 -
2025年4月6日梦境守卫全球守护者集结特别活动:梦境守护者的终极试炼
2025-04-06 08:34:55 -
杭州皮肤清洁与洗头店大全,探寻最佳洗头好去处
2025-11-15 16:01:20