背景

Confluence是现在广泛使用的团队协作文档系统。虽然自身带了一些表格编辑功能,但表格的整体功能较弱,比如不能通过Excel文件进行导入导出,表格在复制到Excel时格式会比较奇怪等等。对于未完全整合流程到Confluence上的团队,信息从Excel到在线文档系统的流转是个巨大的工作量。

介绍

Elements Spreadsheet作为Confluence的插件可以有效的解决上面的部分问题,通过这个插件可以接近完美导入导出Excel到Confluence系统中(试了Excel太大的话会莫名其妙的编辑中崩溃),Excel文档可以完美嵌入到Confluence的网页中,同时支持在线编辑与占用提示,公式等等功能,参考Confluence的介绍与文档。Elements Spreadsheet for Confluence | Atlassian Marketplace

安装步骤

整个安装步骤参考Confluence安装Drawio插件 - MrHeartTired (ltang.me)

  1. 首先在官方链接下载当前版本支持的插件。(前面的官方链接进入Version页面选择)

  2. 其次,再IDE(Idea)中新建如下文件与对应的包目录:

AbstractSpreadsheetRestService.java文件与对应的包目录。


package com.valiantys.software.spreadsheets.rest; import com.atlassian.upm.api.license.PluginLicenseManager;
import com.valiantys.software.spreadsheets.rest.model.ErrorModel;
import com.valiantys.software.spreadsheets.service.error.ErrorType;
import com.valiantys.software.spreadsheets.service.error.SpreadsheetError; import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status; public abstract class AbstractSpreadsheetRestService {
public static final String ATLASSIAN_DEV_MODE = "atlassian.dev.mode";
private final PluginLicenseManager pluginLicenseManager; protected AbstractSpreadsheetRestService(PluginLicenseManager pluginLicenseManager) {
this.pluginLicenseManager = pluginLicenseManager;
} protected boolean isLicenseValid() {
return true;
} private boolean isDevMode() {
String devMode = System.getProperty("atlassian.dev.mode");
return Boolean.parseBoolean(devMode);
} protected ErrorModel toErrorModel(SpreadsheetError error) {
return new ErrorModel(error.getMessage());
} protected Response toResponse(SpreadsheetError error) {
ErrorType type = error.getType();
if (type == ErrorType.DATA_CONVERSION_ERROR) {
return Response.status(Status.BAD_REQUEST).entity(new ErrorModel(error.getMessage())).build();
} else if (type == ErrorType.FORBIDDEN) {
return Response.status(Status.FORBIDDEN).entity(new ErrorModel(error.getMessage())).build();
} else if (type == ErrorType.MISSING_DATA) {
return Response.status(Status.NOT_FOUND).entity(new ErrorModel(error.getMessage())).build();
} else {
return type == ErrorType.INVALID_REQUEST ? Response.status(Status.BAD_REQUEST).entity(new ErrorModel(error.getMessage())).build() : Response.status(Status.INTERNAL_SERVER_ERROR).entity(new ErrorModel(error.getMessage())).build();
}
} protected String getCharset(HttpServletRequest request) {
String characterEncoding = request.getCharacterEncoding();
return characterEncoding == null ? "UTF-8" : characterEncoding;
}
}

ErrorModel文件与对应的包目录

package com.valiantys.software.spreadsheets.rest.model;  

public class ErrorModel {  

    private String message;  

    public ErrorModel() {
} public ErrorModel(String message) {
this.message = message;
} public String getMessage() {
return this.message;
} public void setMessage(String message) {
this.message = message;
}
}

ErrorType文件与对应的包目录

package com.valiantys.software.spreadsheets.service.error;  

public enum ErrorType {
DATA_CONVERSION_ERROR,
FORBIDDEN,
INVALID_REQUEST,
INTERNAL_ERROR,
MISSING_DATA; private ErrorType() {
}
}

SpreadsheetError文件与对应的包目录

package com.valiantys.software.spreadsheets.service.error;  

import javax.ws.rs.core.Response;  

