求助!Java后台通过Jacob打印office遇到问题,word可以设置打印机,但excel和ppt设置就会报错

男人的暴走 2015-02-03 06:34:33
private static void printExcel(String filePath, String printerName){
ActiveXComponent app = null; //Excel运行程序对象
Dispatch xl = null; //Excel文档
try {
ComThread.InitSTA();
app = new ActiveXComponent("Excel.Application");
//设置打印机
if(StringUtils.isNotBlank(printerName)) {
app.setProperty("ActivePrinter", new Variant(printerName));
}
// 打开文档
Dispatch.put(app, "Visible", new Variant(false));
Dispatch workbooks = app.getProperty("Workbooks").toDispatch();
xl = Dispatch.call(workbooks, "Open", filePath).toDispatch();
//开始打印
Dispatch.callN(xl, "PrintOut");
}catch (Exception e){
e.printStackTrace();
}finally {
if(xl != null){
Dispatch.call(xl, "Close", false);
}
if(app != null){
app.invoke("Quit", new Variant[] {});
}
ComThread.Release();
}

这样写就会报错,错误信息如下:
com.jacob.com.ComFailException: Invoke of: ActivePrinter
Source:
Description:

at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
at com.jacob.com.Dispatch.invoke(Dispatch.java:498)
at com.jacob.com.Dispatch.put(Dispatch.java:580)
at com.jacob.activeX.ActiveXComponent.setProperty(ActiveXComponent.java:239)
at com.rayse.server.print.server.utils.PrintUtils.printExcel(PrintUtils.java:104)
at com.rayse.server.print.server.utils.PrintUtils.main(PrintUtils.java:174)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

求教,大神怎样在打印excel和ppt的时候设置通过那个打印机打印。求大神帮助,不胜感激
...全文
654 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 zhangxin961304090 的回复:
[quote=引用 2 楼 rui888 的回复:]
public  static void  print(String path)throws SystemException {   
		String PRINT_NAME="xxxxxxxxxxxx"; 
		 
        ComThread.InitSTA();
       
        ActiveXComponent xl=new ActiveXComponent("Excel.Application");
        try { 
        	
           
            Dispatch.put(xl, "Visible", new Variant(true));
          
            Dispatch workbooks = xl.getProperty("Workbooks").toDispatch(); 
            Dispatch excel=Dispatch.call(workbooks,"Open",path).toDispatch(); 
            
           
            Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
                    new Boolean(false),PRINT_NAME, new Boolean(true),Variant.VT_MISSING, ""});
            
          
           Dispatch.call(excel, "Close", new Variant(false));  
        } catch (Exception e) { 
            e.printStackTrace();
            throw new SystemException(e.getMessage());
        } finally{
            xl.invoke("Quit",new Variant[0]);
            
            ComThread.Release(); 
        } 

	}
谢谢这位朋友哈,后来又查了MSDN上的PrintOut方法,终于搞定了,多谢哈..[/quote] 能给说下 这个printout方法么? 我最近在做这个word转pdf的功能,

public  static void  print(String path,String outpath)throws Exception {   
	        String PRINT_NAME="pdfFactory Pro";//打印机名称
	        //初始化COM线程
	        ComThread.InitSTA();
	        ActiveXComponent doc=new ActiveXComponent("Word.Application");
	        try { 
	             
	            //设置是否显示打开word  
	            Dispatch.put(doc, "Visible", new Variant(true));
	            //打开具体的工作簿
	            Dispatch documents = doc.getProperty("Documents").toDispatch(); 
	            Dispatch word = Dispatch.call(documents,"Open",path).toDispatch(); 
	            System.out.println(1); 
	            //设置打印属性并打印
	            Dispatch.callN(word,"PrintOut",new Object[]{Variant.DEFAULT, Variant.DEFAULT, new Integer(1),
	                    new Boolean(false),PRINT_NAME, new Boolean(true),Variant.DEFAULT, ""});
	            System.out.println(2); 
	            //关闭文档
	           Dispatch.call(word, "Close", new Variant(false)); 
	           System.out.println(3);
	        } catch (Exception e) { 
	            e.printStackTrace();
	            throw new Exception();
	        } finally{
	        	doc.invoke("Quit",new Variant[0]);
	            //释放资源 
	            ComThread.Release(); 
	        } 
	    }
	    
	public static  void main(String[] args) {
		try {
			System.out.println(0);
			print("d:/101.docx","d:/1234.pdf");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
会报错 com.jacob.com.ComFailException: A COM exception has been encountered: At Invoke of: PrintOut Description: 80020005 / 类型不匹配。 at com.jacob.com.Dispatch.invokev(Native Method) at com.jacob.com.Dispatch.invokev(Dispatch.java:625) at com.jacob.com.Dispatch.callN(Dispatch.java:453) at cn.yyy.excel.SaveWordAspdf.print(SaveWordAspdf.java:59) at cn.yyy.excel.SaveWordAspdf.main(SaveWordAspdf.java:78) java.lang.Exception at cn.yyy.excel.SaveWordAspdf.print(SaveWordAspdf.java:67) at cn.yyy.excel.SaveWordAspdf.main(SaveWordAspdf.java:78) 帮忙看看?谢谢了
男人的暴走 2015-02-06
  • 打赏
  • 举报
回复
引用 2 楼 rui888 的回复:
public  static void  print(String path)throws SystemException {   
		String PRINT_NAME="xxxxxxxxxxxx"; 
		 
        ComThread.InitSTA();
       
        ActiveXComponent xl=new ActiveXComponent("Excel.Application");
        try { 
        	
           
            Dispatch.put(xl, "Visible", new Variant(true));
          
            Dispatch workbooks = xl.getProperty("Workbooks").toDispatch(); 
            Dispatch excel=Dispatch.call(workbooks,"Open",path).toDispatch(); 
            
           
            Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
                    new Boolean(false),PRINT_NAME, new Boolean(true),Variant.VT_MISSING, ""});
            
          
           Dispatch.call(excel, "Close", new Variant(false));  
        } catch (Exception e) { 
            e.printStackTrace();
            throw new SystemException(e.getMessage());
        } finally{
            xl.invoke("Quit",new Variant[0]);
            
            ComThread.Release(); 
        } 

	}
谢谢这位朋友哈,后来又查了MSDN上的PrintOut方法,终于搞定了,多谢哈..
tony4geek 2015-02-04
  • 打赏
  • 举报
回复
public  static void  print(String path)throws SystemException {   
		String PRINT_NAME="xxxxxxxxxxxx"; 
		 
        ComThread.InitSTA();
       
        ActiveXComponent xl=new ActiveXComponent("Excel.Application");
        try { 
        	
           
            Dispatch.put(xl, "Visible", new Variant(true));
          
            Dispatch workbooks = xl.getProperty("Workbooks").toDispatch(); 
            Dispatch excel=Dispatch.call(workbooks,"Open",path).toDispatch(); 
            
           
            Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
                    new Boolean(false),PRINT_NAME, new Boolean(true),Variant.VT_MISSING, ""});
            
          
           Dispatch.call(excel, "Close", new Variant(false));  
        } catch (Exception e) { 
            e.printStackTrace();
            throw new SystemException(e.getMessage());
        } finally{
            xl.invoke("Quit",new Variant[0]);
            
            ComThread.Release(); 
        } 
	}
男人的暴走 2015-02-03
  • 打赏
  • 举报
回复
自己先顶! 桃花潭水深千尺,不急汪伦送我情! 大神快来帮帮忙呀!很急

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