java - 如何使用 Java 打开、保存和关闭 Excell 启用宏的工作表文件?
问题描述
原因:
更新每个公式会导致现有的 Excel 文件。
为什么:
为了能够从 Excell 文件中提取最新信息,否则程序仅显示上次打开 Excell 文件时手动保存的结果。
目标:
请有人举例说明如何执行此操作:Open
-> Save
->Close
让我们调用这个 Excell 文件:Test.xlsm
解决方案:
最后,我为我的问题找到了一个令人惊讶的解决方案。可能比 Apache 更好,因为我的 xlsm 文件有许多用户定义的公式,这导致任何尝试使用 Apache 评估公式的尝试都会引发错误和崩溃。
我创建了一个写在 .vbs 文件中的 VBS 脚本。
Set x_Application = CreateObject("Excel.Application")
Set x_Open_application = x_application.Workbooks.Open("C:\User\Documents\Project\Test.xlsm")
x_application.Calculate
x_Open_application.Save
x_Open_application.Close False
在我开始从 xlsm 文件中提取信息之前,该脚本将随时打开/执行。这确保了 xlsm 中所有公式的结果都是最新的。
我的 java 函数会在提取信息之前打开/运行 VBS 脚本文件:
Desktop.getDesktop().open(new File("./" + VBS_File_Name + ".vbs")); //Run VBS File
这种方法的好处:
*通过此方法更新/刷新的 Excel 文件公式对用户不可见 - 工作在后台完成。
*在没有 Apache 的情况下 100% 工作。
*易于实施。
解决方案
这是一个使用 POI 读取 Excel 文件的基本演示。参数是 Excel 文件名。
import java.io.*;
import org.apache.poi.ss.usermodel.*;
public class PoiDemo {
public static void main(final String[] args) {
try (FileInputStream inputStream = new FileInputStream(args[0]);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
Workbook workbook = WorkbookFactory.create(bufferedInputStream);) {
final Sheet sheet = workbook.getSheetAt(0);
for (final Row row : sheet) {
final String col0 = valueAsString(row, 0);
final String col2 = valueAsString(row, 2);
System.out.println("Column 0 =" + col0 + " column 2 = " + col2);
}
} catch (final Exception e) {
throw new IllegalStateException("Exception processing excel input", e);
}
}
private static String valueAsString(final Row row, final int i) {
final Cell cell = row.getCell(i);
final CellType ct = cell.getCellType();
switch (ct) {
case BOOLEAN:
return cell.getBooleanCellValue() ? "1" : "0";
case NUMERIC:
return String.format("%.0f", cell.getNumericCellValue());
case FORMULA:
case STRING:
return cell.getStringCellValue().trim();
default:
}
return "";
}
}
推荐阅读
- amazon-web-services - AWS API Gateway 自定义域的 Cname
- python-3.x - Python Dash,从输入文本中获取值
- java - 尝试在 java 中调用 DLL 时出现错误:java.lang.Error: Invalid memory access
- django - 将模板语言存储在数据库中并让它呈现 django
- embedded-linux - 返回 iw wlan0 扫描频率
- javascript - 在表格上方打印带有边框和附加标题文本的 jqgrid
- postgresql - 将 CurrentUser (jwt) 设置为 @Post(在事件控制器中)
- node.js - findoneandupdate 多级更新文档 MongoDB + Node
- amazon-web-services - Amazon s3 预签名 URL 受 IP 地址限制
- react-native - 在 Metro 捆绑器的“捆绑”阶段后 react-native run-ios 崩溃