因要做托盘的留痕功能,因此此篇文章做一下探讨,首先从阮航开始看,然后在看金格,最后再来看一下托盘怎么传参的问题
研究阮航留痕
打开一个阮航的文档,从连接上
拿取USERNAME为用户名称
var USERNAME = '<%=user.getName()%>';
是否留痕功能
TANGER_OCX_OBJ.ActiveDocument.TrackRevisions = true;
截图
这里的用户也是wander
研究金格留痕
金格的功能也是类似的,要传一个userName进去
WebOfficeObj.UserName = username;
然后把修定弄成true
WebOfficeObj.WebSetRevision(true,true,true,false);
显示或隐藏痕迹
this.obj.ActiveDocument.ShowRevisions = Show; // 显示痕迹或隐藏
也是设置了vba调用对象
this.WebObject = this.obj; // 设置VBA调用对象
阮航打开的界面,一开始修订默认是开启的,
点击隐藏痕迹,
本来是想参考iwebOffice2015的VBA文件
C:\Program Files (x86)\iWebOffice2015\x86
但发现反编译不到文件,估计是加密了。
金格从这里通过exe加载了
regsvr32.exe "%~dp0X64\StockVBAs.dll" /s
regsvr32.exe更加看不到内容,看不到源代码,黑盒子操作的确挺麻烦的,想了又想,开源的代码还是很伟大的,大家都可以看到思路。热爱开源,鄙视黑盒子。
看jacob的留痕传参的问题(猜测是调VBA去写的)
针对wps,简单来说,留痕功能是当开启wps,默认开启修订功能,然后状态为最终状态,当点显示痕迹的时候,会变为显示"显示标记的最终状态"
jacob调用vba的参数去控制wps的行为,参考地址见下面的参考篇章
代码参考如下:
public void open(String source) throws DocumentOperatorException {
ActiveXComponent word = null;
Dispatch documents = null;
Dispatch document = null;
try {
ComThread.InitMTA(true);
word = new ActiveXComponent("Word.Application");
Dispatch.put(word.getObject(), "Visible", new Variant(true));
documents = word.getProperty("Documents").toDispatch();
//放修订的用户名
word.setProperty("USERNAME", FileItem.userName);
document = Dispatch.invoke(
documents,
"Open",
Dispatch.Method,
new Object[] { source},
new int[1]).toDispatch();
Dispatch activeDocument = Dispatch.get(word, "ActiveDocument").toDispatch();
//打开修订
Dispatch.put(activeDocument, "TrackRevisions",new Variant(true));
//默认为最终状态
Dispatch.put(activeDocument, "ShowRevisions",new Variant(false));
} catch (Exception e) {
throw e;
} finally {
try {
if (document != null) {
document.safeRelease();
document = null;
}
if (documents != null){
documents.safeRelease();
documents = null;
}
if (word != null){
word.safeRelease();
word = null;
}
ComThread.Release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
此段代码只要控制好用户名的输入就行了,最后显示的效果图如下:
参考文章
https://www.iteye.com/blog/men4661273-2097871