Jacob代码编写/部署的注意事项集

注意事项一:

慎用

ComThread.InitSTA();
ComThread.Release();

因为经常会在 ComThread.Release(); 发生阻塞,导致程序一直卡在这里,不能被调用;

建议不要使用这个初始化和释放线程的代码,看似很高级,其实没啥用而且会出现很多东西

 变为如下代码:

package com.example.worddemo.test.jacob;
import com.example.worddemo.test.jacob.enums.FileMacroEnum;
import com.example.worddemo.utils.IdUtil;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;/*** @program: word-demo* @description: 运用宏  有返回值* @author: wjl* @create: 2024-01-14 22:54**/
public class RunMacroWithReturn {// 这里需要根据当前环境安装的是 MicroSoft Office还是WPS来选择// 如果安装的是WPS,则需要使用 KWPS.Application// 如果安装的是微软的 Office,需要使用 Word.Applicationprivate static final String MS_OFFICE_APPLICATION = "Word.Application";private static final String WPS_OFFICE_APPLICATION = "KWPS.Application";public static void main(String[] args) {FileMacroEnum macroEnum = FileMacroEnum.WORD_2003_DOC;String targetPath = "D:\\"+ IdUtil.upper()+macroEnum.getSuffix();String wordPath =  "D:\\4.doc";try {ActiveXComponent app = new ActiveXComponent( WPS_OFFICE_APPLICATION);app.setProperty("Visible", new Variant(false));Dispatch docs = app.getProperty("Documents").toDispatch();//打開編輯囂Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] {wordPath, new Variant(false), new Variant(true)} , new int[1]).toDispatch(); //打開word文檔//  parameter  是宏的名称String string = app.invoke("Run", "GetFirstParagraphText").getString();System.out.println(string);Dispatch.call(doc, "SaveAs", targetPath, macroEnum.getMacro());Dispatch.call(doc, "Close", true);app.invoke("Quit",0);}catch (Exception e) {e.printStackTrace();}System.out.println("转换后的文件路径为:"+targetPath);}}

注意事项二:

一定要指定Tomcat的临时文件夹,而不是使用默认的,Windows系统会进行Tomcat临时文件夹的清理;

  • 参考文章一
  • 参考文章二
  • 参考文章三
  • 参考文章四

可以在编译器添加如下参数进行开发时的设置

#定临时目录为/app/xxx/tmp
-Djava.io.tmpdir=/app/xxx/tmp(自定义路径)

也可以加在jar包的启动的命令行中,如 

java -Xmx6144m -jar -Dfile.encoding=UTF-8 -Djava.io.tmpdir=./upload_tmp xxx.jar

 当然还有很多处理方式,比如Yml的配置,configuration配置等,参考上面的连接


注意事项三:

Jacob的Variant类,可以处理COM组件返回的各种数据类型的,包括(Boolean,Date,String,Int,数组等)

 下面将演示,处理宏返回的二维数组,关于怎么使用宏,可以查看本人的系列文章

