3

У меня есть около 150 файлов .xls и .xlsx, которые мне нужно преобразовать в символы табуляции. Я пытался использовать Automator, но я мог сделать это только один за другим. Хотя это определенно быстрее, чем открывать каждый в отдельности. У меня очень мало знаний по написанию сценариев, поэтому я был бы признателен за способ сделать это как можно безболезненнее.

4 ответа4

2

(Я знаю, что вы находитесь на MAC, поэтому мой ответ может быть не очень полезным для вас. Но для пользователей Windows, может быть. Btw. есть переопределение Powershell с открытым исходным кодом для MAC и Linux, которое называется PASH)

Как легко конвертировать несколько файлов Excel в любой нужный формат

Скачайте этот конвертер сценария Powershell и выполните его. Это все. :)

Он запросит у вас папку и перебирает все XLSX, XLS, XLSB в этой папке и ее подпапках. Затем Powershell создает скрытый экземпляр Excel для использования внутренних команд Open и Save as команд для преобразования всех файлов в нужный формат. В настоящее время для TXT файлов с разделителями табуляции, так как OP запрашивает. Имена файлов и структуры папок сохраняются.

Удобно то, что даже несколько листов сохраняются в отдельный файл, если вы выбираете, например, CSV или TXT. Как правило, при использовании диалогового окна « Сохранить как» в Excel сохраняется только первый лист

Если вам нужен другой формат, просто замените -4158 в исходном коде на ваше значение. Ниже приведены некоторые распространенные форматы, взятые из MSDN.

Open XML Workbook      XLSX            51           xlOpenXMLWorkbook 
Excel 2003             XLS             56           xlExcel8
Excel12                XLSB            50           xlExcel12 
Current Platform Text  CSV             -4158        xlCurrentPlatformText 
HTML format            HTML            44           xlHtml 
Unicode Text           TXT             42           xlUnicodeText 
DBF4                   DBF             11           xlDBF4 

Исходный код

    $object = New-Object -comObject Shell.Application  
    $folder = $object.BrowseForFolder(0, 'Select the folder', 0)    

    if (!$folder) {exit} 

    $excel = New-Object -comObject Excel.Application
    $excel.Visible = $false
    $excel.DisplayAlerts = $false

    foreach ($file in Get-ChildItem -literalPath $folder.self.Path*.xls? -recurse) {
        $workbook = $excel.Workbooks.Open($file.Fullname)    
        foreach ($worksheet in $workbook.Sheets) {                    
            $worksheet.activate()          
            $newpath = $File.DirectoryName +"\"+ $file.BaseName + " - " + $worksheet.name + ".csv"
            $workbook.SaveAs($newpath,-4158 ,$null,$null)
        }
        $workbook.Close()
    }
    $excel.quit()    

    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
    [System.GC]::Collect() 
    [System.GC]::WaitForPendingFinalizers()
  • Зависимости: Excel 2003 или выше и Powershell (предустановлен под Windows 7)
1

Откройте одну из рабочих книг, перейдите на вкладку developer , щелкните Visual Basic и введите этот код в виде module

Измените PATH на папку, в которой находятся все рабочие книги. Второй PATH - это то, где вы хотите сохранить текстовые файлы.

Обратите внимание, что вы можете сохранить только первый worksheet в каждом файле, так как текст с разделителями не поддерживает несколько рабочих листов.

Sub openandsave()
Dim lCount As Long
Dim wbResults As Workbook
Dim wbCodeBook As Workbook


Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False

On Error Resume Next
    Set wbCodeBook = ThisWorkbook
        With Application.FileSearch
            .NewSearch
            .LookIn = "PATH"
            .FileType = msoFileTypeExcelWorkbooks
                If .Execute > 0 Then
                    For lCount = 1 To .FoundFiles.Count
                        Set wbResults = Workbooks.Open(Filename:=.FoundFiles(lCount), UpdateLinks:=0)
                            ActiveWorkbook.SaveAs Filename:="PATH" AND .Foundfiles(lcount) AND ".txt", FileFormat _
                            :=xlText, CreateBackup:=False
                    Next lCount
                End If
        End With
On Error GoTo 0
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.EnableEvents = True
End Sub

Если это не работает, возможно, я запутался в имени SaveAs Filename

Ресурс отсюда

0

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

0

Вот Applescript, предназначенный для реализации в виде капли (т. Е. Приложение, в которое вы можете перетащить кучу файлов).

Есть место для полировки, но я надеюсь, что вы найдете, что она выполняет основную работу.

property type_list : {"XLS6", "XLS7", "XLS8", "XLSX"}
property extension_list : {"xls", "xlsx"}


on open these_workbooks
    repeat with k from 1 to the count of these_workbooks
        set this_item to item k of these_workbooks
        set the item_info to info for this_item

        --this if statement tests to make sure the items you're converting are Excel spreadsheets and not folders or aliases
        if (folder of the item_info is false) and (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then

            tell application "Finder" to open this_item

            tell application "Microsoft Excel 2011"
                --this just tacks on ".txt" to your file name
                set workbookName to (name of active workbook & ".txt")
                --save the current open workbook as a tab-delimited text file
                tell active workbook to save workbook as filename workbookName file format text Mac file format
                close active workbook saving no
            end tell
        end if
    end repeat
end open

on run
    display dialog "Drop Excel files onto this icon."
end run

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .