Jacob 操作Word文档示例

Jacob库在Java中操作Word文档的实践指南 Jacob(Java COM Bridge)是一个开源库,它允许Java应用程序通过COM接口与Windows应用程序交互。使用Jacob,开发者可以在Java环境中操作如Microsoft Office等桌面软件,实现自动化办公的需求。COM(Component Object Model,组件对象模型)是由微软提出的一种软件组件架构,它定义了组件对象之间进行交互的标准。在Windows平台上,许多应用程序都支持通过COM接口与其他应用或服务进行通信。 阅读详情
package king.word;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class MSWordManager {
    private Dispatch doc; // word文档
    private ActiveXComponent word; // word运行程序对象
    private Dispatch documents; // 所有word文档集合
    private Dispatch selection; // 选定的范围或插入点
    private boolean saveOnExit = true;

    /**
     * 构造器 
     * @param visible 为true表示word应用程序可见
     */
    public MSWordManager(boolean visible) {
        if (word == null) { //word运行程序对象不存在,则创建
            word = new ActiveXComponent("Word.Application");
            word.setProperty("Visible", new Variant(visible));
        }
        if (documents == null) documents = word.getProperty("Documents").toDispatch();
    }

    /**
     * 设置退出时参数
     * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件
     */
    public void setSaveOnExit(boolean saveOnExit) {
        this.saveOnExit = saveOnExit;
    }

    /**
     * 创建一个新的word文档
     */
    public void createNewDocument() {
        doc = Dispatch.call(documents, "Add").toDispatch();
        selection = Dispatch.get(word, "Selection").toDispatch();
    }

    /**
     * 打开一个已存在的文档
     * @param docPath 文档路径
     */
    public void openDocument(String docPath) {
        closeDocument();
        doc = Dispatch.call(documents, "Open", docPath).toDispatch();
        selection = Dispatch.get(word, "Selection").toDispatch();
    }

    /**
     * 把选定的内容或插入点向上移动
     * @param pos 移动的距离
     */
    public void moveUp(int pos) {
        if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch();
        for (int i = 0; i < pos; i++)
            Dispatch.call(selection, "MoveUp");
    }

    /**
     * 把选定的内容或者插入点向下移动
     * @param pos 移动的距离
     */
    public void moveDown(int pos) {
        if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch();
        for (int i = 0; i < pos; i++)
            Dispatch.call(selection, "MoveDown");
    }

    /**
     * 把选定的内容或者插入点向左移动
     * @param pos 移动的距离
     */
    public void moveLeft(int pos) {
        if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch();
        for (int i = 0; i < pos; i++) {
            Dispatch.call(selection, "MoveLeft");
        }
    }

    /**
     * 把选定的内容或者插入点向右移动
     * @param pos 移动的距离
     */
    public void moveRight(int pos) {
        if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch();
        for (int i = 0; i < pos; i++)
            Dispatch.call(selection, "MoveRight");
    }

    /**
     * 把插入点移动到文件首位置
     */
    public void moveStart() {
        if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch();
        Dispatch.call(selection, "HomeKey", new Variant(6));
    }
    
    /**
     * 把插入点移动到文件末尾
     */
    public void moveEnd() {
        if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch();
        Dispatch.call(selection, "EndKey", new Variant(6));
    }

    /**
     * 从选定内容或插入点开始查找文本
     * @param toFindText 要查找的文本
     * @return boolean true-查找到并选中该文本,false-未查找到文本
     */
    public boolean find(String toFindText) {
        if (toFindText == null || toFindText.equals("")) return false;
        // 从selection所在位置开始查询
        Dispatch find = word.call(selection, "Find").toDispatch();
        // 设置要查找的内容
        Dispatch.put(find, "Text", toFindText);
        // 向前查找
        Dispatch.put(find, "Forward", "True");
        // 设置格式
        Dispatch.put(find, "Format", "True");
        // 大小写匹配
        Dispatch.put(find, "MatchCase", "True");
        // 全字匹配
        Dispatch.put(find, "MatchWholeWord", "True");
        // 查找并选中
        return Dispatch.call(find, "Execute").getBoolean();
    }

    /**
     * 把选定选定内容设定为替换文本
     * @param toFindText 查找字符串
     * @param newText 要替换的内容
     * @return
     */
    public boolean replaceText(String toFindText, String newText) {
        // 找不到选定文本则返回false
        if (!find(toFindText)) return false; 
        // 若找到则替换并返回true
        Dispatch.put(selection, "Text", newText);
        return true;
    }

    /**
     * 全局替换文本
     * @param toFindText 查找字符串
     * @param newText 要替换的内容
     */
    public void replaceAllText(String toFindText, String newText) {
        while (find(toFindText)) { //查找并选中文本
            Dispatch.put(selection, "Text", newText);
            Dispatch.call(selection, "MoveRight");
        }
    }

    /**
     * 在当前插入点插入字符串
     * @param newText 要插入的新字符串
     */
    public void insertText(String newText) {
        Dispatch.put(selection, "Text", newText);
    }

    /**
     * 替换图片
     * @param toFindText 要查找的字符串
     * @param imagePath 图片路径
     * @return
     */
    public boolean replaceImage(String toFindText, String imagePath) {
        if (!find(toFindText)) return false; //若找到则选中
        Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
        return true;
    }

    /**
     * 全局替换图片
     * @param toFindText 查找字符串
     * @param imagePath 图片路径
     */
    public void replaceAllImage(String toFindText, String imagePath) {
        while (find(toFindText)) {
            Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture",
                    imagePath);
            Dispatch.call(selection, "MoveRight");
        }
    }

    /**
     * 在当前插入点插入图片
     * @param imagePath 图片路径
     */
    public void insertImage(String imagePath) {
        Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
    }

    /**
     * 合并单元格
     * 
     * @param tableIndex
     * @param fstCellRowIdx
     * @param fstCellColIdx
     * @param secCellRowIdx
     * @param secCellColIdx
     */
    public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx, int secCellRowIdx,
            int secCellColIdx) {
        // 所有表格
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        Dispatch fstCell =
                Dispatch.call(table, "Cell", new Variant(fstCellRowIdx), new Variant(fstCellColIdx))
                        .toDispatch();
        Dispatch secCell =
                Dispatch.call(table, "Cell", new Variant(secCellRowIdx), new Variant(secCellColIdx))
                        .toDispatch();
        Dispatch.call(fstCell, "Merge", secCell);
    }

    /**
     * 在指定的单元格里填写数据----------------
     * 
     * @param tableIndex
     * @param cellRowIdx
     * @param cellColIdx
     * @param txt
     */
    public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx, String txt) {
        // 所有表格
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        Dispatch cell =
                Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx))
                        .toDispatch();
        Dispatch.call(cell, "Select");
        Dispatch.put(selection, "Text", txt);
    }

    /** */
    /**
     * 在当前文档拷贝数据
     * 
     * @param pos
     */
    public void copy(String toCopyText) {
        moveStart();
        if (this.find(toCopyText)) {
            Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
            Dispatch.call(textRange, "Copy");
        }
    }

    /** */
    /**
     * 在当前文档粘帖剪贴板数据
     * 
     * @param pos
     */
    public void paste(String pos) {
        moveStart();
        if (this.find(pos)) {
            Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
            Dispatch.call(textRange, "Paste");
        }
    }

    /** */
    /**
     * 在当前文档指定的位置拷贝表格
     * 
     * @param pos 当前文档指定的位置
     * @param tableIndex 被拷贝的表格在word文档中所处的位置
     */
    public void copyTable(String pos, int tableIndex) {
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        Dispatch range = Dispatch.get(table, "Range").toDispatch();
        Dispatch.call(range, "Copy");
        if (this.find(pos)) {
            Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
            Dispatch.call(textRange, "Paste");
        }
    }

    /** */
    /**
     * 在当前文档末尾拷贝来自另一个文档中的段落
     * 
     * @param anotherDocPath 另一个文档的磁盘路径
     * @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始)
     */
    public void copyParagraphFromAnotherDoc(String anotherDocPath, int paragraphIndex) {
        Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); // 取得当前文档的内容
        Dispatch.call(wordContent, "InsertAfter", "$selection$"); // 插入特殊符定位插入点
        copyParagraphFromAnotherDoc(anotherDocPath, paragraphIndex, "$selection$");
    }

    /** */
    /**
     * 在当前文档指定的位置拷贝来自另一个文档中的段落
     * 
     * @param anotherDocPath 另一个文档的磁盘路径
     * @param tableIndex 被拷贝的段落在另一格文档中的序号(从1开始)
     * @param pos 当前文档指定的位置
     */
    public void copyParagraphFromAnotherDoc(String anotherDocPath, int paragraphIndex, String pos) {
        Dispatch doc2 = null;
        try {
            doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
            Dispatch paragraphs = Dispatch.get(doc2, "Paragraphs").toDispatch();
            Dispatch paragraph =
                    Dispatch.call(paragraphs, "Item", new Variant(paragraphIndex)).toDispatch();
            Dispatch range = Dispatch.get(paragraph, "Range").toDispatch();
            Dispatch.call(range, "Copy");
            if (this.find(pos)) {
                Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
                Dispatch.call(textRange, "Paste");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (doc2 != null) {
                Dispatch.call(doc2, "Close", new Variant(saveOnExit));
                doc2 = null;
            }
        }
    }

    /** */
    /**
     * 在当前文档指定的位置拷贝来自另一个文档中的表格
     * 
     * @param anotherDocPath 另一个文档的磁盘路径
     * @param tableIndex 被拷贝的表格在另一格文档中的序号(从1开始)
     * @param pos 当前文档指定的位置
     */
    public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex, String pos) {
        Dispatch doc2 = null;
        try {
            doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
            Dispatch tables = Dispatch.get(doc2, "Tables").toDispatch();
            Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
            Dispatch range = Dispatch.get(table, "Range").toDispatch();
            Dispatch.call(range, "Copy");
            if (this.find(pos)) {
                Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
                Dispatch.call(textRange, "Paste");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (doc2 != null) {
                Dispatch.call(doc2, "Close", new Variant(saveOnExit));
                doc2 = null;
            }
        }
    }

    /** */
    /**
     * 在当前文档指定的位置拷贝来自另一个文档中的图片
     * 
     * @param anotherDocPath 另一个文档的磁盘路径
     * @param shapeIndex 被拷贝的图片在另一格文档中的位置
     * @param pos 当前文档指定的位置
     */
    public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex, String pos) {
        Dispatch doc2 = null;
        try {
            doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
            Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch();
            Dispatch shape = Dispatch.call(shapes, "Item", new Variant(shapeIndex)).toDispatch();
            Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch();
            Dispatch.call(imageRange, "Copy");
            if (this.find(pos)) {
                Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
                Dispatch.call(textRange, "Paste");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (doc2 != null) {
                Dispatch.call(doc2, "Close", new Variant(saveOnExit));
                doc2 = null;
            }
        }
    }

    /** */
    /**
     * 创建表格
     * 
     * @param pos 位置
     * @param cols 列数
     * @param rows 行数
     */
    public void createTable(int numCols, int numRows) { // (String pos, int numCols, int numRows) {
    // if (!find(pos)) {
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        Dispatch range = Dispatch.get(selection, "Range").toDispatch();
        Dispatch newTable =
                Dispatch.call(tables, "Add", range, new Variant(numRows), new Variant(numCols))
                        .toDispatch();
        Dispatch.call(selection, "MoveRight");
        moveEnd();
        // }
    }

    /** */
    /**
     * 在指定行前面增加行
     * 
     * @param tableIndex word文件中的第N张表(从1开始)
     * @param rowIndex 指定行的序号(从1开始)
     */
    public void addTableRow(int tableIndex, int rowIndex) {
        // 所有表格
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
        Dispatch row = Dispatch.call(rows, "Item", new Variant(rowIndex)).toDispatch();
        Dispatch.call(rows, "Add", new Variant(row));
    }

    /** */
    /**
     * 在第1行前增加一行
     * 
     * @param tableIndex word文档中的第N张表(从1开始)
     */
    public void addFirstTableRow(int tableIndex) {
        // 所有表格
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
        Dispatch row = Dispatch.get(rows, "First").toDispatch();
        Dispatch.call(rows, "Add", new Variant(row));
    }

    /** */
    /**
     * 在最后1行前增加一行
     * 
     * @param tableIndex word文档中的第N张表(从1开始)
     */
    public void addLastTableRow(int tableIndex) {
        // 所有表格
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
        Dispatch row = Dispatch.get(rows, "Last").toDispatch();
        Dispatch.call(rows, "Add", new Variant(row));
    }

    /** */
    /**
     * 增加一行
     * 
     * @param tableIndex word文档中的第N张表(从1开始)
     */
    public void addRow(int tableIndex) {
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
        Dispatch.call(rows, "Add");
    }

    /** */
    /**
     * 增加一列
     * 
     * @param tableIndex word文档中的第N张表(从1开始)
     */
    public void addCol(int tableIndex) {
        // 所有表格
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
        Dispatch.call(cols, "Add").toDispatch();
        Dispatch.call(cols, "AutoFit");
    }

    /** */
    /**
     * 在指定列前面增加表格的列
     * 
     * @param tableIndex word文档中的第N张表(从1开始)
     * @param colIndex 指定列的序号 (从1开始)
     */
    public void addTableCol(int tableIndex, int colIndex) {
        // 所有表格
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
        System.out.println(Dispatch.get(cols, "Count"));
        Dispatch col = Dispatch.call(cols, "Item", new Variant(colIndex)).toDispatch();
        // Dispatch col = Dispatch.get(cols, "First").toDispatch();
        Dispatch.call(cols, "Add", col).toDispatch();
        Dispatch.call(cols, "AutoFit");
    }

    /** */
    /**
     * 在第1列前增加一列
     * 
     * @param tableIndex word文档中的第N张表(从1开始)
     */
    public void addFirstTableCol(int tableIndex) {
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
        Dispatch col = Dispatch.get(cols, "First").toDispatch();
        Dispatch.call(cols, "Add", col).toDispatch();
        Dispatch.call(cols, "AutoFit");
    }

    /** */
    /**
     * 在最后一列前增加一列
     * 
     * @param tableIndex word文档中的第N张表(从1开始)
     */
    public void addLastTableCol(int tableIndex) {
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        // 要填充的表格
        Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
        // 表格的所有行
        Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
        Dispatch col = Dispatch.get(cols, "Last").toDispatch();
        Dispatch.call(cols, "Add", col).toDispatch();
        Dispatch.call(cols, "AutoFit");
    }

    /** */
    /**
     * 自动调整表格
     * */
    public void autoFitTable() {
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        int count = Dispatch.get(tables, "Count").toInt();
        for (int i = 0; i < count; i++) {
            Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispatch();
            Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
            Dispatch.call(cols, "AutoFit");
        }
    }

    /** */
    /**
     * 调用word里的宏以调整表格的宽度,其中宏保存在document下
     * */
    public void callWordMacro() {
        Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
        int count = Dispatch.get(tables, "Count").toInt();
        Variant vMacroName = new Variant("Normal.NewMacros.tableFit");
        Variant vParam = new Variant("param1");
        Variant para[] = new Variant[] {vMacroName};
        for (int i = 0; i < para.length; i++) {
            Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispatch();
            Dispatch.call(table, "Select");
            Dispatch.call(word, "Run", "tableFitContent");
        }
    }

    /** */
    /**
     * 设置当前选定内容的字体
     * 
     * @param boldSize
     * @param italicSize
     * @param underLineSize 下划线
     * @param colorSize 字体颜色
     * @param size 字体大小
     * @param name 字体名称
     */
    public void setFont(boolean bold, boolean italic, boolean underLine, String colorSize,
            String size, String name) {
        Dispatch font = Dispatch.get(selection, "Font").toDispatch();
        Dispatch.put(font, "Name", new Variant(name));
        Dispatch.put(font, "Bold", new Variant(bold));
        Dispatch.put(font, "Italic", new Variant(italic));
        Dispatch.put(font, "Underline", new Variant(underLine));
        Dispatch.put(font, "Color", colorSize);
        Dispatch.put(font, "Size", size);
    }

    /** */
    /**
     * 文件保存或另存为
     * 
     * @param savePath 保存或另存为路径
     */
    public void save(String savePath) {
        Dispatch.call((Dispatch) Dispatch.call(word, "WordBasic").getDispatch(), "FileSaveAs",
                savePath);
    }

    /** */
    /**
     * 关闭当前word文档
     * */
    public void closeDocument() {
        if (doc != null) {
            Dispatch.call(doc, "Save");
            Dispatch.call(doc, "Close", new Variant(saveOnExit));
            doc = null;
        }
    }

    /** */
    /**
     * 关闭全部应用
     * */
    public void close() {
        closeDocument();
        if (word != null) {
            Dispatch.call(word, "Quit");
            word = null;
        }
        selection = null;
        documents = null;
    }

    /** */
    /**
     * 打印当前word文档
     */
    public void printFile() {
        if (doc != null) {
            Dispatch.call(doc, "PrintOut");
        }
    }

    public static void main(String args[]) throws Exception {
        MSWordManager msWordManager = new MSWordManager(true);
        msWordManager.createNewDocument();
        msWordManager.insertText("aaaaaaaaaaaaaaaaaaaaa");
        msWordManager.moveEnd();
        msWordManager.close();
    }
}

