Конвертировать XLS в XLSB программно?
У меня есть клиент, которому нужно преобразовать файлы XLS в XLSB. Кто-нибудь сделал это программно (с добавлением или без надстройки --- не имеет значения - просто нужно иметь возможность автоматизировать его)? Я ищу способ автоматизировать это.
В качестве побочной заметки клиент спрашивает об этом, потому что использует Sharepoint, и, похоже, у него есть способ анализировать файлы XLSB быстрее и проще, чем XLS??? Я работаю над улучшением своих данных Sharepoint, но тем временем я пытаюсь найти ответ на эту проблему XLSB.
Спасибо.
Ответы
Ответ 1
Ну, тогда есть короткая форма:
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();
Вам понадобится установка Excel с поддержкой .NET-программирования (отключена по умолчанию в программе установки!) и ссылка на сборку MS Office PIA для Excel из вашего проекта:
![add Excel PIA reference]()
Литература:
Workbooks.Open, workbook.SaveAs, XlFileFormat.xlExcel12
Ответ 2
Я пишу этот код powershell для преобразования многих *.xls файлов во многие папки рекурсивно.
это script promte, чтобы выбрать папку, конвертировать весь файл и удалить оригинал (переместить в корзину)
отобразите каждое имя файла в консоли 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='[email protected]'
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
Ответ 3
Этот файл можно использовать из командной строки.