【问题标题】:how to handle date type in excel addin office.js如何在 Excel 插件 office.js 中处理日期类型
【发布时间】:2016-06-14 05:24:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: office365-apps office-js


    【解决方案1】:

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

    该数字表示自 1900 年 1 月 0 日以来的天数,加上 24 小时制的小数部分:ddddd.tttttt。这称为序列日期或序列日期时间。有关 Excel 中的日期和时间,请参阅here。但是,JavaScript 中的日期从 1970 年 1 月 1 日 UTC 开始(参考Date in 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()

    结果: “格林威治标准时间 2016 年 6 月 14 日星期二 12:00:00”

    更新

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

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

    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 的结果:

    【讨论】:

    • 嗨,我正在使用字符串中的日期设置范围的值,我无法将值类型设置为日期。所以当我使用 javascript 读取单元格时,我没有得到数值。我只是得到字符串中的日期。我没有看到你说的这个数字。我正在使用来自 github.com/OfficeDev/office-js-docs/blob/master/reference/excel/… 的 api
    • 代码中的日期格式是什么?我们需要指定 Excel 可以识别的正确格式。测试代码见更新。
    • 另请注意,有一个 .NumberFormat 属性允许您设置类似“yyyy-mm-dd”的内容。有关选项的完整列表,请参阅 support.office.com/en-us/article/…
    • 您好,解决方案有问题,它重新调整了UTC时间,相当于本地时间。如果您实际上将其转换为当地时间,它将产生不同的结果。你能纠正一下吗?
    • 我修改了这样的函数 function getJsDateFromExcel(excelDateValue) { var date = new Date((excelDateValue - (25567 + 2)) * 86400 * 1000); var localTime = new Date(date.getTime() + (new Date()).getTimezoneOffset() * 60000);返回本地时间; } 它仍然给出了关于秒的错误值
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 2019-11-18
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多