【问题标题】:Convert *.xls or *.xlsx file to pipe separated .csv file using command line使用命令行将 *.xls 或 *.xlsx 文件转换为管道分隔的 .csv 文件
【发布时间】:2017-01-11 20:36:51
【问题描述】:

我有一个这样的 .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”。

输出.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)类型。

但我不想手动执行此操作。我想使用命令行实现相同的输出。为此,我参考了这篇文章: Convert XLS to CSV on command line

代码是:

这个 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 [输出].csv

我尝试将 csv_format = 6 的值更改为许多其他值,例如 1、2、3...等等。但它没有给出管道分隔的 csv。

请帮忙。

提前致谢。

【问题讨论】:

  • 您知道 CSV 是与 Comma S分隔相关的扩展名V价值观?很难有一个以竖线分隔的逗号分隔值文件。
  • 除非你破解,否则似乎很难做到:experts-exchange.com/questions/23712758/…。不过,用于后处理文件的 python 解决方案需要 3 或 4 行。
  • @Ken White:好的,那我可以得到一个对应的Output.txt文件吗?
  • @Jean-François Fabre:你能发布你的黑客解决方案吗?我也可以使用 python 脚本。我想要的只是将 xlsx 转换为管道分隔的 csv 的任务应该是自动化的。
  • 我在上面。是时候写一些python代码了……

标签: vb.net excel windows csv vbscript


【解决方案1】:

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

安装openpyxl:

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

当然 xlsx 文件必须只有 1 张。没有对公式进行评估,这是主要限制。

空行也被过滤掉了。

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()

用法:xlsx2csv.py file.xlsx file.csv

【讨论】:

    【解决方案2】:

    如果你仍然在运行你的脚本,最好像这样扩展它:

    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çoisFabre 将其更改为制表符分隔...这将避免该问题 ;)
    • @Dirk Reichel:你的脚本表现不同。首先,我希望它用管道分隔[你的脚本是 TAB 分隔的]。其次,我不想要任何双引号 [你的脚本是双引号]。
    • 我会再次检查...与我的测试文件完美配合...只需一秒钟。 (只要确保Replace(strText, " ", "|")" " 中有一个制表符......不是空格”)
    • @Dirk Reichel:在 Replace(strText, "", "|") 的第一个参数中用制表符替换空格后,我可以看到 PIPE。现在,只剩下 1 个问题了。即双引号。
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 2014-02-27
    • 2016-07-19
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2023-03-15
    • 2014-12-09
    相关资源
    最近更新 更多