- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
环境:Mac 10.12.6、Word 2016 (16.11.1)、@microsoft/office-js "^1.1.4"
我想知道在如何使用 CustomXMLParts 以最大限度地提高读/写性能方面是否有任何指导方针或最佳实践,或者是否有一种“理想”的方式来为相同的目的对 XML 部分中的数据进行建模。
我正在编写一个加载项,我需要在可见文档之外保留一些数据,但在 docx 文件内。
例如,我正在存储一个发票列表(可能是 100-200 张发票),每个发票都有典型的结构化数据(名称、ID、日期、工作项目列表)和一个自由式注释部分,最多可以包含 5 -10kb 的文本、说明等。
我拿走这些发票,在 Word 文档中呈现其中的一些,然后在任务 Pane 中对其余数据进行一些可视化分析 - 用户可以在其中将注释写回(并保存)到自定义 XML 部分(到该发票中)他们正在看)。
现在......这是我有点困惑的地方......我不确定将每张发票作为单独的 CustomXMLPart 存储在文件中(例如每个发票 1 个 XML 文件),还是存储所有发票更好在单个大型 CustomXMLPart 中,或者如果有中间地带(例如,每个 XML 部分 10 张发票)。如前所述,用例是回读所有发票,然后偶尔更新大约 10-20% 的发票中的数据。
现在,我为每个 XML 部分存储 1 张发票,当我加载插件并进行批量读取以将所有内容放入内存时,每张发票平均需要 250-500 毫秒才能并行读取它们(所以, 250-500ms * 100-200 张发票)。按顺序,它需要更长的时间(2-3 倍)。使用 performance.now() 进行测试,使用挂钟计时进行验证。
这似乎是一个很长的时间,所以我不知道我是否做错了什么 - 或者这只是打开和从这些文件中提取数据所需的时间?
// Sequential example - excluding error handling and type-safety
// Parallel equivalent is essentially a Promise.all with a .map
// Approx 50ms
let result = await this.xmlPartsHelper.getByNamespaceAsync(...);
for (const item of result.value) {
// Approx 150-200ms
result = await this.xmlPartsHelper.getByIdAsync(item.id);
// Approx 150-200ms
result = await this.xmlPartsHelper.getXmlAsync(result.value);
// Approx 5ms
const invoice = this.mapper.reverseMap(result.value);
invoices.push(invoice)
}
public getByNamespaceAsync(namespace: string): Promise<Office.AsyncResult> {
return new Promise<Office.AsyncResult>((resolve, reject) => {
Office.context.document.customXmlParts.getByNamespaceAsync(namespace, (result: Office.AsyncResult) => {
return resolve(result);
});
});
}
public getByIdAsync(id: string): Promise<Office.AsyncResult> {
return new Promise<Office.AsyncResult>((resolve, reject) => {
Office.context.document.customXmlParts.getByIdAsync(id, (result: Office.AsyncResult) => {
return resolve(result);
});
});
}
public getXmlAsync(xmlPart: Office.CustomXmlPart): Promise<Office.AsyncResult> {
return new Promise<Office.AsyncResult>((resolve, reject) => {
xmlPart.getXmlAsync((result: Office.AsyncResult) => {
return resolve(result);
});
});
}
最佳答案
Promises 的使用很好,我正在为 non-promise officejs 函数做同样的包装。使用基于 Promise 的 api,您现在可以利用 Promise.all() 进行并行操作。您可以同时开始所有操作并等待完成。这应该更快。
function getAllParts(ids) {
return Promise.all(ids.map(id => xmlPartsHelper.getByIdAsync(id)));
}
let namespaces = await this.xmlPartsHelper.getByNamespaceAsync(...);
getAllParts(namespaces.value).then((results) => {
console.log('invioces are', results);
});
/** Set a document property. Properties are specific to the document and the Addin-ID.
* @param {string} propertyName Name of the property.
* @param {string} value Value of the property.
* @returns {Promise} A promise without content.
*/
function setDocumentProperty(propertyName, value) {
return new Promise((resolve, reject) => {
if (Office.context.document.settings) {
Office.context.document.settings.set(propertyName, value);
Office.context.document.settings.saveAsync((asyncResult) => {
if (asyncResult.status === Office.AsyncResultStatus.Failed) {
reject(`[ExcelApi] Property '${propertyName}=${value}' could not be saved. Error: ${asyncResult.error.message}`);
} else {
resolve(`[ExcelApi] Property '${propertyName}=${value}' saved.`);
}
});
} else {
reject('[ExcelApi] document.settings is not ready.');
}
});
}
/** Get a document property.
* @param {string} propertyName Name of the property. Properties are specific to the document and the Addin-ID.
* @returns {Promise<object>} A promise that contains the property value.
*/
function getDocumentProperty(propertyName) {
return new Promise((resolve, reject) => {
if (Office.context.document.settings) {
const result = Office.context.document.settings.get(propertyName);
if (result === null) reject(`[ExcelApi] Property '${propertyName}' not found.`);
resolve(result);
} else {
reject('[ExcelApi] document.settings is not ready.');
}
});
}
关于ms-word - Word 插件 CustomXMLParts 数据建模和/或性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49764127/
我想标记一个字符串,例如 Best Beat Makers,以几乎类似于 NGram 的方式为每个单词生成标记,例如: IN: "Best Beat Makers" OUT: ["Best", "B
这个问题在这里已经有了答案: Is there a way to word-wrap long words in a div? (6 个答案) 关闭 7 年前。
我想编写一个 Python 代码来检查字符串是否包含类似于以下内容的内容: 'word.Word' => 将其替换为 'word.\nWord'。 smallLetter.capitalLetter
我想编写一个 Python 代码来检查字符串是否包含类似于以下内容的内容: 'word.Word' => 将其替换为 'word.\nWord'。 smallLetter.capitalLetter
我有以下正则表达式: ^--([\w|-]+) 我想匹配 --word --no-word 但不是: ---word ----word 最佳答案 将表情更改为 ^--(\w[-\w]*) 这需要在两个
在我的加载项中,我需要为每个打开的文档创建一个任务 Pane 。在加载项的启动方法中,我订阅了 ApplicationEvents4_Event.NewDocument 和 Application.D
我使用 word javascript api 开发了一个 word 插件。我的文档 .docx 文件在服务器上,我需要在加载项中单击按钮打开该 .docx 文档作为新的 Word 文档。 请指导我如
我需要在某个地方修复一些 CSS,因为我的文本没有环绕,如果它是一个非常长的单词,它会无限期地继续下去。 在大多数情况下,我在我的 CSS 文件中尝试了 word-wrap: break-word;
这个问题在这里已经有了答案: What is the difference between "word-break: break-all" versus "word-wrap: break-word
这个问题在这里已经有了答案: What is the differect between word-wrap and overflow-wrap? [duplicate] (1 个回答) Is t
问题详细描述如下: 给定两个单词(beginWord 和 endWord)和字典的单词列表,找出是否存在从 beginWord 到 endWord 的转换序列,这样: 一次只能更改一个字母 每个转换后
我以前没有使用过邮件合并字段,我发现的所有内容都要求您在能够插入合并字段之前选择一个数据源。我想要做的就是将字段放在 word 文档上,并且在代码使用它之前不要将其合并。我基本上是在创建文档模板。这在
将此代码放置在ThisDocument_Startup之外的Word文档级VSTO解决方案中的某个位置(创建带单击事件的功能区按钮): int zero = 0; int divideByZero =
有没有办法在没有加载项的情况下启动 MS Word(仅此实例)?我只能找到一种方法来完全禁用加载项。 最佳答案 来自Word command line switches documentation ,
有没有办法在没有加载项的情况下启动 MS Word(仅此实例)?我只找到一种方法来完全禁用加载项。 最佳答案 来自Word command line switches documentation ,您
当使用 URI 方案从网页上托管的 word 模板打开新文档时不起作用。 https://msdn.microsoft.com/en-us/library/office/dn906146.aspx 这
我的问题: overflow-wrap: break-word 和 word-break: break-word 有区别吗? 非重复: 这里有一些现有的问题,乍一看可能是重复的,但实际上不是。 Wha
我希望使用 WordNet 从一组基本术语中寻找相似术语的集合。 例如,单词'discouraged' - 潜在的同义词可能是:daunted, glum, deterred, pessimistic
部署 Word Add in 时,发布没有错误。复制文件后出现以下错误。 我没有太多事情要做。这是堆栈跟踪。 ************** Exception Text **************
我需要一个 Java 正则表达式来匹配除某个单词之外的任何单词,同时包含另一个单词。 例如字符串中不能包含Apple,但必须有Peach。 Apple and Peach - Not match Pe
我是一名优秀的程序员,十分优秀!