public class SpreadsheetError {
private ErrorType type;
private String message; public SpreadsheetError() {
} public SpreadsheetError(ErrorType type) {
this.type = type;
} public SpreadsheetError(ErrorType type, String message) {
this.type = type;
this.message = message;
} public static SpreadsheetError build(ErrorType type) {
return new SpreadsheetError(type);
} public static SpreadsheetError build(ErrorType type, String message) {
return new SpreadsheetError(type, message);
} public ErrorType getType() {
return this.type;
} public void setType(ErrorType type) {
this.type = type;
} public String getMessage() {
return this.message;
} public void setMessage(String message) {
this.message = message;
} public String toString() {
return "Error " + this.type.name() + ": " + this.message;
} public Response build() {
return null;
}
}

这一步中只有第一个AbstractSpreadsheetRestService编译出来的的class文件是需要的,其他只是为了解决编译报错。

  1. 在刚安装的jdk环境下,以下两个包会提示找不到,这两个包理论上是可以直接导入的
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

但是由于我对java不太熟悉,java环境都是新装的,所以这两个包我也是按步骤1的方式,补的文件用来编译。

Response文件与对应的包目录。


package javax.ws.rs.core; import java.lang.annotation.Annotation;
import java.net.URI;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set; public abstract class Response {
protected Response() {
} public static ResponseBuilder status(Status status) {
return null;
} public interface StatusType { } public enum Status implements Response.StatusType { BAD_REQUEST,
FORBIDDEN,
NOT_FOUND,
INTERNAL_SERVER_ERROR, }
}

ResponseBuilder文件与包目录。

package javax.ws.rs.core;  

import com.valiantys.software.spreadsheets.rest.model.ErrorModel;
import com.valiantys.software.spreadsheets.service.error.SpreadsheetError; public class ResponseBuilder { public SpreadsheetError entity(ErrorModel errorModel) {
return null;
}
}

不要在意具体的代码逻辑与包关系,目的只是为了编译AbstractSpreadsheetRestService.class。同样PluginLicenseManagerLicenseService也需要像参考文章一样补出,这里由于没有代码就不列出来了。

替换与安装

文件编辑完成后,使用7z打开elements-spreadsheet.obr文件,替换AbstractSpreadsheetRestService.class文件并保存。然后按参考文章的方式上传到Confluence安装即可(使用管理员账号登录confluence,找到插件管理 -> 上传插件 -> 选择修改后的obr包,点击上传)。安装成功后,虽然显示试用,但是这时候就已经可以在Confluence中导入并保存Excel文件了,真实的试用状态下Excel导入后是无法保存的。到此安装完成,可以尽情在网页中编辑Excel了。

Confluence的Excel插件Elements Spreadsheet安装的更多相关文章

  1. 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂安装过程详解及安装失败解决方法

    因Excel催化剂用了VSTO的开发技术,并且为了最好的用户体验,用了Clickonce的布署方式(无需人工干预自动更新,让用户使用如浏览器访问网站一般,永远是最新的内容和功能).对安装过程有一定的难 ...

  2. 如何在Excel里安装excel插件?

    随着科技的发展,人们对数据分析的要求越来越多, Excel也存在一些问题,长期困扰一线业务用户:首先是性能问题.对于大数据量,Excel处理起来很慢.数据获取的过程麻烦,特别是周期性的数据获取,每次都 ...

  3. django入门8之xadmin引入富文本和excel插件

    django入门8之xadmin引入富文本和excel插件 Xadmin引入富文本 插件的文档 https://xadmin.readthedocs.io/en/docs-chinese/make_p ...

  4. 不需要高价购买BI工具,掌握这个Excel插件就能碾压大数据

    ​曾几何时,EXCEL在数据界可谓是独树一帜,引领风骚,在职场中无人不知,无人不晓.但是随着大数据的出现,EXCEL便风光不再,江河日下,一度被其他大数据工具挤到了后面,逐渐被边缘化了.而我是一个EX ...

  5. vim插件ctags的安装和使用

    vim插件ctags的安装和使用 2013-11-19 20:47 17064人阅读 评论(0) 收藏 举报  分类: 开发工具(3)  linux编程(9)  c/c++编程(11)  版权声明:本 ...

  6. NSIS:使用PassDialog插件实现密码安装(卸载)功能

    原文 NSIS:使用PassDialog插件实现密码安装(卸载)功能 有时,出于特殊的需求,我们要给安装或卸载程序加一个密码,只有输入了正确的密码才可以继续.比如: 下面我们使用插件来实现安装密码: ...

  7. IDEA翻译插件推荐Translation 安装和使用以及快捷键绑定

    首先第一步是安装该插件 如图: File -> setting -->plugins 进入该页面,点击如图所示按钮. 然后搜索 Translation 如图: 我们需要的结果一般都不会排在 ...

  8. vim学习、各类插件配置与安装

    vim学习.各类插件配置与安装 vim 插件 配置 1. vim学习 vim基础学习:根据网上流行基础文章<简明Vim练级攻略>,进阶书籍<vim实用技巧>.注:进阶书籍可以在 ...

  9. 免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐

    免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐        隐鹤 倾心开发 2019.4.1 1.   引言 经过前后大约零零散散的一年的开发, ...

  10. 【小o地图Excel插件版】计算两点间驾车路径,获取途径道路、驾车距离、耗时等信息

    小o地图Excel插件版:一款基于Excel软件开发的地图软件,提供基于Excel表格进行地理数据挖掘.地理数据分析.地图绘制.地图图表等功能的工具类软件.具有易用.高效.稳定的特点,能够满足地理数据 ...

