使用批处理将xlsx文件转换为csv

66

如何使用批处理脚本将多个xlsx文件转换为csv文件?


@Brian,你好吗?我不是原帖发布者,因此我无法接受答案。我只是重新标记了问题。@Ankur必须接受答案。 - Ocaso Protal
2
尝试这个: https://github.com/dilshod/xlsx2csv - user183038
@Swampape的答案很好。如果OP能够标记一个答案就更好了。 - Phoebe
in2csv 是一个工具。 - marbel
感谢 @chris-rudd。这是一个可以处理从Windows拖放的多个文件的版本。 基于 Christian Lemer plang ScottF 的作品https://dev59.com/-XI-5IYBdhLWcg3wbXtN#36804963。这使用了VBS并需要安装Excel。 - Yakov Kantor
10个回答

35

试试in2csv

用法:

in2csv file.xlsx > file.csv

这可能对别人有效,但对我来说不行。我严格将我的操作系统与应用程序分开。至少我写的一个大型应用程序在生产中运行了2年后失败,并需要每月维护以保持与库的兼容性。 - Richard

17

另一种将文件转换为 csv 的方式。使用 libreoffice

libreoffice --headless --convert-to csv *

请注意,这只会转换您的Excel文件的第一个工作表。


3
在Mac上:/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv * - Andrew McCombe

16

获取所有文件项并按后缀进行筛选,然后使用 PowerShell Excel VBA 对象将 Excel 文件保存为 CSV 文件。

$excelApp = New-Object -ComObject Excel.Application 
$excelApp.DisplayAlerts = $false 

Get-ChildItem -File -Filter '*.xlsx' | ForEach-Object { 
    $workbook = $excelApp.Workbooks.Open($_.FullName) 
    $csvFilePath = $_.FullName -replace "\.xlsx$", ".csv" 
    $workbook.SaveAs($csvFilePath, [Microsoft.Office.Interop.Excel.XlFileFormat]::xlCSV) 
    $workbook.Close() 
} 
您可以在此处找到完整的示例:如何使用PowerShell将Excel xlsx文件批量转换为csv文件

回答不错,但链接已失效。可能$ExcelFiles应该像Get-ChildItem -File -Filter '*.xlsx'这样。 - RJFalconer

10

针对用户user183038的回答,这里提供一个shell脚本,可以将所有xlsx文件批量重命名为csv文件,并保留原始文件名。在运行脚本之前需要先安装xlsx2csv工具。

for i in *.xlsx;
 do
  filename=$(basename "$i" .xlsx);
  outext=".csv" 
  xlsx2csv $i $filename$outext
done

7
您需要使用一个外部工具,例如:SoftInterface.com - Convert XLSX to CSV
安装完成后,您可以在批处理中使用以下命令: "c:\Program Files\Softinterface, Inc\Convert XLS\ConvertXLS.EXE" /S"C:\MyExcelFile.xlsx" /F51 /N"Sheet1" /T"C:\MyExcelFile.CSV" /C6 /M1 /V

2
应该删除语句“命令行不足以将xlsx转换为csv”(不正确),并将“您需要一些外部工具”替换为“您可以使用”等。例如,可以参考@marbel的答案(但还有其他解决方案)。 - Thibaut Barrère
请参见https://dev59.com/imkv5IYBdhLWcg3wfA4P?rq=1,该网页涉及将XLSX文件转换为CSV文件的Linux命令行操作。 - Thibaut Barrère

4

需要安装Excel,因为它使用 Excel.Application COM对象。将其保存为.bat文件:

@if (@X)==(@Y) @end /* JScript comment
    @echo off


    cscript //E:JScript //nologo "%~f0" %*

    exit /b %errorlevel%

@if (@X)==(@Y) @end JScript comment */


var ARGS = WScript.Arguments;

var xlCSV = 6;

