你好!
需求详述:
有个Excel工作簿,里面存了几个sheet,需要从每个工作表中随机抽取n行,存入新表格中。另外,新表格要根据原来的工作表名称命名,以便查找结果。
本次用python实现,有Excel插件叫方方格子也可以随机抽取,但结果不是期望的亚子,可能我的打开方式有问题,大家感兴趣可以试一下,有时间再详述区别~
上代码:
from openpyxl import *
import pandas as pd
import random
'''从桌面某个Excel工作簿中的每个sheet随机抽取30行,并分别输出'''
#给出文件信息
file_locate ='C:/Users/Administrator/Desktop/'#文件存放路径
workbook_name = input('请输入存放在桌面的指定工作簿的完整名称。 '+
'例如存放在桌面的《北京各部门.xlsx》 '+
'应输入:北京各部门.xlsx 请输入:')#文件全名
filename=file_locate+workbook_name
#用openpyxl的方法将表格数据读入
wb = load_workbook(filename)
count_worksheets = len(wb.worksheets)#统计一共几张工作表
# print(count_worksheets)
for sheet_index in range(count_worksheets):
ws = wb.worksheets[sheet_index]
results = []
for row in ws.iter_rows():
results.append([cell.value for cell in row])
# 获取当前处理的表格的名字、记录数量
print('第',sheet_index+1,'张表(共',count_worksheets,'张):')
print('当前使用的表格:',ws)
print(ws, '共有', len(results)-1, '条数据')
# 获取当前sheet的名称,用于给新表命名
re_table_name = str(ws)[12:-2]
# 把当前表的数据放到DataFrame,开始选取
df = pd.DataFrame(results)
chosed_rows_num = []
chosed_rows_num.clear()
print('初始的选中行号chosed_rows_num',chosed_rows_num)
for need_rows in range(30):#这里可以自定义抽取的行数,目前为30行
j = random.randint(1, len(results)-1)
#注意!如果随机数上限包含len(results),一旦抽中它,就会报错,因为index只到len(results)-1,已处理
chosed_rows_num.append(j)
#输出结果
new_df = df.iloc[[0] + chosed_rows_num]
print('最后的选中行号chosed_rows_num:',chosed_rows_num)
new_df.to_excel('C:/Users/Administrator/Desktop/' + re_table_name + '.xlsx', header=False, index=True)
print('第',sheet_index+1,'张表',ws,'已处理\n')
chosed_rows_num.clear()
小提示:
文件名(即上文中的workbook_name)可以右键单击存放在桌面的工作簿-属性-复制文件名即可。另外,注意windows路径是\作区隔,python中要用/。
以上。