Convert XLS to XLSB Programmatically?

后端 未结 3 1426
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-09 18:55

I have a customer that needs to convert XLS files to XLSB. Has anyone done this programmatically, (with or without an add-on --- doesn\'t matter --- just need to be able to

相关标签:
3条回答
  • 2020-12-09 19:32

    Well, then there is a short format 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();
    

    You will need a Excel installation with .NET programming support (disabled by default in installer!) and reference MS Office PIA assembly for Excel from your project:

    add Excel PIA reference

    References: Workbooks.Open, workbook.SaveAs, XlFileFormat.xlExcel12

    0 讨论(0)
  • 2020-12-09 19:36

    This can be used from the command line.

    0 讨论(0)
  • 2020-12-09 19:52

    I write this powershell code to convert many *.xls files in many folder recursively. this script promte to choose a folder , convert all file and delete original (move to trash) display each filename in powershell console.

    <#
        .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
    
    0 讨论(0)
提交回复
热议问题