xlsx文件按列筛选拆分工具

这是一个Python脚本,用于将一个xlsx文件按列拆分为多个单独的文件或在一个文件的不同sheet中。用户可以选择拆分的列,程序会处理包含空值的情况,并对输出文件进行格式设置。拆分后的数据会以科学计数格式保存,如果需要避免此格式,可以在数据尾部添加非空字符。
摘要由CSDN通过智能技术生成

目录

使用说明

代码

运行情况

拆分后保存一个文件多个sheet运行结果

 拆分后保存多个文件运行结果​编辑

 资源下载


使用说明


功能
1、一个xlsx文件,可以选择按列拆分成多个文件
2、一个xlsx文件,可以选择按列拆分成一个文件多个sheet,每个分组一个sheet

使用说明:
1、输入文件名改为"input.xlsx",第一行必须为列名称,不要留空行
2、将“mysplit_v7.exe”和“input.xlsx”放到同一个目录中
3、双击“mysplit_v7.exe”运行,可以按需选择列,来拆分多个文件,
4、运行结果保存在当目录新建一个文件夹yyyymmddHHMMSS

注意:
1、若选择列有空值会保存到“空值.xlsx”或者名字为“空值”的sheet
2、输出文件首行加粗,第一列为序号,顺序从1开始
3、如果有很长的数据,拆分后自动转成科学计数格式,解决办法:在该列最后一行随便输入一些字符:aa,筛选列下面流空
 

代码

# -*- coding:utf-8 -*-
#!/usr/bin/env python

import os
import datetime
import pandas as pd
from openpyxl.styles import Font
from openpyxl import load_workbook
# cur_dir = r"G:\python\project_comm\mysplit"
cur_dir=os.getcwd()
filename="input.xlsx"
fullfilename = cur_dir + os.sep+ filename
def init():
    nowtime = datetime.datetime.now()
    strnowtime = nowtime.strftime("%Y%m%d%H%M%S")
    # print(strnowtime)
    ifilepath = cur_dir + os.sep + strnowtime
    if not os.path.exists(ifilepath):
        os.makedirs(ifilepath)
    return ifilepath
def ShezhiYanshi(filename):
    book = load_workbook(filename)
    sheet = book.active
    sheet.cell(1, 1, '序号')
    # 设置第一行和第一列的字体不加粗
    font = Font(bold=False)
    for cell in sheet['1:1']:
        # print(cell)
        cell.font = font
        cell.border = None
    for cell in sheet['A:A']:
        cell.font = font
        cell.border = None
    book.save(filename)
def ShezhiYanshi2(filename):
    workbook = load_workbook(filename)
    # font=workbook.add_format({'border': 1})
    for sheet in workbook.worksheets:
        sheet.cell(1, 1, '序号')
        # 设置第一列的字体不加粗
        for cell in sheet['A:A']:
            cell.font = None
            cell.border = None
        font = Font(bold=True)
        # 第一行
        for cell in sheet['1:1']:
            # print(cell)
            cell.font = font
            cell.border = None
    workbook.save(filename)
def HuiZongBiaoGe4(ifilepath):
    if not os.path.exists(fullfilename):
        print('文件[%s]不存在,请确认!'%(fullfilename))
    print('正在读取文件[%s]......\n' %(fullfilename))
    data = pd.read_excel(fullfilename, sheet_name=0, keep_default_na=False)
    # print(data .columns)
    # print(data .columns.values)
    # print(type(data .columns.values))
    cols=data.columns.values
    print("列名称:")
    for i in range(0,len(cols)):
        print(i+1,cols[i])
    prompts=str(r'请选择要拆分的列[1 - '+str(len(cols))+r']: ')
    cftype = 1
    while True:
        try:
            num = int(input(prompts))
        except ValueError:
            print("Not an integer! Please enter an integer.")
            continue
        else:
            if num<1 or num > len(cols):
                print("Please enter an integer. from 1 to %d" %(len(cols)+1))
                continue
            col_1_name = data.columns[num - 1]

            prompts1=r'请选择:1、结果输出到一个文件每个分组一个sheet 2、每个分组新建一个文件。[1,2]: '
            try:
                cftype = int(input(prompts1))
            except ValueError:
                print("Not an integer! Please enter an integer.")
                continue
            else:
                if cftype != 1 and cftype != 2:
                    print("Please enter an integer. from 1 or 2")
                    continue
            prompts2=r'开始按列第'+str(num)+r'列:['+str(col_1_name)+r']拆分? (Y/N): '
            yn = input(prompts2)
            if not yn in('Y','y'):
                continue
            break
    col_1_name = data.columns[num-1]
    print('开始按列第%d列:[%s]拆分......' % (num,col_1_name))
    print('保存目录:[%s]' % (cur_dir))
    grp1=data.groupby(col_1_name)
    # print(type(grp1))
    # print(len(grp1))
    #2、每个分组新建一个文件
    if cftype == 2:
        i=1
        for name,group in grp1:
            # print(name)
            # print(group)
            # print(type(group))
            name=str(name)
            print('正在拆分[%d-%d][%s][总共%d行]......' % (len(grp1), i, name,len(group)))
            # 重新生成各分组的序号
            group = group.reset_index(drop=True)
            group.index += 1
            tmppd = pd.DataFrame(group)
            if name !='':
                filename=cur_dir + os.sep + name + ".xlsx"
            else:
                filename=cur_dir + os.sep + '空值' + ".xlsx"
            tmppd.to_excel(filename, engine='openpyxl')
            i=i+1
            ShezhiYanshi2(filename)
        print('按列第%d列:[%s]拆分完成。\n保存目录:[%s]' % (num,col_1_name,cur_dir))
    #1、结果输出到一个文件每个分组一个sheet
    elif cftype == 1:
        i = 1
        # 生成的文件
        filename = cur_dir+os.sep+"output.xlsx"
        # 将分组数据写入文件
        writer = pd.ExcelWriter(filename, engine='xlsxwriter')
        workbook=writer.book
        # 增加表格样式
        border_fmt = workbook.add_format({'border': 1})
        bold = workbook.add_format({'border': 1})
        # center_fmt = workbook.add_format({'align': 'center'})
        # title_fmt = workbook.add_format({'bold': True, 'font_size': 14})
        for name, group in grp1:
            # print(name, group)
            # print(group.shape) #(行,列)
            group = group.reset_index(drop=True)
            group.index += 1
            group.to_excel(writer, sheet_name=name,index=True)
            # worksheet = writer.sheets[name]
            # worksheet.write(0, 0, '序号')
        writer.save()
        ShezhiYanshi2(filename)
        print('按列第%d列:[%s]拆分完成。\n保存文件名:[%s]' % (num, col_1_name, filename))
    input('按回车键退出!')


if __name__ == '__main__':
    cur_dir=init()
    HuiZongBiaoGe4(cur_dir)





运行情况

 输入文件

input.xlsx

拆分后保存一个文件多个sheet运行结果

  

 

 拆分后保存多个文件运行结果

 

 资源下载

下载

源码和可以执行程序:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值