随机推荐

  1. 【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令

    这个需求为控制智能家居工作,把控制智能家居的操作指令发到队列中,比如:扫地机.洗衣机到指定时间工作   一.什么是延迟队列? 延迟队列存储的对象是对应的延迟消息,所谓"延迟消息" ...

  2. ABP - 依赖注入(2)

    依赖注入的使用 构造方法注入 这是将服务注入类的最常用方法,是将依赖项注入类的首选方式,也是微软推崇的模式.这样,除非提供了所有构造方法注入的依赖项,否则无法构造类,显示的声明了类必需的服务,使开发人 ...

  3. Android Studio 引入kotlin 协程

    首先保证创建了kotlin项目,然后,两个步骤: 1. 加入dependency,在 build.gradle(:app)中,加入 implementation 'org.jetbrains.kotl ...

  4. java匿名内部类的初解

    java原生态中的匿名内部类 1.匿名内部类的定义 使用匿名内部类的两种的方法 建立父类,重写父类的方法 实现接口的方法 2.普通类的实现 1. 普通类实现 实现普通类需要先声明对一个类的对象,再调用 ...

  5. 识别一切模型RAM(Recognize Anything Model)及其前身 Tag2Text 论文解读

    总览 大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~ 担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~ 继MetaAI 的 SAM后,OPPO 研究院发布识别一切模 ...

  6. 前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩

    前端Vue图片上传组件支持单个文件多个文件上传 自定义上传数量 预览删除图片 图片压缩, 下载完整代码请访问uni-app插件市场址:https://ext.dcloud.net.cn/plugin? ...

  7. 深度Q网络:DQN项目实战CartPole-v0

    摘要:相比于Q learning,DQN本质上是为了适应更为复杂的环境,并且经过不断的改良迭代,到了Nature DQN(即Volodymyr Mnih发表的Nature论文)这里才算是基本完善. 本 ...

  8. 1 opencv-python图像读写模块

    这个分类记录自己学习opencv的随笔文档,方便以后查询和复习.python-opencv环境配置网上教程很多,此处就不做赘述了,该文档记录opencv最基础的图像读写和显示,工具是jupyter n ...

  9. 从头学Java17-Stream API(二)结合Record、Optional

    Stream API Stream API 是按照map/filter/reduce方法处理内存中数据的最佳工具. 本系列教程由Record讲起,然后结合Optional,讨论collector的设计 ...

  10. Java通用返回工具类Result

    通用返回类Result 前言:Java项目搭建时,常常需要去封装一个通用型的Result工具类,下面就是我自己封装的常用的返回类,可以直接使用.(有部分Swagger注解,使用时可忽略) 第一步.创建 ...