Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用office.js在Excel中获取单个单元格格式?_Javascript_Excel_Ms Office_Office365_Office Js - Fatal编程技术网

Javascript 使用office.js在Excel中获取单个单元格格式?

Javascript 使用office.js在Excel中获取单个单元格格式?,javascript,excel,ms-office,office365,office-js,Javascript,Excel,Ms Office,Office365,Office Js,我刚刚开始研究新的office js API,它涉及到将现有Excel加载项转换为使用这项新技术 我可以通过在上下文中对单个加载进行排队,很容易地从整个范围获得一个值数组,但是似乎没有一种等效的方法来获取单元格格式。除非该区域中的所有单元格格式相同,否则该区域返回的值为“未定义” 我提出的解决方案是在范围内的每个单元上排队进行加载操作。例如,此函数获取范围内每个单元格的填充颜色: function readFormats() { Excel.run(function (ctx) {

我刚刚开始研究新的office js API,它涉及到将现有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));
        }
    });
}
函数readFormats(){
Excel.run(函数(ctx){
var单元格=[];
//首先获取在下面的循环中使用的范围的大小
var myRange=ctx.workbook.getSelectedRange().load([“行计数”、“列计数]);
返回ctx.sync()
.然后(函数(){
//循环遍历每个单元格,并在填充颜色上下文上排队加载
对于(var r=0;r
此代码按预期工作,但速度非常慢。例如,运行10000个单元范围大约需要12秒,运行20k个单元范围大约需要45秒。当我在包含50k个单元格的范围内尝试时,我的异步回调根本没有被调用


有更好、更有效的方法吗?

目前没有更好的方法,但我们的积压工作中确实有公开单元级属性的方法。我一定会与团队分享您的问题。

谢谢您的回答,尽管这不是我希望的答案。我想我必须等待单元格级别的属性。您是否也可以询问团队,为什么上述函数不以线性复杂度运行?仅供参考,我确实让它运行了5万个电池,大约用了5分钟。@JamieDuncan,re。时间复杂性,这可能是两件事之一。可能是使用Excel.run妨碍了您的工作--请尝试使用
new Excel.RequestContext
创建请求上下文,看看是否有效。但从根本上说,这很可能是一个事实,即您正在创建一大堆范围对象,所有这些对象都需要在内部进行跟踪,以确保当周围的对象移动时范围也会移动(很像命名范围)。可能仅仅是在50k时,这就成了一项相当艰巨的任务。@MichealZlatkovsky感谢您的建议-摆脱Excel。Run大大减少了运行时间(在上面的简单示例中,运行时间减少到40%左右)。这就引出了一个问题,Excel.Run为我带来了巨大的开销,但这是另一篇文章的问题。我把你的观点放在50k范围对象上——这不是一个真正实用的解决方案,只是在单元级属性可用之前的一种变通方法(我可以在每个工作簿中跟踪数百个大范围)。遗憾的是,office.js中的数据绑定在这种大小/数量的范围内运行得非常好。