如何处理 excel 插件 office.js 中的日期类型

how to handle date type in excel addin office.js

我有一个基于任务窗格的加载项,用于 Excel,使用 office.js 开发。我在 excel 中的一个单元格上复制了一个日期,然后下次从该单元格中读取它。基本上我使用 javascript 日期对象将读取的字符串从 excel 转换为日期,然后使用它。

我认为当 excel 文件以英语文化保存并在具有法国文化的机器上打开时,这种方法会产生问题。因为两种文化的日期格式不同。

我想知道如何处理这种情况。有什么办法可以说 Excel 中的单元格是日期类型的。然后它在不同的文化中相应地调整它的价值。

如果单元格的值类型是日期,当我们从该文本中获取值时,我们将得到一个数字而不是 UI 上显示的文本。

该数字表示自 1900 年 1 月 0 日以来的天数,加上一天 24 小时的小数部分:ddddd.tttttt。这称为序列日期或序列日期时间。参考here about the dates and times in Excel. However, the date in JavaScript starts from 1 January, 1970 UTC( refer to Date in JavaScript).

我们需要在 JavaScript 中将数字转换为我们想要的日期时间。并且 Excel 在将日期时间转换为值时不计算时区。

这里有一个将Excel中的日期值转换成UTC的demo,供大家参考:

function getJsDateFromExcel(excelDateValue) {

    return new Date((excelDateValue- (25567+2 )) * 86400 * 1000);
}

Excel 中的日期: 6/14/2016 12:00:00 PM

日期值: 42535.5

将值转换为 JavaScript 中的日期: getJsDateFromExcel(42535.5).toUTCString()

结果: "Tue, 14 Jun 2016 12:00:00 GMT"

更新

你代码中的日期格式是什么?我们需要指定 Excel 可以识别的正确格式。设置值后,如果日期被识别为字符串,它将左对齐而不是如下图所示:

这是 set/get 日期的代码:

function setData() {
        Excel.run(function (ctx) {
            var sheetName = "Sheet1";
            var rangeAddress = "A1";
            var range = ctx.workbook.worksheets.getItem(sheetName).getRange(rangeAddress);
            range.load("values");
            return ctx.sync().then(function () {
                range.values = "6/15/2016 13:00:00";
            });
        }).catch(function (error) {
            console.log("Error: " + error);
            if (error instanceof OfficeExtension.Error) {
                console.log("Debug info: " + JSON.stringify(error.debugInfo));
            }
        });
    }

function getData() {
    Excel.run(function (ctx) {
        var sheetName = "Sheet1";
        var rangeAddress = "A1";
        var range = ctx.workbook.worksheets.getItem(sheetName).getRange(rangeAddress);
        range.load("values");
        return ctx.sync().then(function () {

            var d = getJsDateFromExcel(range.values[0])
            var strD = d.toUTCString();
        });
    }).catch(function (error) {
        console.log("Error: " + error);
        if (error instanceof OfficeExtension.Error) {
            console.log("Debug info: " + JSON.stringify(error.debugInfo));
        }
    });
}

getData结果: