使用命令行将*.xls或*.xlsx文件转换为以管道分隔的.csv文件

4

我有一个像这样的 .xlsx 文件:

sample.xlsx:

Heading     C1      C2,01,02    C3    C4
R1          1       4           7     10
R2          2       5           8     11,1
R3          3       6           9,0   12

我希望将sample.xlsx文件转换为Output.csv文件[以竖线分隔]。

请注意,我不想要任何双引号"C2,01,02"。

Output.csv:

Heading|C1|C2,01,02|C3|C4
R1|1|4|7|10
R2|2|5|8|11,1
R3|3|6|9,0|12

我知道如何通过以下手动步骤生成Output.csv:

进入控制面板 -> 区域和语言 -> 附加设置 -> 更新列表分隔符字段,将其更改为管道“|”。

打开sample.xlsx -> 另存为 -> 在下拉列表中选择保存类型CSV(逗号分隔)(*.csv)。

但是我不想手动操作。我想使用命令行实现相同的输出。为此,我参考了这篇帖子: 在命令行上将XLS转换为CSV

代码如下:

这个csv文件非常好用,唯一的问题是它会生成逗号分隔的csv而不是管道分隔的。

if WScript.Arguments.Count < 2 Then
    WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file>"
    Wscript.Quit
End If
csv_format = 6
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.SaveAs dest_file, csv_format
oBook.Close False
oExcel.Quit
要运行上面的代码,请输入以下命令:XlsToCsv.vbs [sourcexlsFile].xls [Output].csv。
我试图将csv_format = 6的值更改为许多其他值,如1、2、3等等。但它没有生成以管道分隔的csv文件。
请帮忙解决问题。
提前感谢您的帮助。

你知道CSV是与*逗号分隔值相关联的扩展名吗?使用管道分隔符来分隔逗号分隔值文件是很困难的。 - Ken White
似乎很难除非你黑客: https://www.experts-exchange.com/questions/23712758/Export-semicolon-delimited-csv-file.html。不过,使用Python后处理该文件只需要3或4行代码即可解决。 - Jean-François Fabre
@Ken White:好的,那我可以得到一个相应的Output.txt文件吗? - Jatin
@Jean-François Fabre:您能否发布您的黑客解决方案?我也可以接受Python脚本。我想要的就是将xlsx转换为管道分隔的csv的任务自动化。 - Jatin
我在处理中。只需要一点时间来编写一些 Python 代码… - Jean-François Fabre
2个回答

4

Python解决方案。使用Python 3.4和标准模块,除了openpyxl:

安装openpyxl:

cd /D C:\python34
scripts\pip install openpyxl

当然,xlsx文件必须只有一个工作表。公式不会被计算,这是主要限制。同时,空行也将被过滤掉。
import openpyxl,csv,sys
if len(sys.argv)<3:
   print("Usage xlsx2csv.py file.xlsx file.csv")
   sys.exit()

i = sys.argv[1]
o = sys.argv[2]


f = open(o,"w",newline='')
cw = csv.writer(f,delimiter='|',quotechar='"')

wb = openpyxl.load_workbook(i)
sheet = wb.active
for r in sheet.rows:
    row = [c.value for c in r]
    if row:
        cw.writerow(row)
f.close()

Usage: xlsx2csv.py file.xlsx file.csv


1
如果您已经运行了脚本,最好按照以下方式进行扩展:
if WScript.Arguments.Count < 2 Then
    WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file>"
    Wscript.Quit
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
oBook.SaveAs dest_file, 3
oBook.Close False
oExcel.Quit
Set objFile = objFSO.OpenTextFile(dest_file, 1)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, " ", "|")
Set objFile = objFSO.OpenTextFile(dest_file, 2)
objFile.WriteLine strNewText
objFile.Close

这种解决方案的问题在于,如果单元格中实际存在逗号,则会出现问题。否则就没问题了。 - Jean-François Fabre
@Jean-FrançoisFabre将其更改为制表符分隔...这将避免那个问题 ;) - Dirk Reichel
@Dirk Reichel:你的脚本表现不同。首先,我希望它是管道分隔的[你的脚本是TAB分隔的]。其次,我不想要任何双引号[你的脚本正在提供双引号]。 - Jatin
我会再检查一遍……我的测试文件完美运行了……请等一下。(只要确保 Replace(strText, " ", "|") 中的 " " 是一个制表符,而不是空格) - Dirk Reichel
@Dirk Reichel:在Replace(strText,“<TAB>”,“|”)的第一个参数中用制表符替换空格后,我能够看到PIPE。现在只剩下一个问题,即双引号。 - Jatin
@Jatin 看起来 Excel 会根据 CSV 规则 引用文本... 而且似乎无法避免。你可以插入 strNewText = Replace(strText, """", "") 来替换所有的 ",但如果默认情况下有一些,它们也会被删除(我认为这不是想要的) :/ - Dirk Reichel

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