我正在尝试将单元格值设置为始终是文本值。我根本不需要任何格式。
我正在使用以下代码:
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
之类的值上。
答案 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"]];