用于迭代具有多个选项卡的 .xls 电子表格、删除行和第一列并导出到 csv 的 Python 解决方案?

Python solution for iterating through .xls spreadsheet with multiple tabs, deleting rows and first column, and export to csv?

提问人:Awellkeptsecret 提问时间:11/13/2023 更新时间:11/14/2023 访问量:74

问:

我非常沮丧地试图编写一个代码来迭代每个工作表为一年的 .xls(或 .xlsx)电子表格,编辑每个工作表以删除第 1-4、6 和 72-150 行,删除第一列,然后将该工作表导出到 csv。所以我应该每张(年)有一个 csv。我尝试使用 pandas、xlrd、openpyxl,但每一行都不断出现错误。有人可以帮我吗?用最少的额外包裹最简单的方法是什么?继续让该列表不可调用或字符串或错误的索引。请帮忙。

感谢它!

import openpyxl
import csv 
workbook = openpyxl.load_workbook("C:/Users/example.xlsx")
worksheet = workbook.sheetnames
print(worksheet)
for sheet in worksheet:
    mrts_worksheet['B5'] = "Diff Label"
    sheet.delete_rows(mrts_worksheet.delete_rows(72, 100))
    sheet.delete_rows(mrts_worksheet.delete_rows(6, 1))
    sheet.delete_rows(mrts_worksheet.delete_rows(1, 4))
    sheet.delete_cols(1,1)
    with open("C:/Users/example"+ sheet +".csv", "w", newline="") as file_handle:
        csv_writer = csv.writer(file_handle)
        for row in sheet.iter_rows(): 
            csv_writer.writerow([cell.value for cell in row])
    file_handle.close()
python excel csv openpyxl xlrd

评论

0赞 moken 11/13/2023
乍一看;循环访问 .xls(或 .xlsx)电子表格。Openpyxl 只能处理 .xlsx 文件(即使是扩展名为 .xls 的 xlsx 文件也会失败),所以如果你想同时使用这两种类型,你不能使用 Openpyxl,或者需要对 .xls 文件使用不同的模块。 未定义,它只是出现在代码示例中。它的目的是什么,一条线是预期的做什么?该行生成工作表名称(字符串)列表,而不是工作表对象。mrts_worksheetsheet.delete_rows(mrts_worksheet.delete_rows(72, 100))worksheet = workbook.sheetnames
0赞 Charlie Clark 11/14/2023
什么是错误消息?对于此类任务,我建议使用只读模式和多个进程,如 openpyxl 文档中关于性能的建议。

答:

0赞 moken 11/13/2023 #1

为了使您的代码示例在描述中提供的详细信息下工作,它需要更改为如下所示;
删除方法很好,从要删除的最后一行开始,一直移动到第 1 行。您的代码将删除不符合要求的第 72 到 171 行,即 72-150,因此将其更改为 .
注意:删除第 1 行将删除标题。
delete_rows(72, 100)delete_rows(72, 79)

“mrts_worksheet”部件已被移除。
我不知道这张纸的目的是什么,也不知道它应该如何删除其他工作表中的行。即使将值写入工作表循环中的单元格 B5 也似乎很浪费,因为您只需要执行一次,而不是对工作簿中的每个工作表执行一次,因为它不会更改。
mrts_worksheet['B5'] = "Diff Label"

import openpyxl
import csv


workbook = openpyxl.load_workbook("data.xlsx")
worksheet = workbook.worksheets  # List of Worksheet objects

print(worksheet)
for sheet in worksheet:  # 'sheet' is a worksheet
    sheet.delete_rows(72, 79)  # Delete rows 72 - 150,  start at row 72 and delete the next 79 rows
    sheet.delete_rows(6, 1)  # Delete row 6, start at row 6 and delete that row only
    sheet.delete_rows(1, 4)  # Delete rows 1 - 4, start at row 1 and delete the next 4 rows
    sheet.delete_cols(1, 1)  # Delete column 'A'
    ### Create csv file name using sheet name (title)
    with open("example" + sheet.title + ".csv", "w", newline="") as file_handle:
        csv_writer = csv.writer(file_handle)
        for row in sheet.iter_rows():
            csv_writer.writerow([cell.value for cell in row])
    file_handle.close()

0赞 Dheeraj Malik 11/14/2023 #2

您可以使用 Spire.XLS for Python 包来操作 xls 或 xlsx 文件并将它们转换为 csv。

以下是安装软件包的命令:

pip install Spire.Xls

以下示例从 .xls 或 .xlsx 文件的每个工作表中删除特定行和列,然后将每个工作表另存为单独的 csv 文件:

from spire.xls import *
from spire.common import *

workbook = Workbook()
# Load a .xls file
# workbook.LoadFromFile("Input.xls")
# Load a .xlsx file
workbook.LoadFromFile("Input.xlsx")
 
for sheet in workbook.Worksheets:
    # Remove rows 72-150
    sheet.DeleteRow(72, 79)
    # Remove row 6
    sheet.DeleteRow(6, 1)
    # Remove rows 1-4
    sheet.DeleteRow(1, 4)
    # Remove column 1
    sheet.DeleteColumn(1, 1)
    # Save each sheet to a csv
    csv_name = sheet.Name + ".csv"
    sheet.SaveToFile(csv_name, ",", Encoding.get_UTF8())

workbook.Dispose()

免责声明:我为开发此软件包的公司工作。