package com.cai.read_excel.util;
import java.io.File;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class ExcelSaveAsDemo {
/**
* saveAs方法用于excel源文件不是标准源文件时(打开文件软件提示另存为),执行将文件另存为的操作。
* 此操作调用jacob-1.18-M2.jar,需要先将jacob包下的jacob-1.18-M2-x64(或x86).dll复制到Java
* jdk的\bin目录下。
*
* @param srcFilePath
* 源文件
* @param destFilePath
* 另存为目的地文件
*/
public File saveAs(String srcFilePath, String destFilePath) {
File destFile = null;
// COM组件初始化
ComThread.InitSTA();
// 打开Excel程序
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
try {
// 不显示程序
Dispatch.put(xl, "Visible", new Variant(false));
// 打开工作簿
Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
Dispatch workbook = Dispatch.call(workbooks,// 执行命令的对象
"Open", // 要执行的命令
srcFilePath,// 要打开的文件
false,// ConfirmConversions
true // ReadOnly
).toDispatch();
// 另存为(数字18表示保存文件版本是Microsoft Excel 97-2003)
Dispatch.invoke(
workbook,
"SaveAs",
Dispatch.Method,
new Object[] {destFilePath, new Variant(18) },
new int[1]);
Dispatch.call(workbook, "Close", new Variant(false));
// 返回另存为文件对象
destFile = new File(destFilePath);
if (!destFile.exists()) {
throw new RuntimeException("Excel文件另存为失败");
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Excel文件另存为时发生异常", e);
} finally {
xl.invoke("Quit", new Variant[] {});
ComThread.Release();
}
return destFile;
}
}
可能会遇到的问题:
如果有一个Java程序是打成jar包,并且jar包里的程序,有调用以上的方法进行excel另存为操作,有可能出现提示:
com.jacob.com.ComFailException: Invoke of: OpenSource: Microsoft Office ExcelDescription: Microsoft Office Excel</p><p>
• 文件名称或路径不存在。
• 文件正被其他程序使用。
• 您正要保存的工作簿与当前打开的工作簿同名。
解决:
如果系统是64位:
请在C:\Windows\SysWOW64\config\systemprofile\目录下新建一个Desktop的文件夹
如果系统是32位:
请在C:\Windows\System32\config\systemprofile\目录下新建一个Desktop的文件夹
转载自:https://blog.csdn.net/caibaohong/article/details/40409845