jacob操作word(超详细) Jacob下载地址:http://sourceforge.net/project/showfiles.phpgroup_id=109543&package_id=118368 1、把jacob.dll文件,复制到 windows\system32 目录下。(注:我用的时候这个方法不能运行) 2、 把jacob.dll放入 Java\jdk1.5.0_06\jre\bin目录下.把jacob.jar放入 Java\jdk1.5.0_0\jre\lib\ext 目录下.可以正常运行。 3、把jacob.dll放入 \glc\src目录下.把jacob.jar放入WEB-INF\lib目录下,也是可以正常运行。 立即下载

相关推荐

树莓派5使用CSI摄像头 | 树莓派5接上CSI摄像头后命令行操作显示检测无设备

此系列用于记录树莓派5的一些操作,这篇文章讲述树莓派5如何使用CSI摄像头。

beyourself_he的博客 8796

jacob操作office分享

现在的项目中操作word文件比较多,word文件的加密解密,转换为各种格式,插入图片,添加水印、html转word等等各种东西,大家也都知道,java语言是不能直接操作word或者excel的,不像C#,可以调用VBA的类来直接操作office。      目前java也有一些操作office的开源框架,比如poi,这个没怎么研究过,我估摸着它是通过解析office的xml文档模型来操作off

ITNoobie的博客 1586

