Получить цвет заливки ряда ячеек officejs - PullRequest
0 голосов
/ 08 ноября 2019

Я новичок в office.js и делаю надстройки, и я пытаюсь сделать надстройку для Excel. Я столкнулся с проблемой одной вещи, которая кажется очень простой, но это не так. Я просто пытаюсь получить цвет фона выделенных ячеек. Из того, что я могу сказать, мне нужно будет пройтись по каждой выбранной ячейке и проверить значение fill.color отдельно, что нормально, за исключением того, что я продолжаю получать ошибку при попытке прочитать это свойство.

Error PropertyNotLoaded: The property 'color' is not available. Before reading the property's value, call the load method on the containing object and call "context.sync()" on the associated request context.

Я не совсем понимаю, зачем мне для этого нужно запускать context.sync (), когда он уже запущен, и я пытаюсь использовать код, уже сгенерированный Visual Studio, для надстройки.

Ошибка сбивает с толку, потому что я могу установить цвет, как это без проблем. Вот код, который я добавил, пытаясь получить цвет заливки. Первая строка закомментирована, но добавляет оранжевую заливку к выделенным ячейкам без проблем. Я только добавил это, чтобы посмотреть, смогу ли я прочитать значение, которое, как я знал, уже было установлено. Я пытаюсь получить пользовательскую заливку для выбранного диапазона, хотя. Во второй строке выдается ошибка.

//sourceRange.getCell(i, j).format.fill.color = "orange"; // this sets the color no problem when uncommented
$('#fa-output').append("color: " + sourceRange.getCell(i,j).format.fill.color + "<br>"); //this is where it can't get the fill color

Я использую пример, который Visual Studio генерирует, где он случайным образом генерирует 9 ячеек случайных чисел и выделяет наибольшее число в выбранном диапазоне. Вот полный код этого метода:

// Run a batch operation against the Excel object model
    Excel.run(function (ctx) {
        // Create a proxy object for the selected range and load its properties
        var sourceRange = ctx.workbook.getSelectedRange().load("values, rowCount, columnCount, format");

        // Run the queued-up command, and return a promise to indicate task completion
        return ctx.sync()
            .then(function () {
                var highestRow = 0;
                var highestCol = 0;
                var highestValue = sourceRange.values[0][0];

                // Find the cell to highlight
                for (var i = 0; i < sourceRange.rowCount; i++) {
                    for (var j = 0; j < sourceRange.columnCount; j++) {

                        //sourceRange.getCell(i, j).format.fill.color = "orange"; // this sets the color no problem when uncommented
                        $('#fa-output').append("color: " + sourceRange.getCell(i,j).format.fill.color + "<br>"); //this is where it can't get the fill color

                        if (!isNaN(sourceRange.values[i][j]) && sourceRange.values[i][j] > highestValue) {
                            highestRow = i;
                            highestCol = j;
                            highestValue = sourceRange.values[i][j];
                        }
                    }
                }

                cellToHighlight = sourceRange.getCell(highestRow, highestCol);
                sourceRange.worksheet.getUsedRange().format.font.bold = false;

                // Highlight the cell
                cellToHighlight.format.font.bold = true;

                $('#fa-output').append("<br>The highest value is " + highestValue);

            })
            .then(ctx.sync);
    })
    .catch(errorHandler);

1 Ответ

1 голос
/ 10 ноября 2019

В вашем коде много закомментированного кода, что затрудняет его чтение.

В любом случае, это ожидаемое поведение. Вы должны загрузить (), а затем синхронизировать (), когда хотите прочитать свойство объекта в книге. Именно загрузка и синхронизация переносят значение свойства из рабочей книги в JavaScript в вашей надстройке, чтобы вы могли прочитать его. Ваш код пытается прочитать свойство, которое не было загружено первым. Ниже приведен простой пример:

const cell = context.workbook.getActiveCell();
cell.load('format/fill/color');
await context.sync();
console.log(cell.format.fill.color);

Версия ES5:

const cell = context.workbook.getActiveCell();
cell.load('format/fill/color');
return context.sync()
.then(function () {
    console.log(cell.format.fill.color);
});    

Вам также следует взглянуть на метод Range.getCellProperties () , которыйэто своего рода обертка вокруг груза.

...