1

我有一个包含大量 Excel 工作簿的文件夹。有没有办法使用 Python 的 xlrd、xlutiles 和 xlsxWriter 将此文件夹中的每个文件转换为 CSV 文件?

我希望新转换的 CSV 文件具有扩展名“_convert.csv”。

否则...

有没有办法合并文件夹中的所有 Excel 工作簿来创建一个大文件?

我一直在寻找两种方法都可以做到,但没有任何效果......

4

5 回答 5

1

使用pywin32,这将找到.xlsx指定目录中的所有文件并打开并将它们重新保存为.csv. 使用...找出正确的命令相对容易pywin32......只需记录一个 Excel 宏并手动执行打开/保存,然后查看生成的宏。

import os
import glob
import win32com.client

xl = win32com.client.gencache.EnsureDispatch('Excel.Application')

for f in glob.glob('tmp/*.xlsx'):
    fullname = os.path.abspath(f)
    xl.Workbooks.Open(fullname)
    xl.ActiveWorkbook.SaveAs(Filename=fullname.replace('.xlsx','.csv'),
                             FileFormat=win32com.client.constants.xlCSVMSDOS,
                             CreateBackup=False)
    xl.ActiveWorkbook.Close(SaveChanges=False)
于 2014-07-16T17:36:19.793 回答
1

我将尝试使用我的库pyexcel

from pyexcel import Book, BookWriter
import glob
import os


for f in glob.glob("your_directory/*.xlsx"):
    fullname = os.path.abspath(f)
    converted_filename = fullname.replace(".xlsx", "_converted.csv")
    book = Book(f)
    converted_csvs = BookWriter(converted_filename)
    converted_csvs.write_book_reader(book)
    converted_csvs.close()

如果你有一个超过 2 张的 xlsx,我想你会生成超过 2 个 csv 文件。命名约定是:“file_converted_%s.csv”% your_sheet_name。该脚本会将所有转换后的 csv 文件保存在您拥有 xlsx 文件的同一目录中。

此外,如果您想将所有内容合并为一个,也非常容易。

from pyexcel.cookbook import merge_all_to_a_book
import glob


merge_all_to_a_book(glob.glob("your_directory/*.xlsx"), "output.xlsx")

如果你想做更多,请阅读教程

于 2014-10-20T09:58:33.883 回答
0

看看openoffice的python库。虽然,我怀疑 openoffice 会支持 MS 文档文件。

Python 没有对 Excel 文件的本机支持。

于 2014-07-16T16:23:41.323 回答
0

当然。使用诸如glob之类的东西迭代您的文件并将它们提供给您提到的模块之一。使用 xlrd,您可以使用open_workbook按名称打开每个文件。这会给你一个Book 对象。然后,您将需要嵌套循环来迭代 Book 中的每个 Sheet 对象、Sheet 中的每一行以及 Row 中的每个单元格。如果您的行不太宽,您可以将 Row 中的每个 Cell 附加到 Python 列表中,然后将该列表提供给csv.writer objectwriterow的方法。

由于这是一个高级问题,因此此答案掩盖了一些细节,例如如何调用xlrd.open_workbook以及如何创建csv.writer. 希望在谷歌上搜索这些特定点的示例将使您到达您需要去的地方。

于 2014-07-16T17:08:45.457 回答
0

您可以使用此功能从每个文件中读取数据

import xlrd

def getXLData(Filename, min_row_len=1, get_datemode=False, sheetnum=0):
  Data = []
  book = xlrd.open_workbook(Filename)
  sheet = book.sheets()[sheetnum] 
  rowcount = 0
  while rowcount < sheet.nrows:
    row = sheet.row_values(rowcount)
    if len(row)>=min_row_len: Data.append(row)
    rowcount+=1
  if get_datemode: return Data, book.datemode
  else: return Data

以及将列表组合在一起后写入数据的此功能

import csv

def writeCSVFile(filename, data, headers = []):
  import csv
  if headers:
    temp = [headers]
    temp.extend(data)
    data = temp
  f = open(filename,"wb")
  writer = csv.writer(f)
  writer.writerows(data)
  f.close()

请记住,您可能必须重新格式化数据,尤其是当 Excel 文件中有日期或整数时,因为它们存储为浮点数。

编辑添加调用上述函数的代码:

import glob

filelist = glob.glob("*.xls*")
alldata = []
headers = []
for filename in filelist:
  data = getXLData(filename)
  headers = data.pop(0) # omit this line if files do not have a header row
  alldata.extend(data)

writeCSVFile("Output.csv", alldata, headers)
于 2014-07-16T21:34:59.920 回答