如何在Excel Add-in Office.js中处理日期类型

7

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

我认为这种方法会在将Excel文件保存在英语文化环境中并在法国文化环境的机器上打开时产生问题,因为两种文化中的日期格式不同。

我想知道如何处理这种情况。是否有办法说Excel中的单元格是日期类型。然后在不同的文化环境中自动调整其值。

1个回答

6
如果单元格的值类型为日期,则从该文本中获取值时,我们将获得一个数字而不是在UI上显示的文本。
该数字表示自1900年1月0日以来的天数,加上24小时一部分:ddddd.tttttt。这称为序列日期或序列日期时间。有关Excel中的日期和时间,请参阅此处。但是,在JavaScript中的日期从1970年1月1日UTC开始(请参阅JavaScript中的日期)。
我们需要将数字转换为JavaScript中所需的日期时间。当Excel将日期时间转换为值时,它不计算时区。
以下是将Excel中的日期值转换为UTC的演示,供您参考:
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能够识别。在设置值后,如果日期被识别为字符串,则它将向左对齐而不是像下面的图表一样: enter image description here

以下是设置/获取日期的代码:

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));
        }
    });
}

获取数据的结果为: 在此输入图片描述


嗨,我正在使用字符串中的日期设置范围值,但我无法将值类型设置为日期。因此,当我使用 JavaScript 读取单元格时,我无法获得数值,我只能得到日期字符串。我看不到你所说的那个数字。我正在使用 https://github.com/OfficeDev/office-js-docs/blob/master/reference/excel/range.md 中的 API。 - shyam_
你的代码中日期格式是什么?我们需要指定正确的格式,以便Excel能够识别。请查看更新后的代码进行测试。 - Fei Xue - MSFT
还要注意,有一个.NumberFormat属性,允许您设置类似于“yyyy-mm-dd”的内容。请参见https://support.office.com/en-us/article/Create-or-delete-a-custom-number-format-78f2a361-936b-4c03-8772-09fab54be7f4以获取完整的选项列表。 - Michael Zlatkovsky - Microsoft
嗨,解决方案有些问题,它返回的时间是UTC时间,相当于本地时间。如果你实际上将其转换为本地时间,结果会有所不同。请你修正一下这个问题。 - shyam_
我修改了这个函数,像这样:function getJsDateFromExcel(excelDateValue) { var date = new Date((excelDateValue - (25567 + 2)) * 86400 * 1000); var localTime = new Date(date.getTime() + (new Date()).getTimezoneOffset() * 60000); return localTime; } 但是它仍然会给出错误的秒数值。 - shyam_
这是因为Excel无法处理时区。如果您想处理时区,您需要自己转换日期时间。例如,您可以将本地时间转换为UTC并将UTC日期时间存储在Excel中。 - Fei Xue - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接