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

Posted

技术标签:

【中文标题】在为给定范围设置格式并写入一些值后,相同的格式会部分自动应用于其他范围【英文标题】:After setting a format and writing some values for a given range, that same format is partially and automatically applied to other ranges 【发布时间】:2017-09-27 08:38:23 【问题描述】:

我不确定这是一个问题还是 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);

步骤:

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

注意事项:

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

谢谢!

【问题讨论】:

第一个也是最重要的问题:如果您去掉可编程性方面并在常规用户界面中执行这些相同的步骤,就像典型的 Excel 用户一样 - 您会看到相同的行为吗? 可编程模型基于用户可以做什么的自动化。因此,如果它是常规的 Excel 行为,程序行为将采用它。如果您想要不同的东西,请弄清楚您作为用户会做什么来实现所需的行为(例如,首先清除目标范围的格式) @MichaelZlatkovsky-Microsoft 感谢您的 cmets。如果我“手动”执行此操作(粘贴小范围的值,更改其格式,然后在其下方粘贴更大范围的值)我看不到该行为。另外,在我上面的 loadSampleData 函数中,我在写入值之前清除了范围,对于我想要一个没有格式化的范围的情况。这是最让我困惑的地方。 抱歉耽搁了。为了更容易调试,您是否有机会创建一个 Script Lab sn-p 并将其作为公共 Gist 共享?见github.com/OfficeDev/script-lab/blob/master/README.md#import。 FWIW,我认为该工具对您在日常使用中也很有价值,用于尝试快速的 API。 @MichaelZlatkovsky-Microsoft 我不知道 Script Lab,我认为它很棒!要点如下:gist.github.com/maalsol/23c7b679a2365bc58efa60f856ed31b7 顺便说一句,你的书也非常有用,材料很好。 【参考方案1】:

令人着迷的是,即使在 UI 中,我也可以重现该问题,而无需编程。 Excel 正在做某种模式匹配,但我承认我很难破译模式是什么......

我将与我们的团队讨论 - 但就具体指导而言,我认为您最安全的选择是设置值,然后清除格式。如果你想超级小心,你甚至可以更进一步:

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

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

【讨论】:

谢谢!我会听从您的建议,并在设置值后清除格式。

以上是关于在为给定范围设置格式并写入一些值后,相同的格式会部分自动应用于其他范围的主要内容,如果未能解决你的问题,请参考以下文章

如何写入与打印格式相同的文件?

如何为可变长度有效负载格式化 NDEF 消息?

写入值后获取 plist 数据时出错

设置值后如何在 UITextField 中移动光标

使用 Excel 对象快速设置数字格式

springMVC怎么把结果集写入Excel并导出