  • VBA宏
' 在 Excel VBA 中定义一个返回二维数组的宏
Public Function Get2DArray() As VariantDim arr(1 To 2, 1 To 3) As Stringarr(1, 1) = "One"arr(1, 2) = "Two"arr(1, 3) = "Three"arr(2, 1) = "Four"arr(2, 2) = "Five"arr(2, 3) = "Six"Get2DArray = arr
End Function
  • jacob代码

 

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.SafeArray;
import com.jacob.com.Variant;public class VBA2DArrayExample {public static void main(String[] args) {// 启动 Excel 应用ActiveXComponent excel = new ActiveXComponent("Excel.Application");try {// 设置 Excel 为不可见excel.setProperty("Visible", new Variant(false));// 打开 Excel 工作簿Dispatch workbooks = excel.getProperty("Workbooks").toDispatch();Dispatch workbook = Dispatch.call(workbooks, "Open", "C:\\path\\to\\your\\workbook.xlsm").toDispatch();// 获取宏结果Variant result = Dispatch.call(excel, "Run", "Get2DArray");// 检查返回的类型并处理二维数组if (result.getvt() == 8204) {SafeArray safeArray = result.toSafeArray();// 获取数组的边界int lBound1 = safeArray.getLBound(1);int uBound1 = safeArray.getUBound(1);int lBound2 = safeArray.getLBound(2);int uBound2 = safeArray.getUBound(2);// 遍历二维数组并输出元素for (int i = lBound1; i <= uBound1; i++) {for (int j = lBound2; j <= uBound2; j++) {Variant item = safeArray.getVariant(i, j);System.out.println("[" + i + "," + j + "] = " + item.toString());}}} else {System.out.println("Macro did not return a 2D array.");}// 关闭工作簿,不保存更改Dispatch.call(workbook, "Close", new Variant(false));} catch (Exception e) {e.printStackTrace();} finally {// 退出 Excel 应用excel.invoke("Quit", new Variant[]{});}}
}

 


学习产出:

提示:这里统计学习计划的总量

例如:

  • 技术笔记 2 遍
  • CSDN 技术博客 3 篇
  • 习的 vlog 视频 1 个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift Combine — zip和combineLatest的理解与使用

Publisher 上还有一些其他的操作&#xff0c;比如 zip 和 combineLatest&#xff0c;能让我们在时序上对控制多个 Publisher 的结果进行类似 and 和 or 的合并&#xff0c;它们在构建复杂 Publisher 逻辑时也十分有用。 zip Publisher 中的 zip 和 Sequence 的 zip 相类似&am…

iOS政策解读之一丨App提交审核前注意事项必知

大家好&#xff0c;我是小编阿文。欢迎您关注我们&#xff0c;经常分享有关Android出海&#xff0c;iOS出海&#xff0c;App市场政策实时更新&#xff0c;互金市场投放策略&#xff0c;最新互金新闻资讯等文章&#xff0c;期待与您共航世界之海。 iOS企业出海所面临的主要挑战…

路由优先级

在网络管理中&#xff0c;“路由策略”和“策略路由”是两种不同的概念。路由策略通常指的是传统的路由协议 和静态路由等机制的优先级&#xff0c;而策略路由&#xff08;Policy-Based Routing, PBR&#xff09;则允许管理员基于特定 的策略&#xff08;如源地址、目标地址、…

高速异地组网怎么办理?

在当今信息化时代&#xff0c;跨地域的远程办公、远程教育、远程医疗等需求越来越多。而高速异地组网作为一种解决不同地区之间快速组建局域网的方法&#xff0c;被广泛应用。本文将介绍一款异地组网内网穿透产品——【天联】&#xff0c;并提供其办理流程。 【天联】组网是什…

JMeter详解

一、线程组 作用:线程组就是控制Imeter用于执行测试的一组用户 位置:右键点击测试计划’-->添加 -->线程(用户)--> 线程组 特点: 模拟多人操作线程组可以添加多个&#xff0c;多个线程组可以并行或串行取样器(请求)和逻辑控制器必须依赖线程组才能使用线程组下可以…

[广搜BFS] Pots

描述 You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;DROP(i) empty the pot i to the drain;POUR(i,j) pour from pot i to po…

java -jar

java [JVM参数] -jar [jar文件路径] [应用参数&#xff0c;包括springboot特定参数]* JVM 参数必须在-jar之前 * 应用参数一般在jar文件路径之后java -jar excel.jar java -jar -Dloader.pathlibx /path/to/yourApp.jar java -jar -Dloader.pathlibx /path/to/yourApp.jar --…

Behind the Code:Polkadot 如何实现全球协作与去中心化治理?

2024 年 6 月 16 日&#xff0c;《Behind the Code: Web3 Thinkers》第二季第二集上线。本集中&#xff0c;ChaosDAO 联合创始人兼 Novasama Technologies 首席财务官 Leemo 深入探讨了 Polkadot 生态系统中的全球协作力量&#xff0c;以及这种协作如何推动去中心化治理的创新与…

聊聊语法糖

语法糖&#xff08;Syntactic sugar&#xff09;是指编程语言中添加的某种语法&#xff0c;这种语法对语言的功能没有影响&#xff0c;但更方便程序员使用&#xff0c;并能增加程序的可读性&#xff0c;减少代码出错的机会。 历史&#xff1a; 语法糖这一术语是由英国计算机科…

C++:你用过MultiIndex容器吗?

作为C开发者&#xff0c;我们对键值容器非常熟悉&#xff0c;例如std::set、std::map、std::unordered_map等。这些容器以其强大的功能和高效的性能&#xff0c;成为我们处理数据存储和检索任务时的得力助手。但是你用过多键容器&#xff08;MultiIndex&#xff09;吗&#xff…

关于团队生存的小讨论

大家好&#xff0c;我是阿赵。   今天出门上班的时候&#xff0c;在电梯里面看到了信乐团的海报&#xff0c;信乐团要来我家附近开演唱会了。可惜&#xff0c;是没有了信的信乐团。   我以前读大学的时候&#xff0c;组建过自己的乐队&#xff0c;所以对当时很多乐队都非常…

在 macOS 上使用 Homebrew 安装和配置 Python 及 Tk 库

在 macOS 上&#xff0c;系统自带的 /usr/bin/python3 版本较旧&#xff0c;且直接升级系统自带的 Python 版本可能会影响系统稳定性。因此&#xff0c;推荐使用 Homebrew 来安装和管理 Python 及其相关库。本文将详细介绍如何通过 Homebrew 安装和配置 Python 3 及 Tk 库&…

CentOS中的rename命令

目录 CentOS中的rename命令基本语法使用示例注意事项安装prename CentOS中的rename命令 在CentOS系统中&#xff0c;rename命令通常是指util-linux包中提供的版本&#xff0c;它用于批量重命名文件&#xff0c;但与Perl版本的rename命令相比&#xff0c;功能较为简单&#xff…

QT 中setVisible()和setEnabled()的区别

setVisible(bool)和setEnabled(true)在PyQt&#xff08;以及其他类似的图形用户界面框架&#xff09;中分别用于控制控件的可见性和可用性&#xff0c;它们之间的主要区别如下&#xff1a; setVisible(bool) 功能&#xff1a;这个函数用于设置QWidget控件的可见状态。参数&am…

AI创作在论文写作中扮演什么角色?

近年来&#xff0c;随着科技的快速发展&#xff0c;AI已经逐渐渗透到了生活中的方方面面&#xff0c;其中也包含着学术领域。 作为学生党&#xff0c;你是否还在为期末论文&#xff0c;大学生实践报告而发愁&#xff1f; 有了这些AI写作神器&#xff0c;大学生们再也不用在期…

深度学习500问——Chapter11:迁移学习(3)

文章目录 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 11.3.2 边缘分布自适应 11.3.3 条件分布自适应 11.3.4 联合分布自适应 11.3.5 概率分布自适应方法优劣性比较 11.3.6 特征选择 11.3.7 统计特征对齐方法 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 数据分布自适…

Unity做一个剪辑声音的工具 在编辑器模式实时剪辑声音

Unity音频剪辑工具的实现 在游戏开发中&#xff0c;音频是一个至关重要的元素。音频剪辑工具能够帮助开发者高效地编辑和管理音频文件。本文将解析一个基于Unity编辑器的音频剪辑工具的实现方法 效果 工具功能 该音频剪辑工具允许用户在Unity编辑器中加载音频片段&#xff0…

Linux 一键部署 Nginx1.26.1 + ModSecurity3

前言 ModSecurity 是 Apache 基金会的一个开源、高性能的 Web 应用程序防火墙(WAF),它提供了强大的安全规则引擎,用于检测和阻止各种攻击行为,如 SQL 注入、XSS 跨站点脚本攻击等。而 nginx 是一个高性能的 Web 服务器,常用于处理大量的并发请求,具有很高的负载均衡能力…

k8s及etcd的每日自动备份及故障时的还原脚本

#!/bin/bash# 定义备份目录 BACKUP_DIR"/data/backupdata/k8s" K8S_CONFIG_BACKUP"${BACKUP_DIR}/k8s_config_backup_$(date %Y%m%d%H%M%S).tar.gz" ETCD_BACKUP"${BACKUP_DIR}/etcd_backup_$(date %Y%m%d%H%M%S).db" TEMP_DIR"${BACKUP_DI…

<component>标签的介绍和使用

目录 基本使用&#xff1a; 使用组件对象&#xff1a; 使用动态组件与 keep-alive keep-alive简单介绍及使用&#xff1a; 属性&#xff1a; 生命周期钩子&#xff1a; 举例&#xff1a; 缓存单个组件&#xff1a; 缓存多个组件&#xff08;通过路由动态&#xff09;&…