代码之家  ›  专栏  ›  技术社区  ›  avi12

Excel office js API-获取特定工作表的范围

  •  2
  • avi12  · 技术社区  · 8 年前

    Excel文档的工作表是一周中的几天(星期日-星期五)-需要迭代。

    我的代码尝试(均以失败告终):

    Excel.run(function(context) {
        const currentSheets = context.workbook.worksheets;
        const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
        for (let i = 0; i < worksheetDays.length; i++) {
            sheetRanges[worksheetDays[i]] = currentSheets.load("values");
        }
        return context.sync().then(function() {
            console.log(sheetRanges.Sunday.values); // null
        });
    });
    

    下一次尝试:

    Excel.run(function(context) {
        const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
        const sheetRanges = {};
        const currentSheets = context.workbook.worksheets;
        for (let i = 0; i < worksheetDays.length; i++) {
             sheetRanges[worksheetDays[i]] = currentSheets.getItem(worksheetDays[i]).load("values");
        }
        return context.sync().then(function() {
            console.log(sheetRanges.Sunday.values); // null
        });
    });
    

    下一步:

    Excel.run(function(context) {
        const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
        const sheetRanges = {};
        const currentSheets = context.workbook.worksheets;
        for (let i = 0; i < worksheetDays.length; i++) {
             sheetRanges[worksheetDays[i]] = currentSheets.getItem(worksheetDays[i]).getRange().load("values");
        }
        return context.sync().then(function() {
            console.log(sheetRanges.Sunday.values); // null
        });
    });
    

    下一步:

    Excel.run(function(context) {
        const worksheetDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
        var sheetRanges = {};
        const currentSheets = context.workbook.worksheets;
        for (let i = 0; i < worksheetDays.length; i++) {
            sheetRanges[worksheetDays[i]] = currentSheets.load("name");
        }
    })
    .then(context.sync)
    .then(function () {
         for (let i = 0; i < worksheetDays.length; i++) {
            sheetRanges[worksheetDays] = sheetRanges[worksheetDays].load("values");
        }
     })
    .then(function () {
        console.log(sheetRanges.Sunday.values); // null
    });
    


    如何解决这个问题?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   Michael Zlatkovsky    8 年前

    你非常非常接近。事实上,你的第三次尝试几乎是正确的。但是为了其他可能遇到这个问题的人,让我首先用前两个代码块来描述这个问题。

    对于前两次尝试,问题是您只能加载属性 实际上存在于物体上 .不幸的是,对于你的代码, values worksheet 对象

    就我个人而言,我发现最简单的方法是编写代码,就好像属性已经加载一样(并使用IntelliSense来指导您)。然后,往上走一行或多行 load range.load('value') ),并确保您有一个 context.sync() await -ed(如果您使用的是TypeScript)。

    Range 对于 全部的 然后加载其 价值观 所有物 null ,因为这样的范围是无限的(100多万行乘以16k列;您无法在宿主Excel应用程序和JavaScript之间传递此类数据)。因此,您想要使用的API是 sheet.getUsedRange()

    所以,说到这里,你可以进行第三次代码尝试,只需替换

    currentSheets.getItem(worksheetDays[i]).getRange().load("values");
    

    currentSheets.getItem(worksheetDays[i]).getUsedRange().load("values");
    

    所以你第三次尝试的时候离成功还有4个字符。顺便说一句,如果您一直在加载 address 。我会将反馈传递给我们的内容团队,以确保这一点更加明确。

    所以,最后的代码(并将其键入脚本,以便更好地测量:-),这样您就可以具有良好的智能感知):

    await Excel.run(async context => {
        const worksheetDays = ["Sunday", "Monday", /*...*/];
        const sheetRanges = {} as { [key: string]: Excel.Range }
    
        const currentSheets = context.workbook.worksheets;
        for (let i = 0; i < worksheetDays.length; i++) {
            sheetRanges[worksheetDays[i]] = currentSheets.getItem(worksheetDays[i]).getUsedRange().load("values");
        }
    
        await context.sync();
        console.log(sheetRanges["Sunday"].values);
    });
    

    你可以在新的脚本实验室中点击五下,尝试这个片段( https://aka.ms/getscriptlab ). 只需安装Script Lab插件(免费),然后在导航菜单中选择“导入”,并使用以下GIST URL: https://gist.github.com/Zlatkovsky/a045beb300c9b1a86276f6ff99fd64a4 看见 more info about importing snippets to Script Lab


    最后,我要说的是,对于上述许多主题,例如如何正确加载属性、了解集合访问的工作方式、在Office插件中使用TypeScript等等,您可能会找到这本书。” Building Office Add-ins using Office.js

    祝您一切顺利,祝您在插件开发体验中好运!如果遇到问题,一定要不断发帖。。。