美文网首页
Java利用jacob实现打印Excel文件

Java利用jacob实现打印Excel文件

作者: 唏嘘的码农 | 来源:发表于2023-12-18 19:26 被阅读0次

package com.HeiBeiEDU.test2;

import java.io.File;

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.ComThread;

import com.jacob.com.Dispatch;

import com.jacob.com.Variant;

public class PrintDemo {

    public static boolean printOfficeFile(File f) {

        if (f != null && f.exists()) {

            String fileNameString = f.getName();

            String postfixString = Utils.getPostfix(fileNameString);

            if (postfixString.equalsIgnoreCase("xls") || postfixString.equalsIgnoreCase("xlsx")) {

                /**

                * 功能:实现excel打印工作

                */

                ComThread.InitSTA();

                ActiveXComponent xl = new ActiveXComponent("Excel.Application");

                try {

                    // System.out.println("version=" +

                    // xl.getProperty("Version"));

                    // 不打开文档

                    Dispatch.put(xl, "Visible", new Variant(false));

                    Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();

                    // 打开文档

                    Dispatch excel = Dispatch.call(workbooks, "Open", f.getAbsolutePath()).toDispatch();

                    // 横向打印(2013/05/24)

                    // Dispatch currentSheet = Dispatch.get(excel,

                    // "ActiveSheet")

                    // .toDispatch();

                    // Dispatch pageSetup = Dispatch

                    // .get(currentSheet, "PageSetup").toDispatch();

                    // Dispatch.put(pageSetup, "Orientation", new Variant(2));

                    // 每张表都横向打印2013-10-31

                    Dispatch sheets = Dispatch.get((Dispatch) excel, "Sheets").toDispatch();

                    // 获得几个sheet

                    int count = Dispatch.get(sheets, "Count").getInt();

                    // System.out.println(count);

                    for (int j = 1; j <= count; j++) {

                        Dispatch sheet = Dispatch

                                .invoke(sheets, "Item", Dispatch.Get, new Object[] { new Integer(j) }, new int[1])

                                .toDispatch();

                        Dispatch pageSetup = Dispatch.get(sheet, "PageSetup").toDispatch();

                        Dispatch.put(pageSetup, "Orientation", new Variant(2));

                        Dispatch.call(sheet, "PrintOut");

                    }

                    // 开始打印

                    if (excel != null) {

                        // Dispatch.call(excel, "PrintOut");

                        // 增加以下三行代码解决文件无法删除bug

                        Dispatch.call(excel, "save");

                        Dispatch.call(excel, "Close", new Variant(true));

                        excel = null;

                    }

                    xl.invoke("Quit", new Variant[] {});

                    xl = null;

                    return true;

                } catch (Exception e) {

                    e.printStackTrace();

                    return false;

                } finally {

                    // 始终释放资源

                    ComThread.Release();

                }

            } else if (postfixString.equalsIgnoreCase("doc") || postfixString.equalsIgnoreCase("docx")) {

                ComThread.InitSTA();

                ActiveXComponent wd = new ActiveXComponent("Word.Application");

                try {

                    // 不打开文档

                    Dispatch.put(wd, "Visible", new Variant(false));

                    Dispatch document = wd.getProperty("Documents").toDispatch();

                    // 打开文档

                    Dispatch doc = Dispatch

                            .invoke(document, "Open", Dispatch.Method, new Object[] { f.getAbsolutePath() }, new int[1])

                            .toDispatch();

                    // 开始打印

                    if (doc != null) {

                        Dispatch.call(doc, "PrintOut");

                        // 增加以下三行代码解决文件无法删除bug

                        Dispatch.call(doc, "save");

                        Dispatch.call(doc, "Close", new Variant(true));

                        doc = null;

                    }

                    wd.invoke("Quit", new Variant[] {});

                    wd = null;

                    return true;

                } catch (Exception e) {

                    e.printStackTrace();

                    return false;

                } finally {

                    // 始终释放资源

                    ComThread.Release();

                }

            } else {

                return false;

            }

        } else {

            return false;

        }

    }

    public static void main(String[] args) {

        PrintDemo.printOfficeFile(new File("hehe.xls"));

    }

}

https://www.cnblogs.com/vczh/p/5692527.html


另外需要下载jar包,和dll。dll文件放入JAVA_HOMT/bin下。

https://github.com/freemansoft/jacob-project/releases


[原创]jacob使用入门及问题解析 ~~~~~~~~~~~ 回网友

大家好啊! 我是寻觅

最近天气变化多,大家要多注意身体啊~~~

好了进如正题,最近在帮个朋友做java调用office的东东,花了些时间,终于搞定了

由于问题多多,现在把过程和大家分享:

首先,大家先要了解一下jacob ,官方的解释是Java COM Bridge,即java和

