Excel 设置格式并为给定范围写入一些值后,相同的格式将部分自动应用于其他范围

Excel 设置格式并为给定范围写入一些值后,相同的格式将部分自动应用于其他范围,excel,office-js,Excel,Office Js,我不确定这是一个问题还是Excel的预期行为。如果这确实是预期的行为,我希望能解释一下发生了什么,因为我看不到模式 如果将格式和某些值设置为某个范围,然后仅将值指定给位于第一个范围下方的另一个范围,则第一个范围的格式将部分(随机)应用于新范围 我的测试功能: function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.fl

我不确定这是一个问题还是Excel的预期行为。如果这确实是预期的行为,我希望能解释一下发生了什么,因为我看不到模式

如果将格式和某些值设置为某个范围,然后仅将值指定给位于第一个范围下方的另一个范围,则第一个范围的格式将部分(随机)应用于新范围

我的测试功能:

   function getRandomInt(min, max) {
        min = Math.ceil(min);
        max = Math.floor(max);
        return Math.floor(Math.random() * (max - min)) + min;
    }

 function loadSampleData(applyFormat) {
    var columnCount = 30;
    if (applyFormat) {
        columnCount = 5;
    }
    var data = [];
    for (var rows = 0; rows < 4; rows++) {
        var row = [];
        for (var columns = 0; columns < columnCount; columns++) {
            var value = columns;
            if (getRandomInt(1, 3) == 2) {
                value = "text";
            }
            row.push(value);
        }
        data.push(row);
    }
    return Excel.run(function (ctx) {
        var selectedRange = ctx.workbook.getSelectedRange().load(['rowCount', 'columnCount']);
        var extendedRange;
        return ctx.sync().then(function () {
            var totalRows = data.length;
            var totalColumns = data[0].length;
            var deltaRows = totalRows - selectedRange.rowCount;
            var deltaColumns = totalColumns - selectedRange.columnCount;
            extendedRange = selectedRange.getResizedRange(deltaRows, deltaColumns);
            if (applyFormat) {
                extendedRange.format.fill.color = "orange";
                extendedRange.format.font.color = "white";
            }
            else {
                extendedRange.clear();
            }
            extendedRange.values = data;
        }).then(ctx.sync)
    }).catch(errorHandler);
}
函数getRandomInt(最小值、最大值){ min=数学单元(min); 最大值=数学楼层(最大值); 返回Math.floor(Math.random()*(max-min))+min; } 函数loadSampleData(applyFormat){ var列数=30; 如果(应用格式){ 列数=5; } var数据=[]; 对于(变量行=0;行<4;行++){ var行=[]; 对于(变量列=0;列<列数;列++){ var值=列; if(getRandomInt(1,3)==2){ value=“text”; } 行推送(值); } 数据推送(row); } 返回Excel.run(函数(ctx){ var selectedRange=ctx.workbook.getSelectedRange().load(['rowCount','columnCount']); var扩展范围; 返回ctx.sync().then(函数(){ var totalRows=data.length; var totalColumns=数据[0]。长度; var deltaRows=totalRows-selectedRange.rowCount; var deltaColumns=totalColumns-selectedRange.columnCount; extendedRange=selectedRange.getResizedRange(deltaRows、deltaColumns); 如果(应用格式){ extendedRange.format.fill.color=“橙色”; extendedRange.format.font.color=“白色”; } 否则{ extendedRange.clear(); } extendedRange.values=数据; }).然后(ctx.sync) }).catch(errorHandler); } 步骤:

  • 在任务窗格中创建一个按钮(按钮A)。此按钮必须调用loadSampleData并传递true,才能将某些数据和格式(填充和字体颜色)写入范围。(范围A)
  • 在任务窗格中创建另一个按钮(按钮B)。此按钮必须调用loadSampleData并传递false,以便仅将数据(无格式)写入更大的范围(范围B)
  • 单击A1单元格,然后单击按钮A。请注意显示的范围和格式
  • 单击A6,然后单击按钮B。请注意,写入的范围更大,其某些单元格的格式与步骤3中的范围相同,即使没有为该范围设置明确的格式
  • 在A6仍处于选中状态时,多次单击按钮B。请注意,随着范围值的更改,格式化的单元格也会更改
  • 注:

    • 如果范围B写在范围A之上,则不会发生这种情况
    • 如果范围B写在范围A下4(或更多)行,则不会发生这种情况

    谢谢

    令人着迷的是,我甚至可以在UI中重现这个问题,而无需编程。Excel正在进行某种模式匹配,尽管我承认我很难破译模式是什么

    我将与我们的团队讨论——但在具体指导方面,我认为最安全的方法是设置值,然后清除格式。如果你想格外小心,你甚至可以更进一步:

  • 设置数字格式(以确保字符串、数字和日期字符串按您希望的方式进行解释)
  • 设置值
  • range.clear(Excel.ClearApplyTo.formats)
  • 重新设置数字格式

  • 我承认这似乎是一个值得改进的工作流程。让我看看我们是否可以修复“值”,或者提供一种方法,让您可以一次性以比现在更严格的方式设置值和数字格式。

    首先也是最重要的问题:如果您去掉可编程性方面,并在常规用户界面中执行相同的步骤,就像一个典型的Excel用户——你看到了相同的行为吗?可编程性模型是基于用户可以做的自动化。因此,如果它是一个常规的Excel行为,程序行为将采用它。如果你想做些不同的事情,想一想作为一个用户,你会做些什么来实现你想要的行为(例如,首先清除目标范围的格式)@MichaelZlatkovsky Microsoft感谢你的评论。如果我“手动”执行此操作(粘贴小范围的值,更改其格式,然后在其下方粘贴大范围的值),我看不到该行为。另外,在上面的loadSampleData函数中,我在写入值之前清除了范围,如果我想要一个没有格式的范围,这是最让我困惑的。很抱歉延迟。为了便于调试,您是否可以创建一个脚本实验室片段并将其作为公共要点共享?看见FWIW,我认为该工具在日常使用中对您也很有价值,用于尝试快速API的东西。@MichaelZlatkovsky Microsoft我不知道脚本实验室,我认为它很棒!!要点是:顺便说一句,你的书也非常有用,材料很棒。谢谢!我将遵循您的建议,在设置值后清除格式。