java判断excel能否正常打开

项目开发中遇到过通过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;
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值