精华内容
下载资源
问答
  • 首先下载并安装pandoc,以Windows为例 ... 修改本地Git安装目录下etc/gitconfig文件,增加如下配置: [diff "pandoc"] ... wdiff = diff --word-diff=color --unified=1 修改安装目录下etc/gitattributes *.do

    首先下载并安装pandoc,以Windows为例

    https://cowtransfer.com/s/95c61f7c4e4548

    修改本地Git安装目录下etc/gitconfig文件,增加如下配置:

    [diff "pandoc"]
      textconv=pandoc --to=markdown
      prompt = false
    [alias]
      wdiff = diff --word-diff=color --unified=1

    修改安装目录下etc/gitattributes

    *.doc	diff=pandoc
    *.DOC	diff=astextplain
    *.docx	diff=pandoc

    git wdiff test2.doc,如下图: 

     

     

     

    展开全文
  • 版本控制+文档比较

    2021-03-03 04:30:58
    火龙果软件工程技术中心 版本控制和文档修订留痕的比较是在...而且它支持和SharePoint中的文档版本做比较。(word果然是一个很强大的东西,只不过有80%的功能我们从来都没有用到过……)比如在文档库中的某篇文档,其
  • Jacob控制word文档

    2010-06-17 14:46:12
    研究这个的目的是想用java生成符合格式的word文档,文档内容大体上有三种格式,Heading1、Heading2和Normal,在word的文档结构图显示的样子如下 Heading 1 Heading 2 Heading 2 Heading 2 H...
    Jacob的下载、配置就不说了,提醒下,官方的提供的17版本似乎不支持jdk1.5,得下载19版的(CSDN上有)。
    研究这个的目的是想用java生成符合格式的word文档,文档内容大体上有三种格式,Heading1、Heading2和Normal,在word的文档结构图显示的样子如下
    Heading 1
    Heading 2
    Heading 2
    Heading 2
    Heading 1
    Heading 2
    Heading 2
    最初想直接生成,但发现设置格式实在是件头痛的事,本人对word编程不了解,试了几次均未实现Heading格式,不知道怎样设置才能在word的文档结构图中体现。改变思路,先定义个模板,然后直接替换模板中的内容,由于内容是不固定的(Heading 1个数不固定,每个Heading 1下的Heading 2个数不固定),因此不能直接替换,得根据需要拷贝模板文档中的格式到新文档,然后再替换为自己的内容。
    就在这个拷贝上折腾了我半天,用find选中拷贝,发现格式丢失了;把格式内容放在表格里再取表格内容拷贝,发现连同cell的那个框框一起拷贝过去了,不知道是不是我写错了,谁知道指点下,代码如下:
    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 range = Dispatch.get(cell, "Range").toDispatch();
    Dispatch.call(range, "Copy");
    最后采用了拷贝段落的方式解决了问题。

    最终思路:定义模板,每种样式一种标记占一个段落-根据实际需要拷贝段落内容到新文档-替换段落内容。这样就可以生成任何格式的word文档了。
    template.doc内容:

    $Title$
    $Heading 1$
    $Heading 2$

    $Normal$

    word控制参考代码:
    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.Dispatch;
    import com.jacob.com.Variant;

    public class MSWordManager {
    // word文档
    private Dispatch doc;

    // word运行程序对象
    private ActiveXComponent word;

    // 所有word文档集合
    private Dispatch documents;

    // 选定的范围或插入点
    private Dispatch selection;

    private boolean saveOnExit = true;

    /** *//**
    *
    * @param visible 为true表示word应用程序可见
    */
    public MSWordManager(boolean visible) {
    if (word == null) {
    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));
    }

    /** *//**
    * 从选定内容或插入点开始查找文本
    *
    * @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) {
    if (!find(toFindText))
    return false;
    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(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");
    }
    }

    /** *//**
    * 在指定行前面增加行
    *
    * @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[]) {
    MSWordManager msWordManager = new MSWordManager(true);
    try {
    msWordManager.openDocument("c:\\temp\\test.doc");
    msWordManager.copyParagraphFromAnotherDoc("c:\\temp\\template.doc",
    1);
    msWordManager.replaceAllText("$Title$", "标题");
    msWordManager.copyParagraphFromAnotherDoc("c:\\temp\\template.doc",
    2);
    msWordManager.replaceAllText("$Heading 1$", "一级目录");
    msWordManager.copyParagraphFromAnotherDoc("c:\\temp\\template.doc",
    3);
    msWordManager.replaceAllText("$Heading 2$", "二级目录");
    msWordManager.copyParagraphFromAnotherDoc("c:\\temp\\template.doc",
    4);
    msWordManager.replaceAllText("$Normal$", "正文");
    msWordManager.save("c:\\temp\\test.doc");
    } catch (Exception e) {
    e.printStackTrace();
    }
    msWordManager.close();
    }

    }
    展开全文
  • &#13;  项目经理在实际的工作过程中,比如要写文档方案,就需要对文档的修订版本进行管理和控制。在以前的工作中,笔者使用的是UltraEdit这个软件工具中的...不过,今天笔者安装使用了这个版本控制软件的Word...
        

     

      项目经理在实际的工作过程中,比如要写文档方案,就需要对文档的修订版本进行管理和控制。在以前的工作中,笔者使用的是UltraEdit这个软件工具中的Ultra Compare这个子工具来进行的文档版本的比较。然后,笔者想起软件开发中的源代码版本控制的Virtual SVN这个版本控制软件也同样能够进行文件的版本比较。不过,今天笔者安装使用了这个版本控制软件的Word文档版本对比的功能时,发现其使用的仍然是Word自带的文档修订和比较功能。下面就简要的说说如何进行对比:

      1、  打开Word(笔者使用的是Offcie 2013);

                           

      2、  切换到“视图”菜单选项卡,选择“导航窗格”窗口;

     

      3、  切换到“审阅”菜单选项卡,选择“修订”功能;

     

      4、  然后再选择“审阅”菜单选项卡里的“比较”功能;

     

      5、  在弹出的窗口中选择源文档和修订的文档;

     

      6、点击确定,打开比较窗口。点击“修订”窗口即可查看对比修订过的内容;

     

     

      上面大概描述了如果使用Word软件对文档的修订做出的版本修订功能的对比功能,希望对大家的实际工作中有帮助。

     

    展开全文
  • Word文档加密器是一款WORD文档加密器,支持加密不同版本WORD文档,防止未授权的用户阅读、复制、编辑、打印你的WORD文件。Word文档加密器内置四种不同的加密模式。非绑定模式--加密后的文件不绑定用户电脑,但用户...
  • Jacob控制word文档拷贝段落内容

    千次阅读 2013-11-25 19:04:28
    研究这个的目的是想用java生成符合格式的word文档,文档内容大体上有三种格式,Heading1、Heading2和Normal,在word的文档结构图显示的样子如下 Heading 1  Heading 2  Heading 2  Heading 2 H

    Jacob的下载、配置就不说了,提醒下,官方的提供的17版本似乎不支持jdk1.5,得下载19版的(CSDN上有)。
    研究这个的目的是想用java生成符合格式的word文档,文档内容大体上有三种格式,Heading1、Heading2和Normal,在word的文档结构图显示的样子如下
    Heading 1
       Heading 2
       Heading 2
       Heading 2
    Heading 1
      Heading 2
      Heading 2
    最初想直接生成,但发现设置格式实在是件头痛的事,本人对word编程不了解,试了几次均未实现Heading格式,不知道怎样设置才能在word的文档结构图中体现。改变思路,先定义个模板,然后直接替换模板中的内容,由于内容是不固定的(Heading 1个数不固定,每个Heading 1下的Heading 2个数不固定),因此不能直接替换,得根据需要拷贝模板文档中的格式到新文档,然后再替换为自己的内容。
    就在这个拷贝上折腾了我半天,用find选中拷贝,发现格式丢失了;把格式内容放在表格里再取表格内容拷贝,发现连同cell的那个框框一起拷贝过去了,不知道是不是我写错了,谁知道指点下,代码如下:
      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 range = Dispatch.get(cell, "Range").toDispatch();
       Dispatch.call(range, "Copy");
    最后采用了拷贝段落的方式解决了问题。

    最终思路:定义模板,每种样式一种标记占一个段落-根据实际需要拷贝段落内容到新文档-替换段落内容。这样就可以生成任何格式的word文档了。
    template.doc内容:

    $Title$

    $Heading 1$

    $Heading 2$

    $Normal$

    word控制参考代码:

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

    public class MSWordManager {
        
    // word文档
        private Dispatch doc;

        
    // word运行程序对象
        private ActiveXComponent word;

        
    // 所有word文档集合
        private Dispatch documents;

        
    // 选定的范围或插入点
        private Dispatch selection;

        
    private boolean saveOnExit = true;

        
    /** *//**
         * 
         * 
    @param visible 为true表示word应用程序可见
         
    */

        
    public MSWordManager(boolean visible) {
            
    if (word == null{
                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));
        }


        
    /** *//**
         * 从选定内容或插入点开始查找文本
         * 
         * 
    @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) {
            
    if (!find(toFindText))
                
    return false;
            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(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");
            }

        }


        
    /** *//**
         * 在指定行前面增加行
         * 
         * 
    @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[]) {
            MSWordManager msWordManager 
    = new MSWordManager(true);
            
    try {
                msWordManager.openDocument(
    "c:\\temp\\test.doc");
                msWordManager.copyParagraphFromAnotherDoc(
    "c:\\temp\\template.doc",
                        
    1);
                msWordManager.replaceAllText(
    "$Title$""标题");
                msWordManager.copyParagraphFromAnotherDoc(
    "c:\\temp\\template.doc",
                        
    2);
                msWordManager.replaceAllText(
    "$Heading 1$""一级目录");
                msWordManager.copyParagraphFromAnotherDoc(
    "c:\\temp\\template.doc",
                        
    3);
                msWordManager.replaceAllText(
    "$Heading 2$""二级目录");
                msWordManager.copyParagraphFromAnotherDoc(
    "c:\\temp\\template.doc",
                        
    4);
                msWordManager.replaceAllText(
    "$Normal$""正文");
                msWordManager.save(
    "c:\\temp\\test.doc");
            }
     catch (Exception e) {
                e.printStackTrace();
            }

            msWordManager.close();
        }


    }
    展开全文
  • git 版本控制 doc/docx 文档

    千次阅读 2018-01-11 13:37:15
    参考git 对 Microsoft Word 进行版本控制, 生成的文档图片不能自动转换,需要自己手动进行存储。
  • 版本控制 + 文档比较

    2007-09-12 14:51:00
    版本控制文档修订留痕的比较是在文档管理中很重要的组成部分。在SharePoint中,版本控制是默认支持的。在mdms2003中,利用word2003的文档修订功能,以及event handler实现了将文档的修订留痕保留到SharePoint中的...
  • Simul-整合Github和WordSimul是一个文档协作工具,把Github的优秀版本控制特性带到Word中来。该工具为长期与他人协作编辑文档的人群量身打造,比如学者、律师、记者、作家。以学术工作者为例,无论你是学生还是导师...
  • 关于版本控制

    2016-10-15 21:56:20
    快毕业了要写毕业论文,可能你的毕业论文要该很多个版本,第一稿、第二稿等等,如果你没有“版本控制“这个思想,可能你每一个稿都在一个word文档下更改,如果你哪一个突然需要之前几稿的内容或者需要变回之前的内容,...
  • git版本控制

    2019-07-02 15:47:10
    什么是版本控制系统 如果你用Microsoft Word写过长篇大论,那你一定有这样的经历: 想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新 的Word文件,再接着改,改到一定程度...
  • 起源-版本控制

    2021-01-04 11:57:04
    这句话怎么理解,我想每个用电脑的人都会有过,想修改word,excel文档等文件的时候,怕修改错了,都会将文件复制一份,以日期命名。这是很常规的操作,有需要的时候就翻一下之前日期的文件查看。很容易会造成文件...
  • 2)论文/技术文档(docx)写作过程中,不同文档版本的管理 3)最好能跨平台(win,mac)使用 解决方法 概要步骤: 1)安装与设置Git,创建版本库(repository) 2)安装Pandoc,配置Git以能管理Microsoft Word的...
  • 什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再...
  • 在文档集界面中显示Word文档,是文档大师的一个核心功能。 最近在 Win10 升级到最新版后,发现 无法正常显示Office 文档的问题。 一开始以为是Word版本问题,从2007升级到2016,问题仍没解决。 用关键字“ie11 ...
  • mysql 转成 word表结构文档

    千次阅读 2018-03-08 17:58:00
    mysql 转成 word表结构文档word版本如下:1. 下载工具,安装ODBC驱动https://download.csdn.net/download/winy_lm/102757402. 在PC端,控制面板--管理工具--双击ODBC数据源,如下:3. 然后打开下载后的文件,...
  • SOLIDWORKS 产品数据管理 (PDM) 解决方案可帮助您控制设计数据,...2. 打消关于版本控制和数据丢失的顾虑;3. 与多个地点的组织内外部的人员就设计进行分享和协作;4创建电子化工作流程以便规范、管理和优化开发、文...
  • Git----版本控制工具

    2020-06-01 17:13:43
    有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样: 过了一周,你想找回被删除的文字,但是已经记不清删除...
  • 大多数情况下,都是需要多个程序员同时开发同一个项目的,就好像多个程序员要同时修改一份word文档一样。所以,Git就是很多程序员的必备工具,本文介绍基本git命令 一、git是什么? Git是一个开源的分布式版本控制...
  • 最近有用户反映在Win10系统上安装 Office 2016 、2019等版本之后,每次打开Word文档都会提示“很抱歉,此功能看似已中断,并需要修复,请使用Windows 控制面板中的“程序和功能”选项修复Microsoft Office”。...
  • 版本控制又是文档管理中不可或缺的一个功能。但是,如果有了多个版本之后,没有一定的机制可以比较不同版本之间的差异,那么这部能不说是一个遗憾。很显然,WSS不会让这样的事情发生。 下面的截图基于WSS 3.0. 1....
  • C语言第四章基础练习题 精品文档 精品文档 收集于网络如有侵权请联系管理员删除 收集于网络如有侵权请联系管理员删除 精品文档 收集于网络如有侵权请联系管理员删除 第四章基础练习题 知识点 1C语句可分为以下五类 1...
  • 用ClearCase做二进制文件的版本控制

    千次阅读 2008-03-03 19:54:00
    Technorati 标签: 版本控制,软件工程,ClearCase ClearCase是IBM旗下...Source code本质上都是文本文件,软件可以很方便的进行变更管理,但如果希望对二进制文件(如Word、Excel文档、可执行程序等)进行版本控制,Cl
  • SVN版本控制的使用说明

    千次阅读 2007-09-08 19:18:00
    之前公司用的版本控制软件是CVS,最近换了SVN,昨天又换成了VSTS来进行项目开发。刚接触SVN的时候还不会用,所以自己就边参考中文官方站点的文档,加自己的实践,写了一份简明的使用指南。希望对使用SVN的朋友有用。...
  • ole_1.objectdata=lb_templl_ret=ole...2、Word文档经过多次编辑,其存盘后的文件迅速膨胀。笔者曾在含有数个图片的Word文档中,编辑了十多次图片后,文件大小由原来的160多KB涨到1.5MB,后来将该文件拷贝到新建文档...
  • oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 309
精华内容 123
关键字:

word文档版本控制