【问题标题】:Update links in Excel files更新 Excel 文件中的链接
【发布时间】:2020-11-06 10:11:35
【问题描述】:

我正在尝试修改一些链接到其他 Excel 文件的 Excel 文件。

链接到的文件位于子目录中。我要将所有文件移动到根目录,然后运行脚本来更改链接。

我能够在每个文件中找到链接,但我无法修改它们(见下文)

有什么想法吗?

谢谢

P

#get all the excel files in the directory

Get-ChildItem $sourceDir -Filter *.xl* |

Foreach-Object {

write-host -ForegroundColor Yellow $_.FullName



$workbook = $excel.Workbooks.Open($_.FullName)



foreach ($link in $workbook.LinkSources(1))

{

write-host $link.Address

#this gives me .... C:\temp\files\childfile1.xlsx etc

# $link.Address seems to be read only?

#$link.Address = $newLink

#this doesn't seem to work either ...

#$workbook. .ChangeLink($link,$newlink,1)

}





#$workbook.Save()

$workbook.Close()

【问题讨论】:

  • 写入主机 $Tab -ForegroundColor White $link.Address #Y:\Deirdre\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Phased Budget 2020.xlsx $link.Address = "C: \\temp\Finance\child.xlsx" write-host $Tab -ForegroundColor White $link.Address 在此对象上找不到属性“地址”。验证该属性是否存在并且可以设置。

标签: excel powershell


【解决方案1】:

如果您正在修改 XLSX 文件,您可以在不使用 Excel 的情况下更新链接。最终,这些是具有不同扩展名的 zip 存档。如果您创建文件的副本以具有 ZIP 扩展名,则可以使用 Expand-Archive 访问各种文件并相应地更新它们,然后 Compress-Archive 生成​​一个新的 Excel 文件。

在存档中,查找 /workbook.xml,它将按名称识别工作表。 /rels/workbook.xlm.rels 可用于从 sheetId 转换为工作表(目标),/worksheets 中的文件(例如“worksheets/sheets3.xml”),您可以推断关系文件,该文件将在 /工作表/_rels(例如 /worksheets/_rels/sheet3.xml)。

使用工作表,您可以使用 ref 属性找到基于单元格引用的关联超链接,该属性为您提供 r:id 属性。我们可以使用此值通过 Id 查找适当的关系。然后,您需要适当地更新 Target。

当然,如果您知道原始链接,并且它是唯一的(或者您以相同的方式更改它们),您可以在 .rels 文件中进行搜索和替换。

保存更改后,您只需创建新文件,您可以使用 Compress-Archive 来完成。您需要对扩展名为 .Zip 的文件执行此操作,然后重命名。


这是一个基于 XSLX 的示例,第一个工作表上带有指向 Yahoo 的链接(注意:前 3 个工作表通常具有 XML 和工作表名称匹配,直到更改。不要指望生产)

copy-item c:\temp\links.xlsx c:\temp\links.zip 
expand-archive c:\temp\links.zip c:\temp\links_zip
$content = get-content c:\temp\links_zip\xl\worksheets\_rels\sheet1.xml.rels -raw # allow file to close
$content |  %{ $_ -replace 'http://www.yahoo.com','http://www.google.com'} | set-content c:\temp\links_zip\xl\worksheets\_rels\sheet1.xml.rels
compress-archive c:\temp\links_zip\* c:\temp\links_alt.zip 
remove-item c:\temp\links_zip -Recurse
rename-item c:\temp\links_alt.zip c:\temp\links_alt.xlsx
c:\temp\links_alt.xlsx 

【讨论】:

  • 嗨,格雷厄姆,感谢您的回答。
    我使用 powershell 将文件复制到 zip,修改链接并将 zip 解压缩回 excel,但我似乎做错了什么。
    C:\temp\Finance\parentfile1\parentfile1 zip\xl\ worksheets_rels 包含链接,所以我在那里修改它们。
  • @PeteWhelan 在更新时检查 XML 之前和之后。还要检查您是否正在压缩您提取的文件夹中的文件,而不是提取的文件夹本身(否则您正在添加额外级别的文件夹)。
  • 谢谢 Graham 我已经尝试过几次了。修改 xl\externalLinks_rels 中的 xml 文件中的路径,但是当我在进行这些更改后打开 Excel 文件时,它是空白的。我使用 PowerShell 进行复制和压缩。我最后创建的 Excel 文件似乎确实大于 0KB
  • PS C:\WINDOWS\system32> copy-item "Y:\Finance\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20.xlsx" -Destination "Y:\Finance \Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20.zip" PS C:\WINDOWS\system32> Expand-Archive "Y:\Finance\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20.zip" -DestinationPath "Y:\Finance\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20 压缩"
  • PS C:\WINDOWS\system32> Compress-Archive -Path "Y:\Finance\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20 压缩" -DestinationPath "Y:\ Finance\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20(固定)" PS C:\WINDOWS\system32> Copy-Item "Y:\Finance\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20 (fixed).zip" -Destination "Y:\Finance\Audit\Mgt Accts 2020\MGT ACCTS - Copy2\Mgt Accts APR 20 (fixed).xlsx" PS C:\WINDOWS\system32>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多