前段时间app需要实现一个直接打开office文档的功能,在这里记录一下,方便以后使用,所需的jar包在https://download.csdn.net/download/fishandbean/11987785

wps集成打开文档的功能,有两种实现方式。第一种是通过第三方启动方式直接打开文件,第二种是使用AIDL方式启动WPS,通过绑定Service,调用WPS对外暴露的接口,直接操作WPS的功能。

两种方式优缺点:使用第三方启动方式,简单方便,但是仅仅能控制一些打开文档的显示方式;使用AIDL方式打开可以操控的功能比较多,但是实现较为复杂。

下面介绍一下两种集成方式的具体实现:

首先提供两种实现方式都需要的一个工具类

public class Define
{public static final String PREFS_NAME = "MyPrefsFile";       //用于存取参数的文件名public static final String KEY = "PackageName";                //第三方包名public static final String READ_ONLY = "ReadOnly";          //只读模式public static final String NORMAL = "Normal";              //正常模式public static final String READ_MODE = "ReadMode";    //打开文件直接进入阅读器模式public static final String EDIT_MODE = "EditMode";    //打开文件直接进入编辑模式public static final String SAVE_ONLY = "SaveOnly";       //仅仅用来另存文件public static final String VIEW_SCALE = "ViewScale";         //视图比例public static final String VIEW_PROGRESS = "ViewProgress";    //查看进度百分比public static final String VIEW_SCROLL_X = "ViewScrollX";     //显示的x坐标public static final String VIEW_SCROLL_Y = "ViewScrollY";     //显示的y坐标public static final String CLOSE_FILE = "CloseFile";         //关闭的文件public static final String OPEN_FILE = "OpenFile";          //打开的文件public static final String THIRD_PACKAGE = "ThirdPackage";    //第三方的包名public static final String SAVE_PATH = "SavePath";          //文件保存的路径public static final String CLEAR_BUFFER = "ClearBuffer";      //清除缓冲区,默认为truepublic static final String CLEAR_TRACE = "ClearTrace";       //清除使用痕迹,默认为falsepublic static final String CLEAR_FILE = "ClearFile";         //删除文件自身,默认为falsepublic static final String CHECK_PACKAGE_NAME = "CheckPackageName";       //企业版华为不固定的应用包名public static final String IS_SCREEN_SHOTFORBID = "isScreenshotForbid"; // 禁止截屏// 以下是自己重新定义的public static final String USER_NAME = "UserName";public static final String SEND_CLOSE_BROAD = "SendCloseBroad";    //关闭文件时是否发送广播,默认不发送public static final String SEND_SAVE_BROAD = "SendSaveBroad";     //关闭保存时是否发送广播,默认不发送public static final String IS_VIEW_SCALE = "IsViewScale";     //view scalepublic static final String OPEN_MODE = "OpenMode";          //阅读器模式public static final String AUTO_JUMP = "AutoJump";          //第三方打开文件时是否自动跳转public static final String IS_CLEAR_BUFFER = "IsClearBuffer";     //清除缓冲区,默认为truepublic static final String IS_CLEAR_TRACE = "IsClearTrace";          //清除使用痕迹,默认为falsepublic static final String IS_CLEAR_FILE = "IsClearFile";        //删除文件自身,默认为falsepublic static final String HOME_KEY_DOWN = "HomeKeyDown";     //Home 按钮public static final String BACK_KEY_DOWN = "BackKeyDown";     //Back 按钮public static final String CACHE_FILE_INVISIBLE = "CacheFileInvisible";       //缓存文件是否可见,默认可见public static final String ENTER_REVISE_MODE = "EnterReviseMode";     //以修订模式打开文档public static final String ENCRYPT_FILE = "EncrptFile";       //加密方式操作文档public static final String MENU_XML = "MenuXML";         //xml菜单public static final String REVISION_NOMARKUP = "RevisionNoMarkup";//修订模式的无标记public static final String DISPLAY_OPEN_FILE_NAME = "DisplayOpenFileName"; // 第三方设置文档显示名称public static final String SHOW_REVIEWING_PANE_RIGHT_DEFAULT = "ShowReviewingPaneRightDefault";       //打开文档默认侧边栏不显示/显示 默认falsepublic static final String WATERMASK_TEXT = "WaterMaskText";//水印文字public static final String WATERMASK_COLOR = "WaterMaskColor";//水印文字颜色public static final String PACKAGENAME_KING_PRO = "com.kingsoft.moffice_pro";public static final String CLASSNAME = "cn.wps.moffice.documentmanager.PreStartActivity2";    //wps类名,标准版本
// public static final String CLASSNAME = "cn.wps.moffice.emm.EmmOpenFileActivity";      //wps类名,EMM版本public static final String OFFICE_SERVICE_ACTION = "cn.wps.moffice.service.OfficeService";public static final String PRO_OFFICE_SERVICE_ACTION = "cn.wps.moffice.service.ProOfficeService";public static final String OFFICE_ACTIVITY_NAME = "cn.wps.moffice.service.MOfficeWakeActivity";public static final String OFFICE_READY_ACTION = "cn.wps.moffice.service.startup";public static final String WPS_OPEN_MODE = "WPSOPENMODE";public static final String WPS_OPEN_AIDL = "AIDL";public static final String WPS_OPEN_THIRD = "THIRD";public static final String FAIR_COPY = "FairCopy";    //清稿public static final String FAIR_COPY_PW = "FairCopyPw";       //清稿密码public static final String IS_SHOW_VIEW = "IsShowView";   //是否显示wps界面//自动播放控制public static final String AUTO_PLAY = "AutoPlay";      // PPT直接进入自动播放public static final String AUTO_PLAY_INTERNAL = "AutoPlayInternal";  // PPT自动播放间隔//编辑public static final int INVALID_EDITPARAM = -1;public static final String AT_SAVE = "AT_SAVE";                   //保存public static final String AT_SAVEAS = "AT_SAVEAS";               //另存为public static final String AT_COPY = "AT_COPY";                   //复制public static final String AT_CUT = "AT_CUT";                      //剪切public static final String AT_PASTE = "AT_PASTE";                  //粘贴public static final String AT_SHARE = "AT_SHARE";                    //分享public static final String AT_PRINT = "AT_PRINT";                    //输出public static final String AT_SPELLCHECK = "AT_SPELLCHECK";          //拼写检查public static final String AT_QUICK_CLOSE_REVISEMODE = "AT_QUICK_CLOSE_REVISEMODE";          //快速关闭修订public static final String AT_MULTIDOCCHANGE = "AT_MULTIDOCCHANGE";          //多文档切换public static final String AT_EDIT_REVISION = "AT_EDIT_REVISION";public static final String AT_CURSOR_MODEL = "AT_CURSOR_MODEL";public static final String AT_PATH = "at_path";                             //编辑路径public static final String AT_CHANGE_COMMENT_USER = "AT_CHANGE_COMMENT_USER";public static final String AT_SHARE_PLAY = "AT_SHARE_PLAY";public static final String AT_GRID_BACKBOARD = "AT_GRID_BACKBOARD";public static final String SERIAL_NUMBER_OTHER = "SerialNumberOther"; // android 激活外部传入序列号

第一种,只需要以下方法即可:

