【问题标题】:Is there a correct way to save document from Javascript Api for Office in Word Desktop client?是否有正确的方法在 Word 桌面客户端中从 Javascript Api for Office 保存文档?
【发布时间】:2016-02-12 16:35:50
【问题描述】:

上下文

我正在使用 JavaScript API for Office (v 1.1) 编写 Office Word 任务窗格插件。

我的系统:

  • 微软视窗 8.1
  • Microsoft Visual Studio 2015 社区
  • 适用于 Office 的最新 Visual Studio 工具
  • Microsoft Office Word Service Pack 1(桌面)

问题

我面临的问题是将打开的文档保存在客户端计算机中。我已经搜索了信息,但仍然没有成功...

我想知道是否有办法从 JavaScript API 中保存 Word 文档,Office.Context.Document 中只有几个方法:


代码

我写了一个解决方案,但我不喜欢通过创建 Word.Application Activex 来保存文档的方式:

$scope.saveDocument = function (draft) {
    // Draft is a part of the window title
    // Example : 
    // ----------
    // If word window title shows "B0306-000-2012.docx - Word", 
    // draft could be "B0306-000-2012"
    try {
        var Word = new ActiveXObject("Word.Application");
        if (Word) {
            var spanish = Word.Language == 3082;
            var Tasks = Word.Tasks;
            for (var i = 0; i < Tasks.Count; i++) {
                var Task = Tasks.Item(i + 1);
                if (Task.Visible && Task.Name.indexOf(draft) >= 0) {
                    var shell = new ActiveXObject("WScript.Shell");
                    var activated = shell.AppActivate(Task.Name, 2000); //Espera 2 segundos para activar la aplicación
                    shell.SendKeys(spanish ? "^g" : "^s", 3000); //Envía el comando Ctrl + (G / S) según el idioma de la aplicación y espera 3 segundos a que Word guarde el documento
                    break;
                }
            }
            Word.Quit();
        }
        return true;
    } catch (e) {
        $OfficeApp.showModal("No se pudo guardar el documento", "Error: " + e.message);
        return false;
    }
};

问题

关于如何直接使用 JavaScript API 保存文档有什么建议吗?

【问题讨论】:

    标签: javascript ms-word ms-office office-js


    【解决方案1】:

    Office 2013 的 Office JS API(当前)没有用于打开或保存文档的界面。

    我想到的唯一解决方法是提取 OOXML 并将其“流式传输”到一个新文件(文件扩展名为 xml)。但是 OOXML 不包含某些内容(例如文档属性),因此取决于您的文档包含的内容,这可能不是一个选项。

    从评论中的讨论编辑:

    除此之外,有必要使用提供完整对象模型功能的旧式 VSTO/COM/VBA 插件。

    【讨论】:

    • 您知道@cindy-meister Office JS API 何时支持保存和/或打开文档吗?我遇到的问题是我需要从 Edocs DM 扩展打开文档,所以我必须在客户端计算机中本地保存文档以允许 DM 扩展检测更改...我可以从 Word 本身执行此操作,但我的任务窗格插件有按钮形式化文档,在形式化之前我需要知道文档是否已经保存,然后我可以形式化它并立即关闭以防止用户在形式化后进行更改,我清楚吗?
    • 我不知道何时(或如何!)引入此功能。
    • 我知道它被引入了 Api for Word 2016 和 Word for iPad :( 我要哭了 :'( 请查看:Document object (JavaScript API for Word)
    • @user3307754 自从我上次查看以来,它似乎已添加到 JS 对象模型中,尽管您似乎没有设置文件路径或名称的选项。如果您仔细查看 save 方法的代码示例,您会发现还有一个 document.saved 属性,用于返回文档是否有需要保存的更改。
    • 是的,你是对的,但是客户端是Word 2013,没有办法获取'已保存'属性:'(,我不想设置文件路径,我只需要保存当前文档进入其原始打开路径...(例如,如果我单击文件...保存或按 Ctrl + S)(对不起,我的英语不好,这不是我的母语)
    【解决方案2】:

    看来您要保存的是当前文档,正如 Cindy 建议的那样,这在 2013 年是不可能的。在 2016 年以上是可能的。

    如果您想保存文档的副本(在 2103 中),您可以这样做。请注意,Cindy 的建议是不可能的,您可以获得 3 种格式的整个文件:压缩 (docx)、纯文本或 PDF,除非用户选择整个文档,否则您无法获得 XML。 您需要做的是使用 getFileAsync() 方法(here is a sample) 确保要求提供可以为您提供 docx 文件切片的压缩格式,然后您可以在任何需要的地方保存或上传此文件。

    【讨论】:

    • 感谢您的回答,我需要将文档保存在打开文档的同一位置,Edocs DM 扩展有一个文件观察器,可以检测更改并使用文档执行操作...不知道如何
    • 不幸的是,对于 2013 年这是不可能的,我概述了 2016 年的选项和可用性。谢谢!!!!
    • 这仅允许您将文档上传到某个远程位置对吗?您实际上可以将文档保存在新位置吗?我只看到了Document.Save(),但是如果文档没有从任何地方打开怎么办?如果它是一个全新的文件怎么办?我可以将一些路径和文件名应用到应该保存文件的位置吗?
    • 这个 API 只为你获取加密为 base64 的文档。一旦你有了它,你将需要编写代码将它保存在你需要的任何地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2012-04-29
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多