Officejs API的RangeFormat.columnWidth和RangeFormat.autofitColumns()不起作用

时间:2016-10-25 15:18:08

标签: office-addins office-js excel-2016

我遇到的问题是columnWidth实际上没有在Excel 2016中进行设置和显示。以下是我的Excel.run函数的位置:

        _columns = columns;
        var headers = [];
        var numCols = _columns.length;
        var letter = columnToLetter(numCols); //for perspective, this becomes "P"
        for (var i = 0; i < numCols; i++) {
            var header = [];
            header.push(_columns[i].header);
            headers.push(header); //basically an array of arrays, where each entry is ["some string"]
        }

        var ranges = [];
        Office.context.document.bindings.addFromNamedItemAsync(['Sheet1!A', letter].join(':'), 'table', { id: 'table' });

        Excel.run(function (context) {

            var sheet = context.workbook.worksheets.getItem("Sheet1");
            for (var i = 0; i < numCols; i++) {


                var range = sheet.getCell(0, i);
                range.load(['values', 'text', 'format/columnWidth']);
                ranges.push(range);

            }

            return context.sync().then(function () {

                for (var i = 0; i < numCols; i++) {
                    ranges[i].values = [headers[i]]; //now each range, which is essentially one cell, has one value in values. values = [["some string"]]
                    headerFormatFn(ranges[i]);
                    context.sync();
                }



            })
            .catch(function (err) { console.error(err); })
        });

并且实际格式化发生在headerFormatFn(ranges [i]):

    function headerFormatFn(cell) {


        cell.format.font.bold = true;
        cell.format.borders.getItem(1).style = 'Continuous';
        cell.format.columnWidth = 80;

    }

我在Excel 2016中检查了对ExcelApi的支持,我知道不支持autofitColumns(),所以我收集到这就是函数不起作用的原因。我需要更新Excel 2016。但是,columnWidth是ExcelApi 1.1中支持的属性,因此在我的Excel 2016版本中受支持。

这很奇怪,因为format.font.boldformat.borders工作正常。看起来只是设置columnWidth不起作用。请参阅下面的结果工作表视图:

Resulting Excel 2016 Worksheet

我无法判断这是否与context有关,或者我们是否设置错误的Excel加载项。任何帮助将不胜感激,如果需要更多信息,请告诉我。

-------更新1 -------

为了回应@Michael的回答,我做了这些改变:

我将Excel.run更改为:

        Excel.run(function (context) {

            var sheet = context.workbook.worksheets.getItem("Sheet1");
            for (var i = 0; i < numCols; i++) {


                var range = sheet.getCell(0, i);
                range.load(['values', 'text', 'format/*']);
                ranges.push(range);

            }
            for (var i = 0; i < numCols; i++) {

                ranges[i].values = [headers[i]];
                headerFormatFn(ranges[i]);
            }
            return context.sync()
            .catch(function (err) { console.error(err); })
        });

我现在正在使用border.getItemAt(0).style = 'Continuous'

        try {
            console.log("1");
            cell.format.font.bold = true;
            console.log("2");
            cell.format.borders.getItemAt(0).style = 'Continuous';
            console.log("3");
            cell.format.columnWidth = 80;
        }
        catch(error)
        {
            console.log(error);
        }

1,2和3的日志显示循环完成,然后在context.sync()调用的循环之后给出OfficeExtensionError InvalidArgument

1 个答案:

答案 0 :(得分:0)

如果我不得不猜测,我认为导致问题的是cell.format.borders.getItem(1).style行。我认为你不能做getItem(1),因为1不是有效密钥。你想要像InsideHorizontal这样的东西,如:

range.format.borders.getItem('InsideHorizontal').style = 'Continuous';

当批处理中的某些内容失败时,不再执行进一步的排队更改,这就是为什么columnWidth行没有触发。

话虽这么说,我认为代码的真正问题在于你是在默默地吞噬错误而且“打破了承诺链”。违规代码是:

            for (var i = 0; i < numCols; i++) {
                ...
                context.sync();
            }

这有两个问题:

  1. 您正在每个for循环中执行context.sync()。您几乎肯定不打算这样做(在您拥有~50列后,这将失败,因为Excel只能处理X许多并行请求)。你想要的是在sync循环下只进行for 一次

  2. 您没有对context.sync()进行“返回”。这意味着,对于所有意图和目的,Excel.run不再等待context.sync,而是完成它正在做的事情并继续前进。此时context.sync()成为一个单独的工作流,它会被生成,但不会被父项跟踪。这意味着父母catch无法发现该孩子sync期间出现的任何问题。

  3. 我正在创建一个网站/书籍来处理Office.js及其内部工作中的一些谜团。当我准备好查看主题时,我可以在这里发帖(我有一个关于“不打破承诺链”)。