com组件间的桥梁(进一步了解com/dcom: http://docs.huihoo.com/com/

com一般表现为dll或exe等二进制文件,像我们呆会会用到的jacob.dll文件

这里说说为什么我们用java去操纵office(如:word)要使用com,而不直接

使用java去做?

首先,我们清楚office是建立在windows平台之上的,本身是一个软件,除了

他自己提供的宏似乎没有什么能对他进行直接的操作;在windows平台上为了

解决像这样的不同应用软件,通信缺乏通用api问题,推出了com的解决方案;

我们使用dll中的一组或多组相关的函数存取组件数据,总的合称为接口

具体到每个细节的实现称为方法;如果我们要调用接口里的方法,唯一的途径就是

调用指向接口的指针;

所以总的来说使用就是dll完成api的转换;

如果你听不懂,则称为废话(不懂没关系,会用就好,用久自然懂了);

开玩笑,呵呵

好了com讲完,我们开始我们的主要内容吧!

大家先下载这里

jacob_1.9.zip

里面的jacob.jar是我们要用的包

 jacob.dll就是我前面说的com组件

把包里的jacob.dll放到c:/windows/system32下

讲解麻烦,画个图大家看 好

值得注意的是,不同的版本的系统使用不同的dll文件

所以如果你编译成功,但运行失败一般是dll文件问题

遇到这种情况,可以到

http://downloads.sourceforge.net/jacob-project/jacob_1.9.zip?modtime=1109437002&big_mirror=0

下载其他的版本的 dll 文件。

先给大家个word的测试代码(经过更改该代码在我的机器上运行正常)

以后有会找时间,推出其他的office代码

import com.jacob.activeX.ActiveXComponent;

import  com.jacob.com.ComException;

import  com.jacob.com.Dispatch;

import  com.jacob.com.Variant;

public  class  WordDocumentProperties  {

    // 声明一个word对象

      private  ActiveXComponent objWord;

    // 声明四个word组件

      private  Dispatch custDocprops;

    private  Dispatch builtInDocProps;

    private  Dispatch document;

    private  Dispatch wordObject;

    public  WordDocumentProperties() {

    }

      /**

    * 打开word文挡

      */

      public  void  open(String filename)  {

        // 创建一个word对象

        objWord  =  new  ActiveXComponent( " Word.Application " );

        // 为wordobject组件附值

        wordObject  =  (Dispatch)(objWord.getObject());            // 改了这里

        // 生成一个只读方式的word文挡组件

        Dispatch.put(wordObject,  " Visible " ,  new  Variant( false ));

        // 获取文挡属性

        Dispatch documents  =  objWord.getProperty( " Documents " ).toDispatch();

        // 打开激活文挡

        document  =  Dispatch.call(documents,  " Open " , filename).toDispatch();

    }

    public  void  selectCustomDocumentProperitiesMode()  {

        custDocprops  =  Dispatch.get(document,  " CustomDocumentProperties " )

                .toDispatch();

    }

    public  void  selectBuiltinPropertiesMode()  {

        builtInDocProps  =  Dispatch.get(document,  " BuiltInDocumentProperties " )

                .toDispatch();

    }

      /**

    * 关闭文挡 

      */

      public  void  close()  {

        Dispatch.call(document,  " Close " );

    }

    public  String getCustomProperty(String cusPropName)  {

        try  {

            cusPropName  =  Dispatch.call((Dispatch) custDocprops,  " Item " ,

                    cusPropName).toString();

        }  catch  (ComException e)  {

            cusPropName  =  null ;

        }

        return  cusPropName;

    }

      public  String getBuiltInProperty(String builtInPropName)  {

        try  {

            builtInPropName  =  Dispatch.call((Dispatch) builtInDocProps,  " Item " ,

                    builtInPropName).toString();

        }  catch  (ComException e)  {

            builtInPropName  =  null ;

        }

        return  builtInPropName;

    }

    public  static  void  main(String[] args)  {

        try  {

            WordDocumentProperties jacTest  =  new  WordDocumentProperties();

            jacTest.open( " s.doc " );

            jacTest.selectCustomDocumentProperitiesMode();

            jacTest.selectBuiltinPropertiesMode();

            String custValue  =  jacTest.getCustomProperty( " Information Source " );

            String builtInValue  =  jacTest.getBuiltInProperty( " Author " );

            jacTest.close();

            System.out.println( " Document Val One:  "  +  custValue);

            System.out.println( " Document Author:  "  +  builtInValue);

        }  catch  (Exception e)  {

          System.out.println(e);

      }

    }

}

http://www.blogjava.net/lusm/archive/2007/03/27/106737.html

相关文章

网友评论

      本文标题:Java利用jacob实现打印Excel文件

      本文链接:https://www.haomeiwen.com/subject/dvwagdtx.html