【网络协议】TCP的拥塞控制机制

前言 计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。 所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网 拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。 慢开始和拥塞避免 发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度

兰亭风雨的专栏 1万+

使用Jacob实现将Word文件转换为Pdf文件

Jacob 是一个 Java 库,可让 Java 应用程序与 Microsoft Windows DLL 或 COM 库进行通信,它使用 Jacob Java 类通过 JNI 与之通信的自定义 DLL 来实现这一点,可以借助它实现将Word文件转换为PDF文件

ranxiaotop的博客 4976

Dataset - DeepFashion 服装数据集

Dataset - DeepFashion 服装数据集 [Dataset - DeepFashion] [Project - DeepFashion] 1. 服装类别和属性预测集 [Category - Attribute 下载] [百度网盘] 289,222 张服装图片 clothes images; 50 个服装类别 clothing categories 1,000 ...

长风破浪会有时,直挂云帆济沧海 2万+

LVGL v9的lv_scale控件实战:5分钟打造动态仪表盘(附完整代码)

本文详细介绍了LVGL v9中lv_scale控件的实战应用,通过5个关键步骤快速打造动态仪表盘。文章涵盖核心特性解析、代码实现、样式定制及性能优化,适用于工业HMI、智能家居等场景,并附完整代码示例。

gin88的博客 262

