PowerShell - 如何在未安装Excel的情况下将CSV文件转换为XLS格式

3

我有一个自动生成报告的服务器,这些报告是以CSV格式呈现的。我需要能够直接加密文件,而不需要使用第三方压缩软件(如WinZIP或WinRAR)。

我认为最好的方法是通过PowerShell将CSV转换为XLS,然后对XLS文件进行密码保护。不幸的是,服务器上没有安装Office,而且我找到的所有示例都需要安装Excel来完成文件转换。

请问是否有一种在没有安装Excel的情况下,在PowerShell中将CSV转换为XLS的方法?如果没有,请您能想到更好的方法来对CSV文件进行密码保护吗,而不用将其压缩为ZIP或RAR文件?


你想加密还是压缩? - mjolinor
你尝试过使用这个链接吗? - kravasb
Excel中的密码保护很容易被绕过。如果您需要真正的保护,您需要使用另一种方法,例如Windows内置的EFS功能。http://gallery.technet.microsoft.com/scriptcenter/Create-Encrypted-Folder-6f0fe0c9 - alroc
我只需要加密,对压缩不太关心。 - blizz
@Oleksandr - 你提供的内容需要安装Excel。 - blizz
@blizz 如果你需要加密,那么一个有密码保护的Excel文件(很容易被绕过)无法满足你的需求。同时,也有可能破解压缩文件的密码。你需要真正地加密这些文件。 - alroc
3个回答

1
我已经提供了一个加载CSV文件并将其导出为Excel的示例,而不需要安装Excel这里。由于这个问题特别要求保护Excel文件,我创建了一个示例来使用EPPlus保护选项。请参考我的原始答案以加载来自CSV的数据,并了解如何设置EPPlus的详细信息。
# Load EPPlus
$DLLPath = "C:\Windows\System32\WindowsPowerShell\v1.0\Modules\EPPlus\EPPlus.dll"
[Reflection.Assembly]::LoadFile($DLLPath) | Out-Null

# Create Excel File
$ExcelPackage = New-Object OfficeOpenXml.ExcelPackage 
$Worksheet = $ExcelPackage.Workbook.Worksheets.Add("Protected")

# Encryption
$ExcelPackage.Encryption.Algorithm = [OfficeOpenXml.EncryptionAlgorithm]::AES256
$ExcelPackage.Encryption.IsEncrypted = $true
$ExcelPackage.Encryption.Password = 'Excel'

# Protection of Workbook
$ExcelPackage.Workbook.Protection.LockRevision = $true
$ExcelPackage.Workbook.Protection.LockStructure = $true
$ExcelPackage.Workbook.Protection.LockWindows = $true
$ExcelPackage.Workbook.Protection.SetPassword("Workbook")

$ExcelPackage.Workbook.View.SetWindowSize(150, 525, 14500, 6000)
$ExcelPackage.Workbook.View.ShowHorizontalScrollBar = $false
$ExcelPackage.Workbook.View.ShowVerticalScrollBar = $false
$ExcelPackage.Workbook.View.ShowSheetTabs = $false

# Protection of Worksheet
$Worksheet.Protection.AllowAutoFilter = $false
$Worksheet.Protection.AllowDeleteColumns = $false
$Worksheet.Protection.AllowDeleteRows = $false
$Worksheet.Protection.AllowEditObject = $false
$Worksheet.Protection.AllowEditScenarios = $false
$Worksheet.Protection.AllowFormatCells = $false
$Worksheet.Protection.AllowFormatColumns = $false
$Worksheet.Protection.AllowFormatRows = $false
$Worksheet.Protection.AllowInsertColumns = $false
$Worksheet.Protection.AllowInsertHyperlinks = $false
$Worksheet.Protection.AllowInsertRows = $false
$Worksheet.Protection.AllowPivotTables = $false
$Worksheet.Protection.AllowSelectLockedCells = $false
$Worksheet.Protection.AllowSelectUnlockedCells = $false
$Worksheet.Protection.AllowSort = $false
$Worksheet.Protection.IsProtected = $true
$Worksheet.Protection.SetPassword("Worksheet")

# Save Excel File
$ExcelPackage.SaveAs("$HOME\Downloads\test.xlsx") 

很好的例子,谢谢!你知道我能否对 .xls 文件做同样的操作吗?我可以对 .xlsx 文件进行操作。如果不行,那么是否可能将 .xlsx 转换为 .xls 或者反过来呢? - Stephanie
嗨,Stephanie,epplus仅支持XLSX格式,因为XLS是专有的、封闭的格式。我建议你看一下PSExcel。它使用epplus,但简化了处理Excel文件的过程。它具有Cmdlets Import-XLSX和Export-XLSX,可以实现你想要的XLSX文件操作。 - Florian Feldhaus
谢谢您的回复。我已经下载了PSExcel文件夹并正在进行测试。导入和导出似乎也可以导入和导出到.xlsx文件。它如何导出到.xls文件呢?我找不到任何相关示例。 - Stephanie
正如已经提到的那样,由于 xls 是一种封闭格式,因此 epplus 不支持它。如果您已安装了 Excel,则可以使用 https://gist.github.com/gabceb/954418 来实现它。 - Florian Feldhaus
1
是的,服务器上没有安装Excel,而且我也不想使用互操作来处理它。然而,我发现使用ClosedXML可能是可行的。只是想与您分享这个信息,以供将来参考。谢谢! - Stephanie
请问您如何将这些 Excel 值读入数据库? - Shesha

1

.net 4.5现在包括完整的带密码压缩功能。一旦安装了4.5,您就可以在PowerShell中访问此库,无需任何其他依赖项。


1
你可以尝试(如果你真的需要使用PowerShell):
  1. 下载外部的.NET库,这些库不需要安装Excel,比如这个, 或者这个
  2. 加载它到你的PowerShell会话中。
  3. 尝试在你的代码中使用该dll定义的类型。
注意! 这种方法很困难。你应该预期会出现奇怪的行为和大量的安全问题,这取决于你选择创建Excel文件的程序集。 对我来说,最好的选择是为你创建一个简单的C#控制台应用程序,该程序将使用上述程序集。然后每次需要时在目标计算机上启动它。

附言:我尝试为您的问题创建PowerShell脚本,但没有成功。不幸的是,PowerShell与外部库的工作是不可预测的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接