  private void openFile(final BaseChatActivity mContext, File file, final MessageBase msg) {Intent intent = new Intent();final Bundle bundle = new Bundle();//打开模式,只读模式bundle.putString(Define.OPEN_MODE, Define.READ_ONLY);
//关闭时是否发送广播true为发送bundle.putBoolean(Define.SEND_CLOSE_BROAD, true);
//打开文件时,在最近列表不显示该打开记录if (msg.getDirection() == MessageBase.DIRECTION_SEND) {bundle.putBoolean(Define.CLEAR_FILE, false);} else {bundle.putBoolean(Define.CLEAR_FILE, true);}bundle.putBoolean(Define.CLEAR_TRACE, true);bundle.putBoolean(Define.CLEAR_BUFFER, true);bundle.putBoolean(Define.IS_SCREEN_SHOTFORBID, true);//禁止截屏
//第三方应用的包名,用于对该应用合法性的验证bundle.putString(Define.THIRD_PACKAGE, mContext.getPackageName());
//按返回键时是否发送广播true为发送bundle.putBoolean(Define.BACK_KEY_DOWN, true);
//按home键时是否发送广播true为发送bundle.putBoolean(Define.HOME_KEY_DOWN, true);bundle.putBoolean(Define.CACHE_FILE_INVISIBLE, true);bundle.putBoolean("DisplayView", false);
//正式版wps激活码,购买wps官方应用的时候,wps会提供bundle.putString(Define.SERIAL_NUMBER_OTHER,"938268264276");
//设置wps显示的水印文字bundle.putString(Define.WATERMASK_TEXT,"我的应用"));
//设置wps显示的水印颜色bundle.putInt(Define.WATERMASK_COLOR, Color.argb(40,170,170,170));intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY);intent.setAction(android.content.Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//检查手机是否安装了wps正式版,没有安装就提示下载if (WpsUtil.checkPackage(mContext, Define.PACKAGENAME_KING_PRO)) {intent.setClassName(Define.PACKAGENAME_KING_PRO, Define.CLASSNAME);} else {ToastUtils.showShortToast(mContext, R.string.remind_user_install_wps);return false;}
//传递权限,由于7.0以上的手机需要具有文件权限才能打开,不加权限会崩溃Uri uri;if (Build.VERSION.SDK_INT >= 24) {uri = FileProvider.getUriForFile(mContext.getApplicationContext(), "com.bankcomm.jrt.fileprovider", file);} else {uri = Uri.fromFile(file);}intent.putExtras(bundle);String type = WpsUtil.getMIMEType(file);intent.setDataAndType(uri, type);if (file == null || !file.exists()) {ToastUtils.showShortToast(mContext, R.string.feinno_str_file_not_exist_download);return false;}try {//打开文档mContext.startActivity(intent);} catch (ActivityNotFoundException e) {ToastUtils.showShortToast(mContext, "文件打开失败请稍后重试");e.printStackTrace();}}

第二种实现方式:

1.如果需要使用AIDL方式操作wps,需要将moffice-aidl.jar和moffice-event-interface.jar两个jar包导入到自己的工程中,并在eclipse中选择Java Build Path的Order and Export中选中两个jar包,这样编出的第三方应用程序才能正常操作控制wps。

2.清单文件中的配置。两个serVice的acticion的name,一定要设置的独特一点,不然如果手机上装了多个可以打开wps的应用的话就会冲突,导致某一个打不开。

<!--wps相关-->
<service android:name="com.feinnoui.library.wps.client.MOfficeClientService"><intent-filter><action android:name="cn.wps.moffice.client.OfficeServiceClient3" ></action></intent-filter>
</service><service android:name="com.feinnoui.library.wps.agent.AgentMessageService"><intent-filter><action android:name="cn.wps.moffice.agent.OfficeServiceAgent3" ></action></intent-filter>
</service>

实现打开文档的service:

package com.feinnoui.library.wps.client;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;import com.feinnoui.library.utils.ToastUtils;
import com.feinnoui.library.wps.util.Define;
import com.feinnoui.library.wps.util.WpsUtil;
import cn.wps.moffice.client.OfficeServiceClient;
import cn.wps.moffice.service.OfficeService;
import cn.wps.moffice.service.doc.Document;
import cn.wps.moffice.service.pdf.PDFReader;
import cn.wps.moffice.service.presentation.Presentation;
import cn.wps.moffice.service.spreadsheet.Workbook;
public class MOfficeClientService extends Service {private static MOfficeClientService mOfficeClientService;protected final OfficeServiceClient.Stub mBinder = new OfficeServiceClientImpl(this);private static String docPath;public static boolean isBound = false; //是否绑定,为了在关闭wps接收到广播后解绑private static Presentation mPresentation = null;private static Workbook mWorkBook = null;private static PDFReader mPdfReader = null;private static Document mDoc = null;private static Context mContext;public static OfficeService mService;private static ServiceConnection connection ;public MOfficeClientService() {}@Overridepublic void onCreate() {mOfficeClientService = this;mContext = this;connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mService = OfficeService.Stub.asInterface(service);isBound = true;if (mService!=null)openFile(mService);elseToastUtils.showShortToast(MOfficeClientService.this,"wps服务开启失败,请重试!");}@Overridepublic void onServiceDisconnected(ComponentName name) {mService = null;isBound = false;}};bindOfficeService();//绑定wps的服务}@Overridepublic void onRebind(Intent intent) {super.onRebind(intent);bindOfficeService();}@Overridepublic IBinder onBind(Intent intent) {return mBinder;}@Overridepublic boolean onUnbind(Intent intent) {if (connection != null) {unbindService(connection);}super.onUnbind(intent);return true;}@Overridepublic void onStart(Intent intent, int startId) {}private boolean bindOfficeService() {final Intent intent = new Intent();intent.putExtra("DisplayView", true);intent.setAction(Define.OFFICE_SERVICE_ACTION);if (Build.VERSION.SDK_INT > 21) {intent.setPackage(Define.PACKAGENAME_KING_PRO);}if (!bindService(intent, connection, Service.BIND_AUTO_CREATE)) {unbindService(connection);isBound = false;return false;}return true;}@Overridepublic void onDestroy() {isBound = false;if (connection != null){try {unbindService(connection);connection = null;} catch (Exception e) {e.printStackTrace();}}this.stopSelf();try {closeFile();} catch (Exception e) {e.printStackTrace();}mService = null;super.onDestroy();}
//打开文档public void openFile(OfficeService mService) {if (!isBound|| MOfficeClientService.mService == null) {ToastUtils.showShortToast(MOfficeClientService.this, "wps服务绑定失败,请手动开启wps自启动权限");return;}if (WpsUtil.isPptFile(docPath)) {//ppt文档LoadPresentationThread pptFileThread = new LoadPresentationThread(docPath, MOfficeClientService.mService);pptFileThread.start();} else if (WpsUtil.isExcelFile(docPath)) {//excel文档LoadWorkBookThread excelFileThread = new LoadWorkBookThread(docPath, MOfficeClientService.mService);excelFileThread.start();} else if (WpsUtil.isPDFFile(docPath)) {//pdf文档LoadPDFDocThread pdfFileThread = new LoadPDFDocThread(docPath, MOfficeClientService.mService);pdfFileThread.start();} else {//doc文档LoadDocThread docFileThread = new LoadDocThread(docPath, MOfficeClientService.mService);docFileThread.start();}}public static void setDocPath(String path) {docPath = path;}public void stopService() {isBound = false;if (connection != null) {unbindService(connection);}stopSelf();try {closeFile();} catch (Exception e) {e.printStackTrace();}mService = null;}public static MOfficeClientService getInstance() {return mOfficeClientService;}class LoadPresentationThread extends Thread// 内部类{String path;OfficeService service;public LoadPresentationThread(String path, OfficeService service) {this.path = path;this.service = service;}public void run() {// 打开文档if (service == null || !bindOfficeService()) {return;}try {Intent intent = new Intent();Bundle bundle = WpsUtil.getOpenFileBundle(MOfficeClientService.this);intent.putExtras(bundle);mPresentation = mService.openPresentation(path, "", intent);} catch (RemoteException e) {e.printStackTrace();mPresentation = null;}}}class LoadWorkBookThread extends Thread// 内部类{String path;OfficeService service;public LoadWorkBookThread(String path, OfficeService service) {this.path = path;this.service = service;}public void run() {// 打开文档if (service == null || !bindOfficeService()) {return;}try {Intent intent = new Intent();Bundle bundle = WpsUtil.getOpenFileBundle(MOfficeClientService.this);intent.putExtras(bundle);mWorkBook = mService.getWorkbooks().openBookEx(path, "", intent);} catch (RemoteException e) {e.printStackTrace();mWorkBook = null;}}}class LoadPDFDocThread extends Thread// 内部类{String path;OfficeService service;public LoadPDFDocThread(String path, OfficeService service) {this.path = path;this.service = service;}public void run() {// 打开文档if (service == null || !bindOfficeService()) {return;}try {Intent intent = new Intent();Bundle bundle = WpsUtil.getOpenFileBundle(MOfficeClientService.this);intent.putExtras(bundle);mPdfReader = mService.openPDFReader(path, "", intent);} catch (RemoteException e) {e.printStackTrace();mPdfReader = null;}}}class LoadDocThread extends Thread// 内部类{String path;OfficeService service;public LoadDocThread(String path, OfficeService service) {this.path = path;this.service = service;}public void run() {// 打开文档if (service == null || !bindOfficeService()) {return;}try {Intent intent = new Intent();Bundle bundle = WpsUtil.getOpenFileBundle(MOfficeClientService.this);intent.putExtras(bundle);mDoc = mService.openWordDocument(path, "", intent);} catch (Exception e) {e.printStackTrace();mDoc = null;}}}public static void closeFile() throws RemoteException {if (mPresentation != null) {mPresentation.close();mPresentation = null;} else if (mWorkBook != null) {mWorkBook.close();mWorkBook = null;} else if ( mPdfReader != null) {mPdfReader.close();mPdfReader = null;} else {if (mDoc != null) {mDoc.close();mDoc = null;}}}
}

wpsUtil的工具类:

package com.feinnoui.library.wps.util;import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.content.FileProvider;
import android.text.TextUtils;
import android.widget.Toast;import com.feinnoui.library.utils.PreferenceUtil;import java.io.File;
import java.io.InputStream;public class WpsUtil {/*** 判断是否是wps能打开的文件** @param file* @return*/public static boolean IsWPSFile(File file) {if(null == file){return false;}String end = file.getName().substring(file.getName().lastIndexOf(".") + 1,file.getName().length()).toLowerCase();if (end.equals("doc") || end.equals("dot") || end.equals("wps")|| end.equals("wpt") || end.equals("docx") || end.equals("dotx")|| end.equals("docm") || end.equals("dotm") || end.equals("rtf")|| end.equals("xls") || end.equals("xlt") || end.equals("et")|| end.equals("ett") || end.equals("xlsx") || end.equals("xltx")|| end.equals("csv") || end.equals("xlsb") || end.equals("xlsm")|| end.equals("xml") || end.equals("html") || end.equals("htm")|| end.equals("ppt") || end.equals("pptx") || end.equals("dps")|| end.equals("pot") || end.equals("pps") || end.equals("dpt")|| end.equals("potx") || end.equals("ppsx") || end.equals("pptm")|| end.equals("txt") || end.equals("pdf")|| end.equals("potm") || end.equals("ppsm")) {return true;} else {return false;}}public static boolean isPDFFile(String filePath) {if(TextUtils.isEmpty(filePath)){return false;}String path = filePath.toLowerCase();return path.endsWith(".pdf");}public static boolean isPptFile(String filePath) {if(TextUtils.isEmpty(filePath)){return false ;}filePath = filePath.toLowerCase();return filePath.endsWith(".ppt")|| filePath.endsWith("pptx");}public static boolean isExcelFile(String filePath) {if(TextUtils.isEmpty(filePath)){return false;}filePath = filePath.toLowerCase();return filePath.endsWith(".xls")|| filePath.endsWith(".xlsx")|| filePath.endsWith(".et");}
zzpublic static Bundle getOpenFileBundle(Context context) {Bundle bundle = new Bundle();bundle.putString(Define.OPEN_MODE, Define.READ_ONLY);   //打开模式bundle.putBoolean(Define.HOME_KEY_DOWN, true);bundle.putBoolean(Define.BACK_KEY_DOWN, true);bundle.putBoolean(Define.SEND_CLOSE_BROAD, true);bundle.putString(Define.THIRD_PACKAGE, context.getPackageName());bundle.putBoolean(Define.CLEAR_FILE, true);bundle.putBoolean(Define.CLEAR_TRACE, true);bundle.putBoolean(Define.CLEAR_BUFFER, true);bundle.putBoolean(Define.CACHE_FILE_INVISIBLE, true);bundle.putString(Define.SERIAL_NUMBER_OTHER,"934611435276");bundle.putBoolean(Define.FAIR_COPY,true);bundle.putBoolean(Define.SHOW_REVIEWING_PANE_RIGHT_DEFAULT,false);bundle.putBoolean("DisplayView", true);//如果用的是标准版的wps的话,这行代码不能少,否则打不开文档bundle.putBoolean("isScreenshotForbid", true);
//agentClassName一定要与清单文件中配置的acticion的name保持一致,否则将会导致在OfficeEventListenerImpl中禁用功能的代码不生效。bundle.putString("agentClassName","cn.wps.moffice.agent.OfficeServiceAgent3");bundle.putString(Define.WATERMASK_TEXT, PreferenceUtil.getString("user_mobile","交融通"));bundle.putInt(Define.WATERMASK_COLOR, Color.argb(40,170,170,170));return bundle;}
}

需要打开文件的时候调用此方法:

private void openWpsFile(Context mContext, String docPath) {MOfficeClientService.setDocPath(docPath);if (MOfficeClientService.isBound){MOfficeClientService.getInstance().openFile(MOfficeClientService.mService);}else {Intent serviceIntent = new Intent();serviceIntent.setClass(mContext, MOfficeClientService.class);serviceIntent.setAction("cn.wps.moffice.client.OfficeServiceClient3");mContext.startService(serviceIntent);}
}

   如果你的应用想控制WPS的部分功能是否可以使用,也是可以实现的,wps提供了现成的方法。WPS在执行被限制的功能前,会通过连接好的Service,调用Client的 isActionAllowed(String path, ActionType type) 方法,通过该方法的返回值来决定该功能是否执行。所以如果想使得、那个功能不可使用,直接返回false即可。

/**下面以限制复制功能为例   */

@Override

public boolean isActionAllowed(String path, ActionType type) throws RemoteException

{

//如果是复制类型的事件,则返回false,即不允许复制

If (type.equals(ActionType.AT_CUT))

Return false;

Return true;

}

isViewForbidden方法是为了实现功能是否被禁用而存在的,但是仅word文档有用,与isActionAllowed相反。

@Override
public boolean isViewForbidden(String arg0, ViewType type) throws RemoteException {//仅word文档有用if (type.equals(ViewType.VT_MENU_FILE)){return true;}return false;
}

isViewForbidden方法是控制功能入口是否显示的,但是仅word文档有用

@Override
public boolean isViewInVisible(String arg0, ViewType type) throws RemoteException {//仅word文档有用if (type.equals(ViewType.VT_MENU_VIEW)){return false;}return true;
}

android集成第三方---集成wps实现文档阅读功能相关推荐

  1. Java集成第三方oss对象存储——文档篇

    Java集成第三方oss对象存储--文档篇 相关文章 简介 官方文档 应用场景 Web 配置操作 添加依赖 创建存储空间 相关文章 简介 阿里云对象存储OSS(Object Storage Servi ...

  2. TurboMail手机客户端—强大的附件文档阅读能力

    2019独角兽企业重金招聘Python工程师标准>>> 对于频繁使用邮件的用户而言,收发附件已是家常便饭,但对于手机查看附件,用户却遇到了很多问题.稍微低端的手机,除了txt格式的文 ...

  3. Android开发 给应用集成打开office文档的功能

    使用TBS来实现打开office文档的功能. 下载腾讯浏览服务 SDK. 网址:https://x5.tencent.com/tbs/sdk.html 将tbs_sdk_thirdapp_v4.3.0 ...

  4. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...

  5. SpringBoot集成knife4j实现Swagger接口文档

    前言:如果你是后台开发,提供restful接口给前端,建议你使用Swagger3提供restful的接口文档自动生成和在线接口调试.knife4j是对Swagger进一步封装,其优化了API文档的UI ...

  6. SpringMvc集成Springfox使用Swagger写文档和测试

    SpringMvc集成Springfox使用Swagger写文档和测试 前言 swagger简介 swagger确实是个好东西,可以跟据业务代码自动生成相关的api接口文档,尤其用于restful风格 ...

  7. SpringBoot集成swagger生成在线接口文档

    SpringBoot集成swagger生成在线接口文档 集成maven依赖 <dependency><groupId>io.springfox</groupId>& ...

  8. 驰骋工作流引擎与第三方系统的接口文档For 山东金义

    驰骋工作流引擎与第三方系统的接口文档For 山东金义 驰骋BPM要与第3方系统的接口主要有发起.待办.在途.查询4个菜单,如果被集成的系统由于风格问题需要自己生成发起,待办,在途三个页面,最有效的办法 ...

  9. 国产文档处理控件Spire.Doc WPS Word文档功能上线!快速创建Word指南

    Spire.Doc for Java 是一款专业的Java Word组件,开发人员使用它可以轻松地将Word文档创建.读取.编辑.转换和打印等功能集成到自己的Java应用程序中. 本文将介绍如何使用S ...

  10. Android文档阅读之Txt文档阅读的方案实现

    Android文档阅读之Txt文档阅读的方案实现 上两节说到了Office文档的阅读实现方案,通过NoHTTP将文档下载到本地,然后策略阅读,如果还没阅读到Office该篇的小伙伴们,可以先移步到上两 ...

最新文章

  1. js动态创建元素之一--document.write
  2. Stereo Matching 立体匹配学习资料
  3. go标准库的学习-errors
  4. 数据分析入门极简书单
  5. 【caffe-Windows】训练自己数据——数据集格式转换
  6. [Markdown语法][快速入门][CSDN]
  7. 数据结构复习笔记(2)
  8. es6 prototype 属性和__proto__属性
  9. centOS 安装及部署 SVN
  10. python蟒蛇实例
  11. 物联lot是什么意思_什么是物联网,物联网(lOT)简介
  12. 越南无线网dns服务器设置,越南dns 服务器地址
  13. VRay Next(4.0) for SketchUp之BIG分析图制作教程
  14. CSS border-radius:50%和100%的区别
  15. PADS 导入cadence dsn文件,同步pads layout
  16. php手册中的tokenizer详细总结,基本看它就够了
  17. D2. Seating Arrangements (hard version)
  18. YOLOv5桌面应用开发(从零开始)
  19. 3dsMax MaxScript 语法
  20. 轻量级Qt键盘-实现篇

热门文章

  1. 超简单制作栅格数据土地利用转移矩阵(Arcgis和Python实现)
  2. sose会议级别_【2017年整理】计算机领域EI和SCI收录期刊、影响因子及国际会议.doc...
  3. java语言数据库课程设计_数据库课程设计 人事管理系统 (一)
  4. 科立捷对讲机频道频率_信道式对讲机和频率式对讲机怎么调频?
  5. Jmeter基础教程
  6. tracepro中文pojie版-tracepro附安装教程
  7. 阿拉德之怒手游超详细图文架设教程
  8. Origin 8.6 使用常见操作(随遇随写)
  9. linux最大lun空间,Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
  10. RT-Thread学习笔记|74HC595驱动数码管详解