把wps表格当成图片生成器
wils
Lv.4 核心创作者
当初学习powershell脚本的契机,就是看见别人用ps1脚本控制MS Excel生成饼图图片,当时觉得非常神奇🎉
后来用上了wps顺手一试,也是很简单就能成功,于是做了一个小命令
无论是csv、json还是进程列表、文件夹列表,都可以快速生成图片图表
现在有了灵犀,原来写的脚本就不献丑了🤣
直接让灵犀做:
写个ps1脚本,结果保存为gbk编码,就在本机powershell 5.1环境运行,获取当前进程列表数据,然后创建com对象ket.application,在表格里创建饼图,用以列出占用内存前10的进程,其余的统一标其他,然后还是通过com接口,将图表另存到当前目录下的png或jpg图片,关闭ket对象,释放com对象,ket的接口可以参考excel.application
一次就写成了
执行脚本
输出一张png图片
因为没有设计样式,看起来有点丑,可以让灵犀不断完善,形成统一的风格
可以根据自己的情况,告诉灵犀未来处理数据的形式
以后只需双击脚本,或者把文件拖动到脚本上,或者指定目录等等,就可以立即得到一张图片图表,用起来相当方便🎉
简单的说就是做了个图片一键生成器🤣
最后附上灵犀写的代码:
# 运行:powershell -ExecutionPolicy Bypass -File .\process_pie.ps1
$ErrorActionPreference = 'Stop'
# 1. 按进程名聚合内存(MB),取前10,其余归入“其他”
$data = @(Get-Process | Group-Object ProcessName | ForEach-Object {
[PSCustomObject]@{
Name = $_.Name
Memory = [math]::Round(($_.Group | Measure-Object WorkingSet64 -Sum).Sum / 1MB, 2)
}
} | Sort-Object Memory -Descending | Select-Object -First 10)
$data += [PSCustomObject]@{ Name = '其他'; Memory = [math]::Round(
(Get-Process | Group-Object ProcessName | ForEach-Object {
($_.Group | Measure-Object WorkingSet64 -Sum).Sum / 1MB
} | Sort-Object -Descending | Select-Object -Skip 10 | Measure-Object -Sum).Sum, 2) }
# 2. 创建 WPS 表格 COM 对象(接口参照 Excel.Application)并写入数据
$ket = New-Object -ComObject Ket.Application
$wb = $ket.Workbooks.Add()
$ws = $wb.Worksheets.Item(1)
$ws.Cells.Item(1, 1) = '进程名'
$ws.Cells.Item(1, 2) = '内存(MB)'
for ($i = 0; $i -lt $data.Count; $i++) {
$ws.Cells.Item($i + 2, 1) = $data[$i].Name
$ws.Cells.Item($i + 2, 2) = $data[$i].Memory
}
# 3. 创建饼图并绑定数据
$chart = $ws.ChartObjects().Add(400, 20, 480, 320).Chart
$chart.SetSourceData($ws.Range('A1:B' + ($data.Count + 1)))
$chart.ChartType = -4102 # xl3DPie;平面饼图为 -4100
$chart.HasTitle = $true
$chart.ChartTitle.Text = '内存占用前10进程'
# 4. 导出为 PNG
$outPath = Join-Path (Get-Location) 'process_memory_pie.png'
$chart.Export($outPath)
Write-Host "图表已保存: $outPath"
# 5. 关闭并清理 Ket 对象
$wb.Close($false)
$ket.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($ket) | Out-Null
Lv.1 新人创作者