Invalid header signature POI的解决方案

这一般是由于第三方工具自动生成的excel文件的文件不太规范,你可以手动打开Excel(如果可以打开)再另存为-》保存Excel就可以了,这里提供一种自动解决方案,但是就必须在Windows平台下, 就是使用jaWin, 用这种方法可以提高程序并行化速度, 我的代码如下

/***
 * SheetCopy.java
 * 
 * Create Version: $version:1.1
 * Author: tangjw
 * Create Date: 2011-4-1
 * 
 * Copyright (c) 2009 上海恩方信息技术有限公司 Corporation. All Right Reserved.
 */
package utils;

import org.jawin.COMException;
import org.jawin.DispatchPtr;
import org.jawin.win32.Ole32;


/**
 * MonitorAndReport--en.fang.report.util.SheetCopy.java
 * ------------------------------------
 * @author Administrator
 * @create 2011-4-1上午10:33:39
 * @修改 Administrator
 * @version $version:1.1  $date:2011-4-1上午10:33:39
 * -------------------------------------
 * TODO
 */
public class SheetCopy implements Runnable{
	
	private  String xlsfile;
	private  String saveAsFile;
	private  int  isContinue=0;
	
	/**
	 * @return String xlsfile
	 */
	public String getXlsfile() {
		return xlsfile;
	}

	/**
	 * @param String xlsfile
	 */
	public void setXlsfile(String xlsfile) {
		this.xlsfile = xlsfile;
	}
	
	public int getIsContinue() {
		return isContinue;
	}

	public void setIsContinue(int isContinue) {
		this.isContinue = isContinue;
	}

	/**
	 * @return String saveAsFile
	 */
	public String getSaveAsFile() {
		return saveAsFile;
	}
	/**
	 * @param String saveAsFile
	 */
	public void setSaveAsFile(String saveAsFile) {
		this.saveAsFile = saveAsFile;
	}
	
	public  void saveCopyAs(String xlsfile, String saveAsFile){
		try  
	      {   
	    	  Ole32.CoInitialize();
		      DispatchPtr app = new DispatchPtr("Excel.Application");//新建一个对象

		      app.put("Visible", false);   
		      DispatchPtr preses = (DispatchPtr)app.get("Workbooks");//取的当前的进程
			  DispatchPtr pres = (DispatchPtr) preses.invoke("open", xlsfile);//打开ppt//,"MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse");
			  pres.invoke("SaveCopyAs",saveAsFile);
			  pres.invoke("Close", false);
			  app.invoke("Quit");
	      }   
	      catch (Exception e)   
	      {   
	          e.printStackTrace();   
	      }   
	      finally  
	      {   
	    	  try {
				Ole32.CoUninitialize();
			} catch (COMException e) {
				e.printStackTrace();
			}finally{
				isContinue = 1;
			}
	      }   
	}
	@Override
	public void run() {
		saveCopyAs(xlsfile, saveAsFile);
	}

}

 

package utils;

/**
 * 说明:
 *	 1,将source目录下jacob.dll复制一份到使用的jdk/bin下
 *   2 ,复制一份到c:/windows/system32 下
 * @author Administrator
 *
 */
public class SheetWorkBookUtils {
	/**
	 * 绝对地址另存
	 * @param xlsfile
	 * @param saveAsFile
	 */
	@SuppressWarnings({ "deprecation", "static-access" })
	public static void saveCopyAs(String xlsfile, String saveAsFile){
		SheetCopy sc = new SheetCopy();
		sc.setXlsfile(xlsfile);
		sc.setSaveAsFile(saveAsFile);
		Thread t = new Thread(sc,"sc"+System.currentTimeMillis());
		Thread tmain = Thread.currentThread();
		try{
			t.start();
			while(sc.getIsContinue() != 1){
				tmain.sleep(100);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			t.stop();
		}
		
	}
	public static void main(String[] args) {
		SheetWorkBookUtils.saveCopyAs("D:/tt.xls", "D:/tt2.xls");
		
	}
	  
}

 

 

呵呵,这样就可以了!

 

你可能感兴趣的:(windows,F#,Excel)