使用JACOB操作word文档并实现打印

jar文件需放入到自己的项目中,dll文件分别放入到 jdk/bin 目录下和 jdk/jre/bin 的目录下(俩个dll文件一个支持64位系统,一个支持32位系统,根据自己的操作系统选择)。由于项目需要,需要在后台对word文档中的书签进行重新填值,并进行打印。一开始已经使用Spire.Doc for Java实现了这个效果,但是这个插件是收费的,公司不想买,于是就在网上找了一段时间开源的插件,最终用了JACOB这个插件。下面记录一下实现的方法。版本,1.19、1.20版本需更高的jdk版本支持。

narito的博客 1618

ESP-IDF 5.4下esp32-camera组件编译报错?手把手教你解决头文件缺失问题

本文详细解析了ESP-IDF 5.4环境下esp32-camera组件编译时出现的头文件缺失问题,提供了从目录结构优化、CMake配置到VSCode智能感知设置的完整解决方案。针对第三方组件集成难题,文章特别强调了PRIV_REQUIRES依赖声明和路径配置的关键作用,帮助开发者高效解决编译错误并建立稳定的开发环境。

weixin_28829629的博客 309

java通过jacob操作word的一些实践

前言 JACOB(java -com bridge)是一个 JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。关于JACOB的很多基础知识网上也是很多文章介绍,我也是根据这些资料进行开发的。粘上两个我保存的文章 jacob的使用方法总结 java操作word文档(jacob) 本文主要是讲解当遇到网上查找不到的word方法时候,需要怎么处理,以及自己使用过程中的注意事项。 正文 1、网上关于JACOB的介绍很多,但是都是基础功能没有官方

