如何在Python中从*.xlsm文件中提取表格并保存为*.csv文件?

10

我有一个*.xlsm的文件,里面有20个工作表。 我想将其中几个工作表单独保存为*.csv文件(格式丢失也没关系)。 已经尝试使用xlrd-xlwt和win32com库,但没有成功。 请问是否有人能提供Python代码片段来完成上述处理?因为我还有其他的Python依赖项,所以不能使用其他语言。 谢谢。


据我所记,所有最近的Microsoft Office格式都是打包在Zip容器中的XML。因此,您可以查看.xlsm文件源代码,澄清其XML结构,然后提取所需字段。 - user3159253
3个回答

6

xlrd 也可以很好地处理 xlsm 文件。我已经使用随机的 xlsm 文件测试了代码,并且执行得非常完美。

import csv
import xlrd

workbook = xlrd.open_workbook('test.xlsx')
for sheet in workbook.sheets():
    with open('{}.csv'.format(sheet.name), 'wb') as f:
        writer = csv.writer(f)
        writer.writerows(sheet.row_values(row) for row in range(sheet.nrows))

如果您遇到编码问题,请尝试以下代码:

import csv
import xlrd

workbook = xlrd.open_workbook('test.xlsm')
for sheet in workbook.sheets():
    if sheet.name == "Sheet_name_from_xlsm_file":
        with open('{}.csv'.format(sheet.name), 'wb') as f:
            writer = csv.writer(f)
            for row in range(sheet.nrows):
                out = []
                for cell in sheet.row_values(row):
                    try:
                        out.append(cell.encode('utf8'))
                    except:
                        out.append(cell)
                writer.writerow(out)

1
如果这不起作用,您应该尽可能上传您的数据文件。 - Steinar Lima
感谢您提供这个代码片段!我遇到了以下错误: writer.writerows(sheet.row_values(row) for row in range(sheet.nrows)) UnicodeEncodeError: 'ascii' codec can't encode character u'\xb5' in position 0: ordinal not in range(128)有没有办法在这里指定编码方式?很抱歉,无法在此处上传文件。 - iPirate
@iPirate 我认为你需要使用utf8或类似的编码来编码字符串。如果不行,可以尝试cp1252。我已经更新了我的答案。 - Steinar Lima
1
我尝试使用这段代码将.xlsm文件转换为csv,但什么也没有发生-没有错误,并且我看不到任何输出..可能发生了什么。我也不明白csv被写入到上面的代码中的哪里。 - kflaw
@kflaw: 输出被保存在_<表名>.csv_中(去除括号)。该文件将位于您运行脚本的位置。如果您有任何进一步的问题,请在这里开一个新的问题,并提供尽可能多的上下文。如果您愿意,您可以在此处链接到您的新问题。 - Steinar Lima
1
请注意,从当前的xlrd版本(2.0+)开始,只允许使用“xls”作为文件格式。因此,如果要打开“xlsm”文件,您必须切换到更好的openpyxl模块。 - CheradenineZK

4

你可以使用pandas轻松完成这项任务

  1. 按照以下方式安装pandasxlrd依赖项:

    • pip3 install pandas
    • pip3 install xlrd(由pandas所需)
  2. 现在只需使用read_excel读取xlsm文件即可。这是一个演示:

import pandas as pd

# YOU MUST PUT sheet_name=None TO READ ALL CSV FILES IN YOUR XLSM FILE
df = pd.read_excel('YourFile.xlsm', sheet_name=None)

# prints all sheets
print(df)

# prints all sheets name in an ordered dictionary
print(df.keys())

# prints first sheet name or any sheet if you know it's index
first_sheet_name = list(df.keys())[0]
print(first_sheet_name)

# prints first sheet or any sheet if know it's name
print(df[first_sheet_name])

# export first sheet to file
df[first_sheet_name].to_csv('FirstSheet.csv')

# export all sheets 
for sheet_name in list(df.keys()):
   df[sheet_name].to_csv(sheet_name + 'Sheet.csv')


# USE IT IN MULTIPLE WAYS #

3
import pandas as pd

import xlrd

import openpyxl #required for xlrd 2.0.1 and higher

df = pd.read_excel('your_excel_file_name.xlsm', sheet_name='your_sheet_name')
df.to_csv('your_new_name.csv')

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