【问题标题】:Office-js: Insert a new column in Excel and partially fill it with new dataOffice-js:在 Excel 中插入一个新列并用新数据部分填充它
【发布时间】:2022-02-02 00:34:32
【问题描述】:

尽管我对the new Office.js 感到很兴奋,但我似乎很难让它执行最基本的 excel 操作,并且在他们的 api 上找到答案的成功非常有限。

无论如何,如何在 excel 中插入一个新列并用部分数据填充它?

我有类似的东西:

Excel.run(async (ctx) => { 
    let sheet = ctx.workbook.worksheets.getItem("Sheet1");
    let range = sheet.getRange("C4:C5").insert('right');
    range.values = [["foo"],["bar"]];
    await ctx.sync();   
}).catch(function (error) {
    console.log(error);
});

但这段代码的问题在于,它将新数据插入到我想要的位置,在 C 列的右侧,但它没有创建新列,而是 在所有其他列,但仅限于第 4-5 行,这会弄乱我的电子表格/表格的其余部分。

相反,我想先在 C 的右侧插入一个新列,然后在该新列中为其分配一个值数组以部分填充它。谢谢。


编辑:
这是我得到的:

 _______________________
|  C  |  D  |  E  |  F  |
-------------------------
| ... | john| 4   | ... |
| ... | jeff| 87  | ... |
| ... | mary| 9   | ... |
| ... |  foo| cory| 54  |    <--- just shifts data in rows 4 and 5 over
| ... |  bar| eric| 33  |
| ... | paul| 5   | ... |
-------------------------
   ^----------------------------- column I have a reference/address too (column C)

这就是我想要的:

 _______________________
|  C  |  D  |  E  |  F  |
-------------------------
| ... |     | john| 4   |   
| ... |     | jeff| 87  |
| ... |     | mary| 9   |
| ... |  foo| cory| 54  |
| ... |  bar| eric| 33  |
| ... |     | paul| 5   |
-------------------------

【问题讨论】:

  • 你能画出你想看的东西吗?

标签: ms-office office-js excel-2016


【解决方案1】:

我很难理解 Office-js 的做事方式,但我主要是通过以下方式使用它:

  ...
  sheet = ctx.workbook.worksheets.getItem("Sheet1");
  sheet.getRange("C:C").insert('right'); 
  await ctx.sync();

  let range = sheet.getRange("C4:C7");
  range.values = [["foo"],["bar"]];
  await ctx.sync();
  ...

我最初希望在我开始使用的列的右侧添加一个新列并在该新列中添加数据,但由于我实际上并没有在我的代码中硬编码地址,结果证明这更容易并且仍然运行得足够接近我想要的......但我绝对仍然愿意接受更好或更正确的方法。

【讨论】:

  • 如果你画出你想要发生的事情,那会有所帮助。但无论如何,你不需要中间的await ctx.sync(),你可以让这两个东西成为同一批的一部分。
【解决方案2】:

来自 VBA,我为此苦苦挣扎。我花了一段时间才明白的诀窍是必须将一整列传递给.insert

我做了一个小函数,它将返回相对于旧范围的新范围,并采用可选的列标题,您可以指定“列标题向上”。

这是因为我给函数的范围是表中的单个列,但只有正文,不包括标题。返回范围也是body,但是header已经设置在rng之上一行了。

例子:

function Get_InsertCol(rng, opt_colheader, opt_colheaderupone, opt_shiftdir) {
    if (opt_shiftdir == undefined) { opt_shiftdir = 'right' }
    rng.getColumn(0).getEntireColumn().getOffsetRange(0, 1).insert(opt_shiftdir);
    if (opt_colheader != undefined) {
        if (opt_colheaderupone == undefined) {
            rng.getRow(0).getOffsetRange(0, 1).values = opt_colheader
        } else {
            rng.getRow(0).getOffsetRange(-1, 1).values = opt_colheader
        }
    };
    return rng.getOffsetRange(0, 1);
}

export async function helloworld(event) {
    try {
        await Excel.run(async (context) => {
            //Start Func
            var ws = context.workbook.worksheets.getActiveWorksheet();

            ws.getRange("B2").values = "ColumnHeader"
            var rng = ws.getRange("B3:B5")
            rng.values = "testdata"

            var offsetrng = Get_InsertCol(rng,"ColHeader",true)
            offsetrng.select();

            await context.sync();
        });
    } catch (error) {
        console.error(error);
    }
    event.completed();
}

结果:

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多