有没有办法删除 Word-js 中的分节符?
Is there a way to delete a section break in Word-js?
我正在使用 office-js 编写一个生成索引的 Word 加载项。它使用以下代码在文档末尾创建一个分节符,然后在那里写入索引:
function WriteIndex() {
Word.run(function (context) {
//
var html = GenerateIndex(); // generate the index as an html string
//
if (html.length > 0) {
var body = context.document.body;
body.insertBreak(Word.BreakType.sectionNext, Word.InsertLocation.end);
body.select("End"); // put it at the end
return context.sync().then(function () {
body = context.document.body;
body.select("End"); // put it at the end
body.insertHtml(html, Word.InsertLocation.end);
return context.sync();
});
}).catch(handleError);
}
到目前为止,非常好 -- 它可以正常工作,就像我想要的那样。但是现在我希望能够重新运行函数并删除在重新生成和重写它之前存在的索引。
我想我可以把索引的内容放到一个范围内然后删除。但是我在 API 中找不到任何可以删除分节符的地方。我在这个 找到了一些代码,它遍历文档部分集合并收集 所有 部分的内容,然后只用想要的部分替换文档的全部内容.但这种方法让我觉得有风险且令人费解。另一种方法可能是导航到文档末尾并执行退格操作,因为这就是使用 Word UI 删除分节符的方式,但我在 API 中找不到任何内容文档来做到这一点。
真的是 API 允许您创建分节符但不允许您删除它们吗?以前有人做过这样的事吗?有没有更好的方法?
非常感谢。
是的,有点迂回,但可以做到。
正如您所说,实际的分节符似乎不是 section.body
的 Range
的一部分。所以诀窍是在 prior 部分范围的末尾立即获取之前的点,如以下代码片段所示。 (在 ScriptLab 中测试。)
const doc = context.document;
const secs = doc.sections;
secs.load("items");
await context.sync();
//console.log(secs.items.length.toString());
const nrSecs = secs.items.length - 1;
const sect = secs.items[nrSecs];
const secPrev = secs.items[nrSecs-1];
//console.log(sect.isNullObject);
var sectRng = sect.body.getRange("Content");
const secStart = secPrev.body.getRange("End");
var sectAll = secStart.expandTo(sectRng);
sectAll.delete ();
await context.sync();
为了将来参考,这里是我的 js 版本(作为答案添加只是因为代码超出了评论字符限制——Cindy Meister 应该得到答案,而不是我)。我将索引部分是否存在于调用此函数的函数中进行了测试,因为它通常与其他函数无关:
function RemoveLastSection() {
Word.run(function (context) {
var doc = context.document;
var secs = doc.sections;
secs.load("items");
context.sync().then(function () {
if (secs.items.length > 1) {
var nrSecs = secs.items.length - 1;
var sect = secs.items[nrSecs];
var secPrev = secs.items[nrSecs - 1];
var sectRng = sect.body.getRange("Content");
var secStart = secPrev.body.getRange("End");
var sectAll = secStart.expandTo(sectRng);
sectAll["delete"]();
}
return context.sync();
});
return context.sync();
}).catch(handleError)
}
我正在使用 office-js 编写一个生成索引的 Word 加载项。它使用以下代码在文档末尾创建一个分节符,然后在那里写入索引:
function WriteIndex() {
Word.run(function (context) {
//
var html = GenerateIndex(); // generate the index as an html string
//
if (html.length > 0) {
var body = context.document.body;
body.insertBreak(Word.BreakType.sectionNext, Word.InsertLocation.end);
body.select("End"); // put it at the end
return context.sync().then(function () {
body = context.document.body;
body.select("End"); // put it at the end
body.insertHtml(html, Word.InsertLocation.end);
return context.sync();
});
}).catch(handleError);
}
到目前为止,非常好 -- 它可以正常工作,就像我想要的那样。但是现在我希望能够重新运行函数并删除在重新生成和重写它之前存在的索引。
我想我可以把索引的内容放到一个范围内然后删除。但是我在 API 中找不到任何可以删除分节符的地方。我在这个
真的是 API 允许您创建分节符但不允许您删除它们吗?以前有人做过这样的事吗?有没有更好的方法?
非常感谢。
是的,有点迂回,但可以做到。
正如您所说,实际的分节符似乎不是 section.body
的 Range
的一部分。所以诀窍是在 prior 部分范围的末尾立即获取之前的点,如以下代码片段所示。 (在 ScriptLab 中测试。)
const doc = context.document;
const secs = doc.sections;
secs.load("items");
await context.sync();
//console.log(secs.items.length.toString());
const nrSecs = secs.items.length - 1;
const sect = secs.items[nrSecs];
const secPrev = secs.items[nrSecs-1];
//console.log(sect.isNullObject);
var sectRng = sect.body.getRange("Content");
const secStart = secPrev.body.getRange("End");
var sectAll = secStart.expandTo(sectRng);
sectAll.delete ();
await context.sync();
为了将来参考,这里是我的 js 版本(作为答案添加只是因为代码超出了评论字符限制——Cindy Meister 应该得到答案,而不是我)。我将索引部分是否存在于调用此函数的函数中进行了测试,因为它通常与其他函数无关:
function RemoveLastSection() {
Word.run(function (context) {
var doc = context.document;
var secs = doc.sections;
secs.load("items");
context.sync().then(function () {
if (secs.items.length > 1) {
var nrSecs = secs.items.length - 1;
var sect = secs.items[nrSecs];
var secPrev = secs.items[nrSecs - 1];
var sectRng = sect.body.getRange("Content");
var secStart = secPrev.body.getRange("End");
var sectAll = secStart.expandTo(sectRng);
sectAll["delete"]();
}
return context.sync();
});
return context.sync();
}).catch(handleError)
}