在office.js中为excel设置条件格式

时间:2016-04-06 14:17:17

标签: javascript excel ms-office office-js

我需要一种在加载项中设置条件格式的方法。

目前我认为我可以使用VBA根据加载项设置的单元格值来设置它 - 但是能够直接在office.js中执行此操作会非常好。

我正在寻找一些创造性的解决方法,直到Microsoft在加载项中本地实现它。

3 个答案:

答案 0 :(得分:5)

根据您(以及许多其他开发人员的反馈),我们现在宣布在Build 2017上预览Excel API 1.6,其中包括对条件格式的支持。支持Excel API 1.6的Office 365 Insider版本将于本月晚些时候推出。

我构建了一个代码段,向您展示了这些API的基础知识,您可以在我们的新脚本实验室(https://aka.ms/getscriptlab)中查看这些代码。只需安装Script Lab加载项,然后在导航菜单中选择“导入”并导入以下要点:https://gist.github.com/TristanD-MSFT/80920d57bf587bd859ff62afb2b7c673

答案 1 :(得分:0)

目前我们还没有支持通过Office.js设置条件格式,但我们会考虑添加对此的支持,以便我们对API进行进一步的更新。

谢谢, Philip,Office可扩展性团队的软件工程师

答案 2 :(得分:0)

正如Philip所说,条件格式不是开箱即用的(从ExcelApi 1.2开始)。就创意解决方法而言,根据您的范围大小,您可以执行类似的操作。

基本思想是在所需范围内创建绑定。然后添加数据更改侦听器,并在每次发生更改时重新应用格式。

要创建绑定,可以执行以下操作:

Office.context.document.bindings.addFromPromptAsync(Office.BindingType.Matrix, {id:'MyBinding'});

现在出现了有趣的部分,即事件:

var binding;

Office.context.document.bindings.getByIdAsync('MyBinding', function(result) {
    if (result.status === "succeeded") {
        binding = result.value;
        binding.addHandlerAsync(Office.EventType.BindingDataChanged, formatData);
    } else {
        console.log(result.error.message);
    }
});

function formatData() {
    // First, disable the binding that was previously created, or else
    // setting formatting will also trigger data changed event.
    binding.removeHandlerAsync(Office.EventType.BindingDataChanged);

    Excel.run(function(ctx) {
        var range = ctx.workbook.bindings.getItem('MyBinding').getRange();
        range.load("values");
        return ctx.sync().then(function() {
            for (var row = 0; row < range.values.length; row++) {
                for (var col = 0; col < range.values[0].length; col++) {
                    var cellValue = range.values[row][col];
                    var color;
                    if (cellValue < 30) {
                        color = "red";
                    } else if (cellValue < 65) {
                        color = "orange"; 
                    } else {
                        color = "green";
                    }
                    range.getCell(row, col).format.fill.color = color;
                }
            }
        })
    })
    .catch(function(error) {
        console.log(error);
    })
    .then(function() {
        // Re-enable the event:
        binding.addHandlerAsync(Office.EventType.BindingDataChanged, formatData);
    });
}

希望这有助于作为临时解决方法!

~Michael Zlatkovsky,Office Extensibility团队的开发人员,MSFT