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

10 投票
3 回答
37307 浏览
提问于 2025-04-18 05:55

我有一个*.xlsm格式的文件,里面有20个工作表。 我想把其中几个工作表单独保存为*.csv格式(格式可以丢失)。 我已经尝试过使用xlrd-xlwt和win32com这两个库,但都没有成功。 有没有人能提供一段Python代码,帮我完成这个操作?因为我还有其他的Python依赖,所以不想用其他语言。谢谢!

3 个回答

3

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个特定的功能时,发现它的表现和预期的不一样。这种情况下,了解问题的根源就显得非常重要。

通常,解决这类问题的第一步是仔细检查代码,看看是否有拼写错误或者逻辑上的问题。很多时候,问题可能只是一个小小的失误,比如一个符号写错了,或者没有正确地调用某个函数。

另外,查阅相关的文档也是一个好方法。文档通常会提供使用某个功能的详细说明和示例,这样可以帮助我们更好地理解如何正确使用它。

如果自己解决不了问题,可以考虑向社区求助,比如在StackOverflow上提问。在提问时,提供清晰的描述和相关的代码片段,可以帮助别人更快地理解你的问题,从而给出有效的建议。

总之,遇到问题时不要慌张,冷静下来,逐步分析,通常都能找到解决办法。

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')
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 #
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)

撰写回答