我遇到的问题是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.bold
和format.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
。
答案 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();
}
这有两个问题:
您正在每个for循环中执行context.sync()
。您几乎肯定不打算这样做(在您拥有~50列后,这将失败,因为Excel只能处理X许多并行请求)。你想要的是在sync
循环下只进行for
一次。
您没有对context.sync()
进行“返回”。这意味着,对于所有意图和目的,Excel.run不再等待context.sync,而是完成它正在做的事情并继续前进。此时context.sync()
成为一个单独的工作流,它会被生成,但不会被父项跟踪。这意味着父母catch
无法发现该孩子sync
期间出现的任何问题。
我正在创建一个网站/书籍来处理Office.js及其内部工作中的一些谜团。当我准备好查看主题时,我可以在这里发帖(我有一个关于“不打破承诺链”)。