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>
当您保存它时,日志应该显示(如上面的屏幕截图所示)它正在从项目文件中恢复 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
步骤。
就像我说的,我测试了它并且它运行良好。
编码大师
是否可以通过 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>
当您保存它时,日志应该显示(如上面的屏幕截图所示)它正在从项目文件中恢复 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
步骤。
就像我说的,我测试了它并且它运行良好。