筛选一个工作簿中的所有工作表数据

使用Python的xlwings和pandas库实现从多个Excel工作表中读取采购数据,按物品分类并汇总采购金额,最后将结果保存为新的Excel文件。
import xlwings as xw
import pandas as pd
app = xw.App(visible=False,add_book=False)  # 启动excel
workbook = app.books.open(r'd:\python_file\采购表.xlsx')     # 打开要处理的工作簿
worksheet = workbook.sheets                 # 列出工作簿中的所有工作表
table = pd.DataFrame()                        # 创建一个空DataFrame
for i, j in enumerate(worksheet):           # 遍历工作簿中的工作表
    values = j.range('a1').options(pd.DataFrame,header=1,index=False,expand='table').value   # 读取当前工作表数据
    data = values.reindex(columns=['采购物品','采购日期','采购数量','采购金额'])  # 调整列的顺序,将"采购物品"移到第1列
    table = table.append(data,ignore_index=True)  # 将调整列顺序后的数据合并到前面创建的DataFrame中
table = table.groupby('采购物品')   # 根据采购物品列筛选数据
new_workbook = xw.books.add()      # 新建一个工作簿
for idx, group in table:   # 遍历筛选好的数据,其中idx对应物品名称, group对应该物品的所有明细数据
    new_worksheet = new_workbook.sheets.add(idx)  # 在新工作簿中新增工作表,以物品名称作为工作表名
    new_worksheet['a1'].options(index=False).value = group  # 在新工作表中写入当前物品的所有明细数据
    last_cell = new_worksheet['a1'].expand('table').last_cell   # 获取当前工作表数据区域右下角的单元格
    last_row = last_cell.row        # 获取数据区域最后一行行号
    last_column = last_cell.column  # 获取数据区域最后一列的列号
    last_column_letter = chr(64 + last_column)  # 将数据区域最后一列的列号(数字)转换为该列的列标(字母)
    sum_cell_name = '{}{}'.format(last_column_letter,last_row+1)     # 获取数据区域右下角单元格下方的单元格位置
    sum_last_row_name = '{}{}'.format(last_column_letter,last_row)   # 获取数据区域右下角单元格位置
    formula = '=SUM({}2:{})'.format(last_column_letter,sum_last_row_name)   # 根据前面获取的单元格位置构造excel公式,对采购金额求和
    new_worksheet[sum_cell_name].formula = formula  # 将求和公式写入数据区域右下解单元格下方的单元格中
    new_worksheet.autofit()  # 根据单元格中的数据内容自动调整工作表的行高和列宽
new_workbook.save(r'd:\python_file\采购分类表.xlsx')   # 保存新建的工作簿并命名为 "采购分类表.xlsx"
workbook.close()
app.quit()
下面是一个示例代码,演示如何使用VBA将两个工作表中的数据筛选后复制到一个新的工作表中: ``` Sub FilterAndCopy() Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet Dim lastRow1 As Long, lastRow2 As Long, lastRow3 As Long Dim i As Long, j As Long '获取需要操作的三个工作表对象 Set ws1 = ThisWorkbook.Worksheets("Sheet1") Set ws2 = ThisWorkbook.Worksheets("Sheet2") Set ws3 = ThisWorkbook.Worksheets("Sheet3") '获取两个原始工作表的最后一行 lastRow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row lastRow2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row '清空目标工作表 ws3.Cells.ClearContents '复制第一个工作表中满足条件的数据到目标工作表 j = 1 '目标工作表的行数 For i = 1 To lastRow1 If ws1.Cells(i, 2) = "条件1" And ws1.Cells(i, 3) > 10 Then ws1.Rows(i).Copy ws3.Rows(j) j = j + 1 End If Next i '复制第二个工作表中满足条件的数据到目标工作表 For i = 1 To lastRow2 If ws2.Cells(i, 2) = "条件2" And ws2.Cells(i, 3) < 20 Then ws2.Rows(i).Copy ws3.Rows(j) j = j + 1 End If Next i '自适应调整目标工作表的列宽 lastRow3 = ws3.Cells(Rows.Count, 1).End(xlUp).Row ws3.Cells.EntireColumn.AutoFit End Sub ``` 在上面的示例代码中,我们首先获取了需要操作的三个工作表对象,然后通过Cells函数和End(xlUp)方法获取了两个原始工作表的最后一行。接着,我们清空了目标工作表,然后依次遍历两个原始工作表中的每一行,筛选出满足条件的数据,并使用Copy方法将其复制到目标工作表中。最后,我们使用EntireColumn.AutoFit方法自适应调整目标工作表的列宽。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值