- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
针对Excel下打开表格图片显示 #NAME?编辑栏显示为 =@_xlfn.DISPIMG( 样公式的问题,一般需要在 wps 程序下,Ctrl+F 查找范围选值,输入 =DISPIMG 全选,然后再右键转换为浮动图片。如果是Excel中,则是查找公式 DISPIMG。 查阅网上得资料得知,可以通过解压表格文件,然后 根据公式中的第一参数(通常以 ID 开头)看 xl_rels\cellimages.xml.rels 目录下的 name (其值为 dispimg 函数的第一参数)和 r:embed (其值以 rId 开头)的对应关系,然后再看 Id ( rId 开头 ) 和 Target(图片路径) 的对应关系,进而得到图片的路径。 在 LLM 的帮助下进而有以下 PS 脚本.
function Get-ExcelDispImages {
param (
[Parameter(Mandatory=$true)]
[string]$ExcelPath,
[Parameter(Mandatory=$false)]
[string]$OutputFolder = ".\ExcelImages"
)
# 辅助函数:安全地读取文件内容
function Read-FileContent {
param (
[string]$Path
)
try {
# 使用.NET方法直接读取文件,避免PowerShell路径解析问题
if ([System.IO.File]::Exists($Path)) {
return [System.IO.File]::ReadAllText($Path)
}
Write-Host "File not found: $Path" -ForegroundColor Yellow
return $null
}
catch {
Write-Host "Error reading file $Path : $_" -ForegroundColor Yellow
return $null
}
}
try {
# 验证Excel文件是否存在
if (-not (Test-Path -LiteralPath $ExcelPath)) {
throw "Excel file not found: $ExcelPath"
}
# 确保ExcelPath是绝对路径
$ExcelPath = (Get-Item $ExcelPath).FullName
# 创建输出文件夹(使用绝对路径)
$OutputFolder = [System.IO.Path]::GetFullPath($OutputFolder)
if (-not (Test-Path -Path $OutputFolder)) {
New-Item -ItemType Directory -Path $OutputFolder -Force | Out-Null
}
# 创建Excel COM对象
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$workbook = $excel.Workbooks.Open($ExcelPath)
# 用于存储找到的DISPIMG ID和信息
$dispImgIds = @()
$imageMapping = @{}
# 遍历所有工作表
foreach ($worksheet in $workbook.Worksheets) {
$usedRange = $worksheet.UsedRange
$rowCount = $usedRange.Rows.Count
$colCount = $usedRange.Columns.Count
for ($row = 1; $row -le $rowCount; $row++) {
for ($col = 1; $col -le $colCount; $col++) {
$cell = $usedRange.Cells($row, $col)
$formula = $cell.Formula
# 检查是否包含DISPIMG函数并提取所有参数
if ($formula -match 'DISPIMG\("([^"]+)"') {
$imageId = $matches[1]
Write-Host "Found DISPIMG: $formula" -ForegroundColor Gray
# 创建参数列表
$params = @{
'ID' = $imageId
'Cell' = $cell.Address()
'Formula' = $formula
'Worksheet' = $worksheet.Name
}
# 提取所有参数,包括图片ID
$paramValues = @()
$formula -match 'DISPIMG\((.*?)\)' | Out-Null
$paramString = $matches[1]
$paramValues = $paramString -split ',' | ForEach-Object {
$_ -replace '"', '' -replace '^\s+|\s+$', ''
}
# 存储所有参数
for ($i = 0; $i -lt $paramValues.Count; $i++) {
$params["Param$i"] = $paramValues[$i]
}
$imageMapping[$imageId] = $params
$dispImgIds += $imageId
}
}
}
}
# 创建临时目录
$tempPath = Join-Path ([System.IO.Path]::GetTempPath()) "ExcelTemp"
if (Test-Path $tempPath) {
Remove-Item $tempPath -Recurse -Force
}
New-Item -ItemType Directory -Path $tempPath -Force | Out-Null
# 复制Excel文件到临时目录并解压
$tempExcel = Join-Path $tempPath "temp.xlsx"
$tempZip = Join-Path $tempPath "temp.zip"
Copy-Item -Path $ExcelPath -Destination $tempExcel -Force
if (Test-Path $tempZip) { Remove-Item $tempZip -Force }
Rename-Item -Path $tempExcel -NewName "temp.zip" -Force
Expand-Archive -Path $tempZip -DestinationPath $tempPath -Force
# 检查media文件夹并处理图片
$mediaPath = Join-Path $tempPath "xl\media"
if (Test-Path $mediaPath) {
# 显示DISPIMG参数和图片对应关系
Write-Host "`nFound $($imageMapping.Count) DISPIMG functions" -ForegroundColor Cyan
if ($imageMapping.Count -gt 0) {
Write-Host "`n=== DISPIMG Functions Found ===" -ForegroundColor Cyan
Write-Host "Found $($imageMapping.Count) DISPIMG functions" -ForegroundColor Cyan
# 显示所有找到的DISPIMG函数
Write-Host "`n=== DISPIMG Functions Details ===" -ForegroundColor Yellow
foreach ($id in $imageMapping.Keys) {
$params = $imageMapping[$id]
Write-Host "Cell: [$($params.Worksheet)]$($params.Cell)" -ForegroundColor Gray
Write-Host "Formula: $($params.Formula)" -ForegroundColor Gray
}
# 首先从cellimages.xml获取DISPIMG ID到rId的映射
$dispImgToRid = @{}
$cellImagesPath = Join-Path $tempPath "xl\cellimages.xml"
Write-Host "`n=== Reading cellimages.xml ===" -ForegroundColor Yellow
Write-Host "Path: $cellImagesPath" -ForegroundColor Gray
if (Test-Path $cellImagesPath) {
try {
$xmlContent = Get-Content $cellImagesPath -Raw -EnCoding UTF8
Write-Host "`nRaw XML Content:" -ForegroundColor Gray
Write-Host $xmlContent
# 使用正则表达式提取所有cellImage元素
$matches = [regex]::Matches($xmlContent, '<etc:cellImage>.*?</etc:cellImage>', [System.Text.RegularExpressions.RegexOptions]::Singleline)
Write-Host "`nFound $($matches.Count) cellImage elements" -ForegroundColor Gray
foreach ($match in $matches) {
$cellImageXml = $match.Value
Write-Host "`nProcessing cellImage element:" -ForegroundColor Gray
# 提取name属性(包含DISPIMG ID)
if ($cellImageXml -match 'name="([^"]+)"') {
$dispImgId = $matches[1]
Write-Host "Found DISPIMG ID: $dispImgId" -ForegroundColor Gray
# 提取r:embed属性(包含rId)
if ($cellImageXml -match 'r:embed="(rId\d+)"') {
$rId = $matches[1]
$dispImgToRid[$dispImgId] = $rId
Write-Host " Mapping: DISPIMG ID $dispImgId -> rId $rId" -ForegroundColor Green
}
}
}
}
catch {
Write-Host "Error reading cellimages.xml: $($_.Exception.Message)" -ForegroundColor Red
Write-Host $_.Exception.StackTrace -ForegroundColor Red
}
}
else {
Write-Host "cellimages.xml not found!" -ForegroundColor Red
}
# 从cellimages.xml.rels获取rId到实际图片的映射
$ridToImage = @{}
$cellImagesRelsPath = Join-Path $tempPath "xl\_rels\cellimages.xml.rels"
Write-Host "`n=== Reading cellimages.xml.rels ===" -ForegroundColor Yellow
Write-Host "Path: $cellImagesRelsPath" -ForegroundColor Gray
if (Test-Path $cellImagesRelsPath) {
try {
[xml]$relsXml = Get-Content $cellImagesRelsPath -Raw
Write-Host "`nXML Content:" -ForegroundColor Gray
Write-Host $relsXml.OuterXml
$relsXml.Relationships.Relationship | ForEach-Object {
if ($_.Target -match "media/") {
$ridToImage[$_.Id] = $_.Target
Write-Host " rId $($_.Id) -> $($_.Target)" -ForegroundColor Green
}
}
}
catch {
Write-Host "Error reading cellimages.xml.rels: $($_.Exception.Message)" -ForegroundColor Red
Write-Host $_.Exception.StackTrace -ForegroundColor Red
}
}
else {
Write-Host "cellimages.xml.rels not found!" -ForegroundColor Red
}
Write-Host "`n=== Summary of Mappings ===" -ForegroundColor Yellow
Write-Host "DISPIMG ID -> rId mappings:" -ForegroundColor Gray
$dispImgToRid.GetEnumerator() | ForEach-Object {
Write-Host " $($_.Key) -> $($_.Value)" -ForegroundColor Gray
}
Write-Host "`nrId -> Image mappings:" -ForegroundColor Gray
$ridToImage.GetEnumerator() | ForEach-Object {
Write-Host " $($_.Key) -> $($_.Value)" -ForegroundColor Gray
}
# 处理每个DISPIMG函数
Write-Host "`n=== Processing DISPIMG Functions ===" -ForegroundColor Yellow
foreach ($id in $imageMapping.Keys) {
$params = $imageMapping[$id]
Write-Host "`nProcessing: [$($params.Worksheet)]$($params.Cell)" -ForegroundColor Green
Write-Host "Formula: $($params.Formula)" -ForegroundColor Gray
Write-Host "DISPIMG ID: $id" -ForegroundColor Gray
# 从DISPIMG ID查找对应的rId
$rId = $dispImgToRid[$id]
if ($rId) {
Write-Host "Found rId: $rId" -ForegroundColor Green
# 从rId查找对应的图片路径
$imagePath = $ridToImage[$rId]
if ($imagePath) {
Write-Host "Found image path: $imagePath" -ForegroundColor Green
$imageName = Split-Path $imagePath -Leaf
# 查找对应的图片文件
$mediaFile = Get-ChildItem -LiteralPath $mediaPath | Where-Object { $_.Name -eq $imageName }
if ($mediaFile) {
$outputPath = Join-Path $OutputFolder "$id$($mediaFile.Extension)"
Copy-Item -LiteralPath $mediaFile.FullName -Destination $outputPath -Force
Write-Host "Successfully copied: $imageName -> $outputPath" -ForegroundColor Cyan
# 以 media 文件夹下的文件名复制
# Copy-Item $mediaFile.FullName $(Join-Path $OutputFolder $(Split-Path $imagePath -Leaf))
}
else {
Write-Host "Image file not found: $imageName" -ForegroundColor Red
}
}
else {
Write-Host "No image path found for rId: $rId" -ForegroundColor Red
}
}
else {
Write-Host "No rId found for DISPIMG ID: $id" -ForegroundColor Red
}
}
} else {
Write-Host "No DISPIMG functions found in the workbook." -ForegroundColor Yellow
}
}
}
catch {
Write-Host "错误: $($_.Exception.Message)" -ForegroundColor Red
}
finally {
# 清理
if ($workbook) {
$workbook.Close($false)
}
if ($excel) {
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
}
if (Test-Path $tempPath) {
Remove-Item $tempPath -Recurse -Force
}
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
}
一个可能的用法如下 Get-ExcelDispImages -ExcelPath "C:\Users\demo\Documents\dispimg_wps.xlsx" -OutputFolder $pwd\output 生成的图片在当前目录下的 output 文件夹下.
参考阅读:
最后此篇关于win11下利用PowerShell提取wps表格中嵌入的图片的文章就讲到这里了,如果你想了解更多关于win11下利用PowerShell提取wps表格中嵌入的图片的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 IBM WebSphere Portal,IBM WebSphere Portal 中的 /wps/portal 和 /wps/myportal 有什么区别? 最佳答案 /wps/port
是否可以在 native iOS 应用程序中嵌入 wps 功能?我想设计一个图形界面,允许通过 wps 按钮物理访问路由器的用户让 iPhone 使用 wps 加入该 wifi 网络。有什么一般建议从
我的应用程序运行良好,我使用 Paypal WPS,我保留默认值不变,我尝试使用沙箱并且一切正常,但现在,我想发布它,但我不太确定证书...默认凭据是 我怎样才能获得真实的凭据?我觉得 paypal
如何在geoserver中生成mbtiles?使用 openlayers 显示地理服务器层 例如像这样调用wms层 new OpenLayers.Layer.WMS("Kanpur", "http:/
WPS 的兼容性如何SAS 克隆与 SAS Institute 的相应产品? 有没有人尝试过 - 如果是这样:您遇到任何兼容性问题吗? 最佳答案 WPS 在他们的网站上有一个很好的比较文件。它列出了
我了解到 wireshark 能够识别接入点(通过信标帧或探测响应)是否为 WPS 配置。 特别是在无线管理框架下,有一个标记参数 --> "Tag: Vendor Specific: Microso
您好,我尝试使用 drupal 7 commerce paypal WPS 付款方式,但我的商店使用 BGN - 保加利亚列弗货币,当我尝试使用 paypal 30BGN 在 paypal 中结账时,
我正在尝试通过 cURL 提交到 Paypal Website Payments Pro。我正在尝试做这样的事情: // set vars $cmd = "_cart"; $u
我正在尝试学习 cocoa 和 Objective C 的开发。我想从 cocoa 应用程序内部运行 WPS。此命令在终端上运行:wps test.sas该命令创建一个 test.log 和一个 te
我尝试了下面的代码,它在 Marshmallow 上运行,但在 Nougat 上不起作用。任何人都可以帮助我如何解决这个问题...... 我的内部存储中有一个 Excelfile...如果未安装 wp
“金额”字段中 PayPal 网站支付标准 (WPS) 表单允许的格式是什么?小数点必须是“.”,还是取决于货币?必须始终恰好保留两位小数,还是也可以保留三位(对于具有如此小的提名的货币)或没有(对于
我目前有一个网站支付标准结账流程,用于购买年度订阅和独立虚拟产品,这是最简单的形式; 收集有关客户的一些基本详细信息,并将新购买记录到我网站的数据库中 使用准备自动提交给客户端 PayPal 的网络表
我有一个我已经建立的 WordPress 网站。我已经安装并使用了 WPS 隐藏登录插件来帮助提高安全性(如果有帮助的话)。 我将登录 URL 的值保留为默认值,我认为是 /login 当我去/log
我正在使用 Tika 从多种类型的文档中提取文本。java -jar tika-app-1.10.jar -T [输入文件]我意识到 Tika-1.10 可以检测 .wps 文件(java -jar
请花点时间了解我的情况。如果有不明白的地方,请在评论中告诉我。 我有一个航点数组列表。这些航路点没有任何顺序。航点具有以下属性: {int type, float z, float y, float
我的操作系统是 Ubuntu LTS 16.04安装最新的 WPS Office rpm 包后,似乎我以某种方式搞砸了导致 exec of init (/sbin/init) failed!!!: A
我正在尝试将 PayPal WPS 与我的 Ubercart 一起使用,我希望用户在下订单之前不必在我的网站上创建帐户。但是,如果我启用“匿名结帐”,然后通过 PayPal 交易过程,当 PayPal
我正在尝试调出一个网络设备。它需要连接到 Wifi 网络。但是由于该设备没有任何键盘,我打算使用 WPS 连接到网络。我的设备运行基于 Linux 的操作系统。我对实现 WPS 功能一无所知。是否有任
我找不到任何关于将 .wpd 文件(WPS SAS 表)导入 R 的内容。有谁知道如何在 R 中导入这些表? 我知道您可以使用外来和 Hmisc 库来导入 sas7bdat 文件,但到目前为止我还没有
首先,对不起我糟糕的英语。我正在尝试编写一个 bash 脚本,以便使用 reaver 执行 AP WPS 破解。问题是在尝试了一些 WPS-PIN 之后,AP 锁定了 WPS,所以我的收割机没有用。
我是一名优秀的程序员,十分优秀!