l13020227067的博客 1197

从Podfile到分享成功:ShareSDK小红书模块集成全流程实战(附视频分享代码)

本文详细介绍了iOS应用如何通过ShareSDK集成小红书分享功能的全流程,包括环境配置、SDK初始化、图片和视频分享实现,以及常见问题排查和性能优化策略。特别针对视频分享这一高频需求场景,提供了完整的代码示例和实战技巧,帮助开发者快速实现社交分享功能。

weixin_42540248的博客 226

【26美赛F题 To Gen-AI, or Not To Gen-AI】(MCM/ICM)思路解析及代码分享

摘要:本文研究生成式人工智能(Gen-AI)对三类职业(STEM、技能型工艺、艺术)的影响,建立量化模型预测未来10-20年岗位需求变化。通过分析AI替代效应($R_{sub}(t)$)和增强效应($R_{enh}(t)$),提出差异化高校课程调整策略:STEM专业需加强AI集成能力,技能型工艺专业应结合智能工具与实操训练,艺术专业需平衡AI创作辅助与原创性培养。模型表明,高校通过针对性课程优化可提升毕业生在AI时代的就业竞争力,为教育决策提供数据支持。(149字)

一键难忘的博客 636

Jacob操作Word文档转换-XXOO

前言 JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32程序库。 一、准备 <!--添加本地的jacob.jar包--> <dependency> <groupId>com.jacob</groupId> <artifactId>jacob</artifactId> <version>1.19</version> <

