У меня есть около 150 файлов .xls и .xlsx, которые мне нужно преобразовать в символы табуляции. Я пытался использовать Automator, но я мог сделать это только один за другим. Хотя это определенно быстрее, чем открывать каждый в отдельности. У меня очень мало знаний по написанию сценариев, поэтому я был бы признателен за способ сделать это как можно безболезненнее.
4 ответа
(Я знаю, что вы находитесь на 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)
Откройте одну из рабочих книг, перейдите на вкладку 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
Вы можете использовать язык сценариев, чтобы перебрать их все вместе с некоторой библиотекой Excel, и сделать что-то вроде RegEx для преобразования определенных символов во вкладки. Я могу составить его и опубликовать позже.
Вот 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