使用Office.js设置值时如何阻止Excel自动格式化

时间:2018-08-03 21:21:11

标签: excel office-js

我正在尝试将单元格值设置为始终是文本值。我根本不需要任何格式。

我正在使用以下代码:

async function setValue() {
    try {
        await Excel.run(async (context) => {
            const sheet = context.workbook.worksheets.getItem("Sample");

            const range = sheet.getRange("C3");
            range.values = [[ 'June 2018' ]];
            range.format.autofitColumns();

            await context.sync();
        });
    }
    catch (error) {
        OfficeHelpers.UI.notify(error);
        OfficeHelpers.Utilities.log(error);
    }
}

这将导致单元格中的日期为Jun-18。我已经找到了this的答案,这可能是一种解决方法,但是我的所有数据都以'作为前缀会使我的用户感到困惑。该问题也发生在01之类的值上。

2 个答案:

答案 0 :(得分:2)

好问题!首先,让我作一个概括性的声明:Excel的可编程性从根本上讲是关于自动化的,它是与用户执行相同的操作,但是是以编程方式进行的。这样,您通常可以从UI中浏览编程时应做的事情。

现在,在常规Excel中,如果在新工作表的空白单元格中输入June 2018,您将获得与刚刚描述的相同的体验。这是因为单元格的格式设置为“常规”,这意味着它将尝试捕捉到特定类型。如果您希望它保留为文本形式(而不是格式化日期,这是Ricky在回答的最后一行中建议的内容),则需要首先将数字格式设置为文本,在Excel中是@符号,然后 then 输入值。

await Excel.run(async (context) => {
    const range = context.workbook.getSelectedRange();
    range.numberFormat = [["@"]];
    range.values = [["June 2018"]];

    await context.sync();
});

同样,让我强调一下,就像在UI中一样,您需要先设置格式,然后再设置值。相反,将文本“ 43252”插入到单元格中(巧合的是,它是自1900年1月0日[是,0日] –当天的随机琐事以来的天数)。

当然,在告诉Excel“这只是文本”时,您失去了在其上执行其他日期操作的能力-因此Ricky的回答是正确的。数字格式(“ mmmm yyyy”)可能仍然更合适。但是对于您所说的没有Excel为您自动格式化任何内容的问题,只需确保首先 设置数字格式,然后然后设置值。

答案 1 :(得分:0)

如果确实需要将其作为字符串,则必须将数据放入一个字符串中,该字符串不会触发Excel将类似日期的字符串强制转换为Date对象。一种方法是将空白与不间断空间交换。替换此行:

range.values = [[ 'June 2018' ]];

包含以下几行:

let date = 'June 2018';
let dateAsString = date.replace(' ', '\xa0');
range.values = [[dateAsString]];

顺便说一句,如果您只是希望它看起来像输入字符串,但又希望它成为Date类型,那么您只需在创建范围对象的行下方添加以下行即可:

range.numberFormat = [["mmmm yyyy"]];