以编程方式将XLS转换为XLSB?

我有一个客户需要将XLS文件转换为XLSB。 有没有人以编程方式完成此任务(有或没有附加组件—无所谓 – 只需要能够自动化它)? 我正在寻找一种自动化方法。

作为旁注,客户正在询问这一点,因为他们使用Sharepoint,似乎它有一种方法来比XLS更快更容易地分析XLSB文件??? 我正在努力提高我的Sharepoint知识,但与此同时,我正试图找到这个XLSB问题的答案。

谢谢。

那么,有一个短格式verison:

using Microsoft.Office.Interop.Excel; // init excel Application excelApplication = new Application(); // ... // open book in any format Workbook workbook = excelApplication.Workbooks.Open("1.xls", XlUpdateLinks.xlUpdateLinksNever, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); // save in XlFileFormat.xlExcel12 format which is XLSB workbook.SaveAs("1.xlsb", XlFileFormat.xlExcel12, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); // close workbook workbook.Close(false, Type.Missing, Type.Missing); // ... // shutdown excel excelApplication.Quit(); 

您将需要具有.NET编程支持的Excel安装(默认情况下在安装程序中禁用!)并从您的项目引用Excel的MS Office PIA程序集:

添加Excel PIA参考

参考资料: Workbooks.Open , workbook.SaveAs , XlFileFormat.xlExcel12

我编写这个powershell代码,以递归方式转换许多文件夹中的许多* .xls文件。 这个脚本可以选择一个文件夹,转换所有文件并删除原始文件(移动到垃圾箱),在powershell控制台中显示每个文件名。

 <# .SYNOPSIS Covert all *.xls files recursivly in a provided path .DESCRIPTION XLS files within a provided path are recursively enumerated and convert to XLSB files (with macro). The original XLS files are deleted if newfile has created (in trash), a new XLSb file replace the old file. #> $autor='alban Lopez' $version=0.85 $email='alb@coaxis.com' function ConvertTo-XLSB { <# .SYNOPSIS XLS files within a provided path are recursively enumerated and convert to XLSB files. .DESCRIPTION XLS files within a provided path are recursively enumerated and convert to XLSB files. The original XLS files remain intact, a new XLSB file will be created. .PARAMETER Path This parameter takes the input of the path where the XLS files are located. .PARAMETER Visible Using the parameter will show you how Excel does the work. Not using the parameter will enable Excel to accomplish its tasks in the background. Note: Bu not using this parameter you will be able to convert some XLS files which have corruptions in them, when using the parameter and therefor the Excel GUI will give you an error. .PARAMETER ToFolder This parameter enables you to provide a location where the file is saved. When this parameter is not used, the file will be saved as an XLS file in the same location as where the original XLS file is located. .EXAMPLE ConvertTo-XLSB -Path 'D:\Data\2012' .EXAMPLE ConvertTo-XLSB -Path 'D:\Data\2012' -Visible .EXAMPLE ConvertTo-XLSB -Path 'D:\Data\2012' -ToFolder 'D:\Data\2012XLSB' .EXAMPLE ConvertTo-XLSB -Path 'D:\Data\2012' -Visible -ToFolder 'D:\Data\2012XLSB' #> [cmdletbinding()] param ( [parameter(mandatory=$true)][string]$Path, [parameter(mandatory=$false)][switch]$Visible, [parameter(mandatory=$false)][string]$ToFolder ) begin { $Excel = New-Object -ComObject excel.application $Excel.DisplayAlerts = $false # $xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault # xlsx $xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlExcel12 # 50 = xlsb $shell = new-object -comobject "Shell.Application" $count = 0 $count_OK = 0 $count_Nok = 0 if ($Visible -eq $true) { $Excel.visible = $true } else { $Excel.visible = $false } $filetype = "*xls" } process { if (Test-Path -Path $Path) { Get-ChildItem -Path $Path -Include '*.xls' -recurse | ForEach-Object { if ($ToFolder -ne '') { $FilePath = Join-Path $ToFolder $_.BaseName } else { $FilePath = ($_.fullname).substring(0, ($_.FullName).lastindexOf(".")) } $FilePath += ".xlsb" $WorkBook = $Excel.workbooks.open($_.fullname) $WorkBook.saveas($FilePath, $xlFixedFormat) $WorkBook.close() $OldFolder = $Path.substring(0, $Path.lastIndexOf("\")) + "\old" if (test-path $FilePath){ $count_OK++ Write-Host -nonewline "$count_OK > " Write-Host $_.fullname -ForegroundColor Cyan $item = $shell.Namespace(0).ParseName("$($_.fullname)") $item.InvokeVerb("delete") } else { $count_Nok++ Write-Host -nonewline "$count_Nok > " Write-Host $_.fullname -ForegroundColor red } $count++ } } else { return 'No path provided or access has been denied.' } } end { Write-Host '========================================================' -ForegroundColor yellow Write-Host -nonewline "Total : $count"; Write-Host -nonewline " / Erreurs : $count_Nok / " -ForegroundColor red; Write-Host "convertis : $count_ok" -ForegroundColor green; Write-Host '========================================================' -ForegroundColor yellow $Excel.Quit() $Excel = $null [gc]::collect() [gc]::WaitForPendingFinalizers() } } #============================================================================= # Displays a select file dialog box, returning the path to a CSV file. #============================================================================= function Read-FolderBrowserDialog([string]$Message, [string]$InitialDirectory) { $app = New-Object -ComObject Shell.Application $folder = $app.BrowseForFolder(0, $Message, 0, $InitialDirectory) if ($folder) { return $folder.Self.Path } else { return $false } } '' 'Choisir le dossier source >' $source = Read-FolderBrowserDialog -Message "Dossier source" while ($source) { "Convertion de tous les fichiers du dossier : $source" $ConvTime = Measure-Command {ConvertTo-XLSB -Path $source} Write-Host "$($ConvTime.Hours):$($ConvTime.Minutes):$($ConvTime.Seconds)"; '' "End" '' 'Choisir le dossier source >' $source = Read-FolderBrowserDialog -message "Dossier source" -InitialDirectory $source #$dest = Select-FolderDialog -message "Dossier Destination (sera conservé)" -RootFolder $source } start-sleep -s 30 

这可以从命令行使用。