Редактирование строки подключения в загрузке документов XLSB - PullRequest
1 голос
/ 10 мая 2019

У меня есть пара сотен файлов .xlsb, для которых нужно легко изменить их строку подключения и текст команды. Все они похоронены в разных папках глубоко в файловой системе. Как я могу использовать Powershell или какую-либо другую программу, чтобы просмотреть и отредактировать их все, чтобы мне не пришлось делать это вручную?

Я начал изучать Powershell и Format-Hex. Я подумал, что могу спросить, и кто-то другой сможет поставить меня на правильный путь. Что нужно сделать, так это рекурсивно искать файловую систему из определенной точки, определять, находятся ли «эта строка» и этот номер «11111» в строке подключения и тексте команды (соответственно) всех файлов xlsb, и заменяют их на «та строка» и это число «22222». Все в файлах xlsb. Я также изучал использование python, но в библиотеках, которые я обнаружил, не упоминалось редактирование этого параметра, поэтому я решил, что какое-то обнаружение и замена в шестнадцатеричном формате будет проще.

1 Ответ

0 голосов
/ 10 мая 2019

Можно ли получить дополнительную информацию о том, что такое "строка подключения"? Насколько мне известно, это не является частью свойств файла xlsb. Я предполагаю, что это будет строка, которая используется для создания ODBC-соединения, поэтому текст, который вы хотите изменить, будет в коде макроса.

Итак, три вопроса:

  1. Рекурсивно найти все файлы xlsb в папке

$Fllt = gci "*.xlsb" -r

  1. Откройте их в Excel

$Excl = New-Object -ComObject Excel.Application

$Fllt | %{$xl.Workbooks.Open($_.Fullname)}

  1. Заменить «эту строку» на «эту строку» и «11111» на «22222» в каждом макросе. Это гораздо сложнее.

Мое предложение:

#Generation of a test file
$Excl = New-Object -ComObject Excel.Application
$xlve = $Excl.Version
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$xlve\Excel\Security" `
    -Name AccessVBOM -Value 1 -Force | Out-Null
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$xlve\Excel\Security" `
    -Name VBAWarnings  -Value 1 -Force | Out-Null
@'
Sub Co()
ConnectionString = "this string"
CommandText = "11111"
End Sub
'@ | Out-File C:\Temp\Test.txt -Encoding ascii
$Wkbk = $Excl.Workbooks.Add()
$Wkbk.VBProject.VBComponents.Import("C:\Temp\Test.txt") | Out-Null
$Wkbk.SaveAs("C:\Temp\Test.xlsb", 50)
$Excl.Quit()

#Get The files
$Fllt = gci -Path C:\Temp\ -Include *.xlsb -r

#Open Excel and set the security parameters to be able to modify macros
$Excl = New-Object -ComObject Excel.Application
$xlve = $Excl.Version
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$xlve\Excel\Security" `
    -Name AccessVBOM -Value 1 -Force | Out-Null
New-ItemProperty -Path "HKCU:\Software\Microsoft\Office\$xlve\Excel\Security" `
    -Name VBAWarnings  -Value 1 -Force | Out-Null


#Loop through the files and modify the macros
$path = "C:\Temp\ModuleVBATemp.txt" #Temp text file to copy and modify the macros 
foreach ($File in $Fllt) {
$Wkbk = $Excl.Workbooks.Open($File.Fullname)
if ($Wkbk.HasVBProject) <# Test if any macro #> {
foreach ($Vbco in $Wkbk.VBProject.VBComponents) {
if ($Vbco.Type -eq '1') <# Only modify the modules #> {
    #Modification of the script
    $Vbco.Export($path) | Out-Null
    (gc $path) -replace "this string","that string" -replace "11111","22222" `
      | Out-File $path -Encoding ascii
    $Wkbk.VBProject.VBComponents.Remove($Vbco)
    $Wkbk.VBProject.VBComponents.Import($path) | Out-Null
}}}
$Wkbk.Close($true) #Save the file
}
$Excl.Quit()

Он работает с моим тестовым файлом, надеюсь, ваша конфигурация похожа.

...