使用office.js在Excel中获取单独的单元格格式?

问题描述:

我刚刚开始关注转换现有Excel加载项以使用此新技术的新办公室js API。使用office.js在Excel中获取单独的单元格格式?

通过在上下文中排队单个负载,我可以轻松地从整个范围获取值的数组,但似乎并没有获得单元格格式的等效方法。除非范围内的所有单元格格式相同,否则范围返回的值为'未定义'。

我想出的解决方案是在范围内的每个单独的单元格上对加载操作进行排队。例如,该功能得到了填充颜色的范围内的每个单元格:

function readFormats() { 
    Excel.run(function (ctx) { 
     var cells = []; 

     //First get the size of the range for use in the loop below 
     var myRange = ctx.workbook.getSelectedRange().load(["rowCount", "columnCount"]); 

     return ctx.sync() 
     .then(function() { 
      //Loop though every cell and queue a load on the context for fill colour 
      for (var r = 0; r < myRange.rowCount; ++r) 
       for (var c = 0; c < myRange.columnCount; ++c) 
        cells.push(myRange.getCell(r, c).load("format/fill")); 
     }) 
     .then(ctx.sync) 
     .then(function() { 
      //Do something useful with the fill color of cells in array here 
     }) 
    }) 
    .then(function() { 
     console.log("Formats done"); 
    }) 
    .catch(function (error) { 
     console.log("Error: " + error); 
     if (error instanceof OfficeExtension.Error) { 
      console.log("Debug info: " + JSON.stringify(error.debugInfo)); 
     } 
    }); 
} 

此代码按预期工作,但非常缓慢。例如,10,000个单元格范围大约需要12秒,而一个20k单元格范围需要大约45秒才能运行。当我在包含50k个单元格的范围上尝试它时,我的异步回调从来没有被调用过。

有没有更好更有效的方法来做到这一点?

目前还没有更好的方法,但我们确实在我们的待办事项中有这个方法来公开单元级属性。我一定会和团队分享你的问题。

+0

感谢您的回答,虽然这不是我所希望的。我想我必须等待单元级别的属性。你还可以问问团队为什么上述函数不能以线性复杂度运行吗? Fyi,我确实得到它与50k细胞运行,并花了近5分钟。 –

+0

@JamieDuncan,re。时间复杂性,它可能是两件事之一。这可能是因为使用Excel.run在这里得到了方法 - 尝试使用“new Excel.RequestContext”创建一个请求上下文,并查看它是否有效。但从根本上来说,这可能是因为你正在创建一大堆Range对象,所有这些对象都需要在内部进行跟踪,以确保范围在其周围变化时移动(非常类似于命名范围)。而这可能只是在50k时变成了一项相当艰巨的任务。 –

+0

@MichealZlatkovsky感谢您的建议 - 摆脱Excel.Run大大减少了运行时间(在上述简单示例中约为40%)。这引出了Excel.Run为我处理巨大开销的问题,但这是另一篇文章的问题。我将你的观点重新定义为50k范围内的对象 - 这不是一个真正实用的解决方案,只是一个解决方案,直到细胞水平属性可用(并且我可以在每个工作簿中跟踪数百个大范围)。这是一个耻辱,因为office.js中的数据绑定对我来说这个大小/数量范围的表现非常好。 –