项目开发中遇到过通过java生成多个excel,然后再合并为一个统一excel的需求。
在合并过程中,如果某个excel存在异常,就会报错,因此需要判断一下生成的excel能否正常打开。这些处理需要在后台进行,用户在使用过程中是感觉不到的,因此不能直接通过cmd命令去打excel,可以通过如下代码判断。
// 检查生成的Excel是否可以正常打开
// excelPath为需要检查的excel路径
CheckExcelStatus checkExcel = new CheckExcelStatus();
// Excel可以正常打开时关闭Excel
if(checkExcel .openExcelFile(excelPath)){
checkExcel .closeExcelFile(false);
}else{
// 无法正常打开时报错
outputFlg = false;
MessageBox.post("生成的excel文档无法正常打开,请确认。" , "错误", MessageBox.ERROR);
}
public class CheckExcelStatus{
public ActiveXComponent activexcomponent;
public Dispatch workbooks = null;
public Dispatch workbook = null;
public Dispatch sheet = null;
public Vector< String > oldSheetName = new Vector< String >();
private HashMap<String,String> fileType=new HashMap<String,String>();
{
fileType.put("txt", "icons/txticon.exe");
fileType.put("doc", "icons/wordicon.exe");
fileType.put("xls", "icons/excelicon.exe");
fileType.put("pdf", "icons/pdficon.ico");
}
private Vector<String> imageType=new Vector<String>();
{
imageType.add("bmp");
imageType.add("jpg");
imageType.add("jpeg");
imageType.add("gif");
}
/**
* @param args
*/
public static void main(String[] args) {
JacobCheckExcel jacobexcel=new JacobCheckExcel();
System.out.println( jacobexcel.getExcelApplicationVersion() );
}
public void saveAsExcelFile(String fileName) {
try {
Dispatch.call(sheet, "Select");
File f = new File(fileName);
f.delete();
Dispatch.invoke(workbook, "SaveAs", Dispatch.Method,
new Object[] { fileName }, new int[1]);
} catch (Exception e) {
System.out.println("另存为时出错...");
e.printStackTrace();
}
}
public void closeExcelFile(boolean close) {
try {
Dispatch.call((Dispatch) workbook, "Save");
Dispatch.call((Dispatch) workbook, "Close", new Variant(close));
} catch (Exception e) {
System.out.println("保存关闭时出错...");
e.printStackTrace();
} finally {
activexcomponent.invoke("Quit", new Variant[] {});
}
}
public void openExcelFile(String filename,String sheetName){
try {
activexcomponent = new ActiveXComponent("Excel.Application");
activexcomponent.setProperty("Visible", new Variant(false));
workbooks = activexcomponent.getProperty("Workbooks").toDispatch();
workbook = Dispatch.invoke(workbooks,"Open",Dispatch.Method,
new Object[] { filename, new Variant(false), new Variant(false)},// 是否以只读方式打开
new int[1]).toDispatch();
Dispatch sheets = Dispatch.get((Dispatch) workbook,"Sheets").toDispatch();
sheet = Dispatch.invoke(sheets, "Item", Dispatch.Get,new Variant[] { new Variant(sheetName) },
new int[1]).toDispatch();
//激活sheet工作表
Dispatch.call(sheet, "Activate");
} catch (Exception e) {
System.out.println("打开EXCEL时出错...");
e.printStackTrace();
}
}
// 根据路径打开excel文档
public boolean openExcelFile(String filename){
boolean openExcelFlg = true;
try {
activexcomponent = new ActiveXComponent("Excel.Application");
activexcomponent.setProperty("Visible", new Variant(false)); // 在后台打开
workbooks = activexcomponent.getProperty("Workbooks").toDispatch();
workbook = Dispatch.invoke(workbooks,"Open",Dispatch.Method,
new Object[] { filename, new Variant(false), new Variant(false)},// 是否以只读方式打开
new int[1]).toDispatch();
Dispatch sheets = Dispatch.get((Dispatch) workbook,"Sheets").toDispatch();
int sheetCnt = Dispatch.get( sheets , "Count").toInt();
for(int i = 0; i < sheetCnt; i ++ )
{
int SheetIdx = i +1;
Dispatch tmpsheet = Dispatch.invoke( sheets , "Item" , Dispatch.Get , new Object[]{SheetIdx} , new int[1] ).toDispatch();
if( tmpsheet != null )
{
oldSheetName.add( new String( Dispatch.get( tmpsheet , "Name" ).toString() ));
}
}
sheet = Dispatch.invoke(sheets, "Item", Dispatch.Get,new Variant[] { new Variant(1) },
new int[1]).toDispatch();
//激活sheet工作表
Dispatch.call(sheet, "Activate");
} catch (Exception e) {
System.out.println("打开EXCEL时出错...");
openExcelFlg = false;
e.printStackTrace();
}
return openExcelFlg;
}
public String getExcelApplicationVersion()
{
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
String version = new String( xl.getProperty("Version").toString() );
System.out.println("version=" + xl.getProperty("Version"));
xl.safeRelease();
return version;
}
}