TypeScript(Office 脚本)在 excel 工作簿中强制图像压缩

TypeScript (Office Script) to force image compression in excel workbook

编码大师

是否可以通过 Office 脚本在 excel 中在线调用类似于此 VBA 代码的内容?

Sub test()

    Dim wsh As Worksheet
    Dim shp As Shape

    Set wsh = Worksheets("Sheet1")

    For Each shp In wsh.Shapes
        shp.Select
        SendKeys "%e", True
        SendKeys "~", True
        Application.CommandBars.ExecuteMso "PicturesCompress"
    Next shp

End Sub

基本上,我正在动态地将一个 excel 在线 excel sheet 与 base 64 图像更新到一个形状容器中,但我希望下载版本的 sheet自动降低图像质量,我知道 excel 网上没有 'compress picture' 功能,所以我正在寻找解决方法,以便在下载的 excel sheet 中打开它自动降低所有照片的图像质量。

我曾尝试将 sheet 的 excel 在线版本(在离线模式下)的首选项更改为较低质量的图像,但参数似乎会在重新在线后立即恢复。 ..

在此先感谢您的帮助!

好的,注意了。还知道我已经对此进行了测试并且它对我有用。

此外,我不知道你对以下知识的了解,所以我想把你当布偶,一步一步地指导你。

进入 Azure 门户并创建一个新的 .NET Azure 函数并将其命名为 ChangeImageQuality。现在,在代码视图中,确保打开底部的抽屉,以便您可以看到日志。

在复制任何代码之前,您需要在名为 function.proj 的解决方案中创建一个新文件,并且需要将其与此内容一起保存...

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="SixLabors.ImageSharp" Version="2.0.0" /> 
    </ItemGroup>
</Project>

https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-csharp#referencing-custom-assemblies

当您保存它时,日志应该显示(如上面的屏幕截图所示)它正在从项目文件中恢复 Nuget 包等。

现在,回到您的 run.csx 文件,添加以下代码 ...

#r "Newtonsoft.Json"

using System;
using System.Net;
using SixLabors.ImageSharp;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    var result = new MemoryStream(); 

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);

    int quality = data.Quality;
    string base64Image = data.Image;

    var memoryStream = new MemoryStream(Convert.FromBase64String(base64Image));

    using (var image = SixLabors.ImageSharp.Image.Load(memoryStream))
    {
        image.SaveAsJpeg(result, new SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder()
        {
            Quality = quality
        });
    }

    return new ContentResult()
    {
        ContentType = "text/html",
        Content = Convert.ToBase64String(result.ToArray())
    };
}

该代码假设了一些事情,其中​​之一是您提供的一切都是完美的,即缺少错误检查,但它非常简单。

现在从 LogicApps 中,您可以使用 Azure Function 连接器调用该函数,它将 运行 和 return 给您一个 base64 字符串,该字符串是质量下降的图像你指定了。

JSON 有效载荷

{
  "Image": "@{variables('Base 64 Image')}",
  "Quality": 10
}

当然,您只需将变量更改为您的 base 64 实例以及您想要的质量,然后将响应主体传递到您的 Run script 步骤。

就像我说的,我测试了它并且它运行良好。