Office js 为什么ContentControl.insertOoxml(原始内容控制ooxml)似乎创建了新的不可见内容控件?

Office js 为什么ContentControl.insertOoxml(原始内容控制ooxml)似乎创建了新的不可见内容控件?,office-js,Office Js,我希望能够隐藏/取消隐藏某些内容控件的内容。为此,我获取内容的ooxml,使用customXmlParts保存和加载,然后返回insertOoxml() 目前我可以隐藏和取消隐藏一次。在第二次隐藏尝试中,context.document.contentControls.getByTitle()提供的内容控件数量是我在屏幕上看到的两倍。一半的身份证是新的。当我尝试getOoxml()其中一个时,系统在ContentControlCollection.getItem的errorLocation中生成

我希望能够隐藏/取消隐藏某些内容控件的内容。为此,我获取内容的ooxml,使用customXmlParts保存和加载,然后返回
insertOoxml()

目前我可以隐藏和取消隐藏一次。在第二次隐藏尝试中,
context.document.contentControls.getByTitle()
提供的内容控件数量是我在屏幕上看到的两倍。一半的身份证是新的。当我尝试
getOoxml()
其中一个时,系统在
ContentControlCollection.getItem
errorLocation
中生成一个错误

我承诺Office 2013 API如下:

function cxpAddCustomXmlPartAsync(xml): 
  Promise<Office.AsyncResult<Office.CustomXmlPart>>{
  return new Promise((resolve)=>{
    Office.context.document.customXmlParts.addAsync(xml, (asyncResult)=>{
      resolve(asyncResult);
    })
  });
}

function cxpGetCustomXmlPartByIdAsync(id): 
  Promise<Office.AsyncResult<Office.CustomXmlPart>> {
  return new Promise((resolve)=>{
    Office.context.document.customXmlParts.getByIdAsync(id, 
      (result: Office.AsyncResult<Office.CustomXmlPart>)=>{
        resolve(result)
      })
  });
}

function cxpDeleteXmlPartAsync(part:Office.CustomXmlPart){
  return new Promise((resolve)=>{
    part.deleteAsync((result: Office.AsyncResult<void>)=>{
      resolve(result)
    });
  });
}

function cxpGetXmlAsync(part: Office.CustomXmlPart):
  Promise<Office.AsyncResult<string>> {
  return new Promise((resolve)=>{
    part.getXmlAsync((result)=>{
      resolve(result);
    });
  });
}

这是一个有趣的案例,在某种程度上,您所描述的是经过设计的,并没有在代码中得到正确处理。事实上,我怀疑这是你想做的。让我解释一下

问题的根源在于,通过执行ccs.items[i].getOoxml()命令,您实际上获得了内容控件的OOXML,包括实际的内容控件。这就是为什么当您保存cc内容并用OOXML替换它时,实际上是在内容控件中插入了一个内容控件,这就是为什么每次都会将内容控件的大小增加一倍!)希望这不会令人困惑

我认为您真正想要的是将内容控件中的内容OOXML化,对吗?根据您的代码示例,我假设在此上下文中隐藏并不意味着整个内容控件,但您想要一个空的内容控件(带“-”号),对吗

如果是这种情况,您需要获取内容控件的“内容”的OOXML。这就是你如何做到的:

 const ooxmlObj = ccs.items[i]
        .getRange("start")
        .expandTo(ccs.items[i].getRange("end"))
        .getOoxml(); 
这个简单的指令只会让您了解内容控件的内部,即需要存储然后替换的OOXML

请在此处查看工作示例(scriptlab)

我也不知道为什么要将其保存为XML部分。。。我在示例中使用了一个数组,然后您可以使用settings对象来持久化该数组。由您决定在何处存储临时OOXML


快乐编码

这是一个有趣的案例,从某种程度上说,您描述的内容是经过设计的,没有在代码中得到正确处理。事实上,我怀疑这是你想做的。让我解释一下

问题的根源在于,通过执行ccs.items[i].getOoxml()命令,您实际上获得了内容控件的OOXML,包括实际的内容控件。这就是为什么当您保存cc内容并用OOXML替换它时,实际上是在内容控件中插入了一个内容控件,这就是为什么每次都会将内容控件的大小增加一倍!)希望这不会令人困惑

我认为您真正想要的是将内容控件中的内容OOXML化,对吗?根据您的代码示例,我假设在此上下文中隐藏并不意味着整个内容控件,但您想要一个空的内容控件(带“-”号),对吗

如果是这种情况,您需要获取内容控件的“内容”的OOXML。这就是你如何做到的:

 const ooxmlObj = ccs.items[i]
        .getRange("start")
        .expandTo(ccs.items[i].getRange("end"))
        .getOoxml(); 
这个简单的指令只会让您了解内容控件的内部,即需要存储然后替换的OOXML

请在此处查看工作示例(scriptlab)

我也不知道为什么要将其保存为XML部分。。。我在示例中使用了一个数组,然后您可以使用settings对象来持久化该数组。由您决定在何处存储临时OOXML


快乐编码

我可以复制。导致错误的原因是最后一个
for
循环中存在
insertOoxml
行。如果我添加任何引用
ccs
(如
console.log(ccs))的行
就在上次
for
循环的上方,错误出现在第二次迭代的那一行。因此,当
insertOoxml
行在第一次迭代中运行时,
ccs
集合被破坏。这看起来像是一个bug。我认为你应该在office js repo上提出这个问题:我可以重现。这是f导致错误的最后一个
for
循环中的
insertOoxml
行。如果我添加任何引用
ccs
的行(如
console.log(ccs)
就在上次
for
循环的上方,错误出现在第二次迭代的那一行。因此,当
insertOoxml
行在第一次迭代中运行时,
ccs
集合已损坏。这看起来像是一个bug。我认为您应该在控件及其内容的office js repo:Ooxml中提出这个问题是不同的。这很有意义。谢谢。我隐藏的部分可能包含图像,因此可能会很大。不知怎的,我认为在持久使用设置对象时会有大小限制。这是错误的吗?是的,如果我没有记错的话,您不能在设置上存储超过2MB的内容。因此xml部分是这些情况下的最佳选择。Ooxmltrol和它的内容是不同的。这很有意义。谢谢。我隐藏的部分可能包括图像,因此可能会很大。不知怎的,我认为在持久使用设置对象时会有一个大小限制。这是错误的吗?是的,如果我没记错的话,你不能在设置上存储超过2MB的内容。所以xml部分是那些c的最佳选择阿斯。