var objExcel = WScript.CreateObject("Excel.Application");
var objWorkbook = objExcel.Workbooks.Open(ARGS.Item(0));
objExcel.DisplayAlerts = false;
objExcel.Visible = false;

var objWorksheet = objWorkbook.Worksheets(ARGS.Item(1))
objWorksheet.SaveAs( ARGS.Item(2), xlCSV);

objExcel.Quit();

它接受三个参数——xlsx文件的绝对路径、工作表名称和目标csv文件的绝对路径:
call toCsv.bat "%cd%\Book1.xlsx" Sheet1 "%cd%\csv.csv"

1
对我来说可行的方法是: .\toCsv.bat "%cd%\Book1.xlsx" Sheet1 "%cd%\csv.csv" - Tal Jacob - Sir Jacques

3

@marbel的建议的基础上(这是一个很好的建议!),这里提供了针对Mac OS X El Captain终端的批量转换脚本(因为这是OP要求的)。我认为使用for循环应该很简单,但实际上并不是这样!(需要通过字符串操作来更改扩展名,并且Mac的bash也有点不同)

for x in $(ls *.xlsx); do x1=${x%".xlsx"}; in2csv $x > $x1.csv; echo "$x1.csv done."; done

注意:
  1. ${x%”.xlsx”} 是bash字符串操作,它会从字符串末尾剪切掉.xlsx
  2. in2csv 会创建单独的csv文件(不会覆盖xlsx文件)。
  3. 如果文件名中有空格,则上述方法将无法正常工作。在运行脚本之前最好将空格转换为下划线或其他字符。

很棒的解决方案!顺便说一下,通过仔细引用(包括 x1="${x%".xlsx"}";)并将 IFS 设置为 \n,您可以非常有效地处理空格。但是,还有更健壮的方法,因为文件名也可能包含换行符。 - jpaugh
2
很好的答案。我有许多 .xlsx 文件,它们在顶部包含 2 行空白行。修改命令以删除前两行(必须在重定向之前):for x in $(ls *.xlsx); do x1=${x%".xlsx"}; in2csv $x | sed 1,2d > $x1.csv; echo "$x1.csv done."; done 感谢您提供了一个很好的选择,包括使用 bash 删除 .xlsx 的选项,避免了使用 bash base 选项的需要! - jys

2

这个PowerShell解决方案对我有用。其他选项(如csvkit)由于编码问题而失败,但是这个方法有效:

  • 以管理员身份运行PowerShell
  • Install-Module ImportExcel
  • 运行Import-Module ImportExcel查看是否能够运行。
    • 如果出现“在此系统上禁用运行脚本”的错误,则需要运行以下内容:Set-ExecutionPolicy -ExecutionPolicy Unrestricted
  • cd到包含所有.xlsx文件的目录
  • 运行以下内容,将当前目录中的每个xlsx文件转换为CSV:Get-ChildItem -Filter *.xlsx | ForEach-Object { Import-Excel $_.FullName | Export-Csv ($_.FullName -replace '\.xlsx$','.csv') -NoTypeInformation }

完成后,您可能希望恢复执行权限。对我来说,这意味着运行Set-ExecutionPolicy -ExecutionPolicy Restricted


1

gocsv 可在 Mac、Linux 和 Windows 上运行,且不需要任何依赖项(无需 Microsoft Office、Libre Office 或 Python)。只需像这样运行xlsx command 命令:

gocsv xlsx file.xlsx

0
这里有一种比大多数其他答案更简单的方法,可以一次处理多个文件。
继续jsta的回答(使用xlsx2csv的简短脚本),实际上根本不需要编写脚本。只需将所有xlsx文件放在同一个文件夹中,然后运行一次xlsx2csv即可。
在Windows上,安装Python,然后在命令提示符下键入:
pip install xlsx2csv
xlsx2csv C:\my\folder\name

当然,如果你想要一个批处理脚本,那么它可以只包含上面的第二行。
xlsx2csv有很多选项,所以在大多数情况下应该可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接