Откройте защищенный паролем файл Excel xlsx с Powershell и сохраните его в формате csv без пароля - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть защищенный паролем файл Excel (Office 2019, файл xlsx). Я хотел бы создать скрипт Powershell, чтобы открыть файл с паролем, а затем сохранить его как CSV-файл без пароля в новом каталоге. Я пытался ответить на вопрос здесь , но это не помогло мне. У меня нет большого опыта работы с Powershell, любая оценка приветствуется.

Я хотел бы обновить это здесь для всех, кто ищет подобное решение, решение ниже. Я был удивлен, что нигде не смог найти простой инструкции.

И к критике c моего исходного поста - если бы вы писали что-то подобное в прошлом, ответом была бы простая копия и вставка существующего сценария, который вы могли бы использовать. У меня есть большое хранилище этих типов сценариев, и я часто делюсь ими с коллегами и сообществом, поэтому я искал кого-то, кто мог бы поделиться чем-то похожим. Вы, очевидно, не так, поэтому не было никакого смысла в вашем ответе.

$filepath = "C:\MyDailyFile\Blah.xlsx"
$password = "omgpassword"

try {
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $true
    $excel.DisplayAlerts = $true

## Open target password protected workbook
## [Type}::Missing are placeholders for positional parameters. See the Workbook class for more detail.

$wb = $excel.Workbooks.Open($filepath, [Type]::Missing, [Type]::Missing, [Type]::Missing, $password)
$sheet = $wb.ActiveSheet

## Save the open workbook in a new directory without a password
## and change the file type to CSV

$wb.SaveAs("C:\MyDailyFile\BlahCommaDelim",6,"")

## The second property of the SaveAs class (6) corresponds to a type "csv". The above results in the following SaveAs path: 
## C:\MyDailyFile\BlahCommaDelim.csv
## More information on XlFileFormat parameters https://docs.microsoft.com/en-us/office/vba/api/Excel.XlFileFormat

$excel.Quit()

} finally {
    $sheet, $wb, $excel | ForEach-Object {
        if ($_ -ne $null) {
            [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($_)
        }
    }
}

1 Ответ

0 голосов
/ 29 апреля 2020

Всегда просматривайте код по одному блоку за раз, чтобы убедиться, что вы получаете то, что ожидаете.

Я использую сценарий отладки моего бедняка, используя сжатие переменной , что означает присвоение результатов переменной при автоматическом выводе на экран. Вы заметите, что все работает как положено, и вопрос Ли о том, какие ошибки вы получили, является разумным вопросом.

Ваше утверждение:

Я пытался ответить на вопрос здесь, но у меня это не сработало.

... на самом деле не проясняется заявление.

($XlsFiles = Get-ChildItem -Path 'D:\Temp' -Filter 'File*.xl*')
<#
# Results

    Directory: D:\Temp

Mode                LastWriteTime         Length Name        
----                -------------         ------ ----        
-a----        28-Apr-20     15:49           9811 FileData.xlsx                                                                                                      
-a----        28-Apr-20     15:50          16384 FileDataProtected.xlsx 
#>

($XlsFiles = Get-ChildItem -Path 'D:\Temp' -Filter 'File*.csv')
<#
# Results

    Directory: D:\Temp

Mode                LastWriteTime         Length Name        
----                -------------         ------ ----        
-a----        06-Apr-20     00:54            260 FileData.csv  
#>

($filepath = 'D:\Temp\FileDataProtected.xlsx')
($password = 'omgpassword')
<#
# Results

D:\Temp\FileDataProtected.xlsx
omgpassword
#>


$excel               = New-Object -ComObject Excel.Application
$excel.Visible       = $true
$excel.DisplayAlerts = $true

Почему вы здесь набираете? Это действительно не гарантировано.

# ($wb = $excel.Workbooks.Open($filepath, [Type]::Missing, [Type]::Missing, [Type]::Missing, $password))
<#
# Results

Application                      : Microsoft.Office.Interop.Excel.ApplicationClass
Creator                          : 1480803660
Parent                           : Microsoft.Office.Interop.Excel.ApplicationClass
AcceptLabelsInFormulas           : False
ActiveChart                      : 
ActiveSheet                      : System.__ComObject
Author                           : 
AutoUpdateFrequency              : 0
AutoUpdateSaveChanges            : 
ChangeHistoryDuration            : 0
BuiltinDocumentProperties        : System.__ComObject
Charts                           : System.__ComObject
CodeName                         : 
_CodeName                        : 
CommandBars                      : 
Comments                         : 
ConflictResolution               : 1
Container                        : 
CreateBackup                     : False
CustomDocumentProperties         : System.__ComObject
Date1904                         : False
DialogSheets                     : System.__ComObject
DisplayDrawingObjects            : -4104
FileFormat                       : 51
FullName                         : D:\Temp\FileDataProtected.xlsx
...
#>

($wb    = $excel.Workbooks.Open($filepath,0,0,5,$password))
<#
# Results

Application                      : Microsoft.Office.Interop.Excel.ApplicationClass
Creator                          : 1480803660
Parent                           : Microsoft.Office.Interop.Excel.ApplicationClass
AcceptLabelsInFormulas           : False
ActiveChart                      : 
ActiveSheet                      : System.__ComObject
Author                           : 
AutoUpdateFrequency              : 0
AutoUpdateSaveChanges            : 
ChangeHistoryDuration            : 0
BuiltinDocumentProperties        : System.__ComObject
Charts                           : System.__ComObject
CodeName                         : 
_CodeName                        : 
CommandBars                      : 
Comments                         : 
ConflictResolution               : 1
Container                        : 
CreateBackup                     : False
CustomDocumentProperties         : System.__ComObject
Date1904                         : False
DialogSheets                     : System.__ComObject
DisplayDrawingObjects            : -4104
FileFormat                       : 51
FullName                         : D:\Temp\FileDataProtected.xlsx
...
#>

Вы не используете это нигде в том, что вы опубликовали, ооо, зачем это делать? Это займет много времени, чтобы завершить то, что вы не используете.

#>
($sheet = $wb.ActiveSheet) 
<#
# Results

Application                       : Microsoft.Office.Interop.Excel.ApplicationClass
Creator                           : 1480803660
Parent                            : System.__ComObject
CodeName                          : 
_CodeName                         : 
Index                             : 1
Name                              : FileData
...
#>



$wb.SaveAs('D:\Temp\FileDataUnProtected.csv',6,'')
<#
# Results

Когда вы сделаете это, конечно, Excel будет кричать вам о потере данных, переключаясь с Xlsx на CSV.

# Clean-up
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
<#
# Results

6
#>


($XlsFiles = Get-ChildItem -Path 'D:\Temp' -Filter 'File*.csv')
<#
# Results


    Directory: D:\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        06-Apr-20     00:54            260 FileData.csv
-a----        28-Apr-20     16:21            129 FileDataUnProtected.csv
#>

Get-Content -Path 'D:\Temp\FileDataUnProtected.csv'
<#
# Results

0 minutes
0 minutes
1 day and 19 hours
1 day and 2 hours
1 day and 20 hours
1 day and 23 hours
13 hours
2 days
20 hours
#>

Import-Csv -Path 'D:\Temp\FileDataUnProtected.csv'
<#
# Results

0 minutes         
1 day and 19 hours
1 day and 2 hours 
1 day and 20 hours
1 day and 23 hours
13 hours          
2 days            
20 hours 
#>

Наконец, это не имеет особого смысла, поскольку у вас есть только один COM-объект для удаления, остальные являются просто переменными и должны быть очищены с помощью командлета Remove-Variable

finally {
$sheet, $wb, $excel | ForEach-Object {
    if ($_ -ne $null) {
        [void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($_)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...