求助!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的时候设置通过那个打印机打印。求大神帮助,不胜感激
...全文
735 4 打赏 收藏 举报
写回复
用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
  • 打赏
  • 举报
回复 1
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
  • 打赏
  • 举报
回复
自己先顶! 桃花潭水深千尺,不急汪伦送我情! 大神快来帮帮忙呀!很急
基于连续与断续导通模式统一分析框架的高增益双向DC-DC变换器闭环控制与硬件实现研究(Matlab、Simulink、PSCD)内容概要:本文围绕“基于连续与断续导通模式统一分析框架的高增益双向DC-DC变换器闭环控制与硬件实现”展开研究,重点构建了适用于连续导通模式(CCM)与断续导通模式(DCM)的统一建模与控制理论框架,实现了高增益、双向能量流动的DC-DC变换器在不同工况下的稳定运行与高性能控制。研究结合Matlab、Simulink与PSCAD工具完成系统建模、闭环控制器设计、仿真验证及硬件原型开发,涵盖主电路拓扑分析、状态空间平均法建模、模式切换平滑控制策略、电压电流双闭环调节、软启动与保护机制等内容,并通过仿真与实验验证了所提方法在动态响应、效率优化与稳定性方面的优越性。; 适合人群:具备电力电子、自动控制或电气工程相关背景,从事新能源、储能、电动汽车等领域研究的研发人员及研究生。; 使用场景及目标:①掌握高增益双向DC-DC变换器的统一建模范式与模式切换控制技术;②学习如何在Matlab/Simulink/PSCAD中实现复杂电力电子系统的建模、仿真与控制器设计;③为实际工程项目中的电源变换系统开发提供理论支持与实践参考。; 阅读建议:建议结合文中提供的仿真模型与代码资源,逐步复现仿真过程,并重点关注CCM与DCM模式切换时的控制策略设计与稳定性分析,有条件者可进一步搭建硬件平台进行实验验证。

81,108

社区成员

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

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