JueDream的博客 641

RK3588高速接口实战-PCIE

摘要: RK3588的PCIe接口支持PCIe 3.0x4和PCIe 2.1x1/x2,具备Root Complex和Endpoint模式,适用于NVMe SSD、5G模块等高速设备。硬件设计需注意85Ω/100Ω阻抗匹配、220nF AC耦合电容及100MHz参考时钟。设备树需配置控制器节点、PHY模式和IOMMU映射(RC模式用iommu-map,EP模式用iommus)。调试时可通过lspci检查链路状态,dmesg查看训练日志,perf分析性能。常见问题包括设备识别失败(检查复位时序、PHY配置)、

weiyvyy的博客 505

使用jacob操作word文档

使用jacob要记住用ActiveXComponent调用word的quit方法 1 新建空白的word文档,加入内容,并保存 public class NewAWord{ public NewAWord(){ // 初始化com的线程,非常重要!!使用结束后要调用 release方法 ComThread.InitSTA(); // 初始化word应用程序,...

287

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

利用Java-JACOB操作WORD文档2

利用Java-JACOB操作WORD文档2 JACOB是一个 JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。如果你要对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(http://sourceforge.net/projects/jacob- project/)的一个开源项目,本文使用的版本是1.10.1。 生成WORD文档的简单讲解: 1. 初始

bb6893058的专栏 252

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java使用jacob操作word文档

ava使用jacob操作word文档 java调用com组件操作word使用总结(jacob) 简单描述    在此处输入简单摘要 特别声明:使用java-com技术可以完成任何VBA可以完成的office文档操作;  一、准备工作    先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通

mincheat的专栏 5914

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jacob操作word文档

Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。Jacob下载的地址为: http://sourceforge.net/project/showfiles.php?group_id=109543&amp;package_id=118368配置:(1...

天明破晓 246

java jacob 操作word 文档,进行写操作,如生成表格,添加 图片

jacob-1.15-M3.zip   jacob-1.15-M3-x86.dll copy 到c://windows/system32引入jacob.jar  示例代码             import java.io.File;import com.jacob.activeX.ActiveXComponen

jixiuffff的专栏 2万+

java jacob 操作word 文档,进行写操作,如生成表格,添加 图片

jacob-1.15-M3.zip  jacob-1.15-M3-x86.dll copy 到c:\\windows\system32 引入jacob.jar 示例代码     [java] view plain copy  print? import java.io.File;     importcom.jaco

zzl7412的博客 4273

java操作word文档(jacob,poi)

项目需要,用户从系统里面下载word文档,该文档进行了填写限制和加密,用户只能在固定位置填写内容。现要求系统验证上传的附件是否从系统上下载下来的。 思路:系统上面的文档都加入一个固定书签,用户上传文档的时候,检验文档里是否包含这个书签。 采用jacob操作word文档JACOB(java -com bridge)是一个 JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象

zhuxw技术博客 7772

如何利用Java-JACOB操作WORD文档

<br />JACOB是一个JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。如果你要 对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(http://sourceforge.net/projects/jacob- project/)的一个开源项目,本文使用的版本是1.10.1。<br /><br /> 因为在项目中用到了这个技术,但是在网上没有查到很符合题目的文

The 优快云 Blog With Matol Poet ! 1700
上一篇: Java监视系统剪贴板
下一篇: HttpClient使用详解
KingLearnJava
博客等级 码龄12年 93粉丝 84原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值