zoukankan      html  css  js  c++  java
  • Excel合并(拆分)

    一、需要实现功能

    二、需要用到模块

    • os模块常用知识点讲解;
    • xlsxwriter模块常用知识点讲解;
    • xlrd常用知识点讲解

    2.1os模块

    os.walk()

    os.walk()的返回值是一个生成器(generator),我们需要循环遍历它,来获取其中的内容,每次遍历,返回的都是一个三元组(path, dirs, files)

    1. path:返回的是当前正在遍历的这个文件夹的,本身路径地址;
    2. dirs:返回的是该文件夹中所有目录的名字(不包含子目录),有多少个都以“列表”返回;
    3. files:返回的是该文件夹中所有的文件(不包含子目录下的文件),有多少个都以“列表”返回
    import os
    pwd = "d:"
    print(os.walk(pwd))
    for i in os.walk(pwd):
        print(i)
    for path,dirs,files in os.walk(pwd):
        print(files)
    #得到的结果就不展示了

    os.path.join()

    这个函数,主要用于将多个路径组合后返回

    path1 = 'G:\a'
    path2 = 'aa.txt'
    print(os.path.join(path1,path2))
    #结果G:aaa.txt

    2.2xlsxwriter模块知识点讲解

    xlsxwriter模块一般是和xlrd模块搭配使用的, xlsxwriter:负责写入数据, xlrd:负责读取数据

    如何创建一个“工作簿”

    import xlsxwriter
    
    # 这一步相当于创建了一个新的"工作簿";
    # "demo.xlsx"文件不存在,表示新建"工作簿";
    # "demo.xlsx"文件存在,表示新建"工作簿"覆盖原有的"工作簿";
    workbook = xlsxwriter.Workbook("demo.xlsx")
    
    # close是将"工作簿"保存关闭,这一步必须有,否则创建的文件无法显示出来。
    workbook.close() 

    如何添加一个“Sheet工作表

    import xlsxwriter
    
    workbook = xlsxwriter.Workbook("cc.xlsx")
    worksheet = workbook.add_worksheet("2018年销售量")
    workbook.close()   

    如何向表中插入数据

    import xlsxwriter
    
    # 创建一个名为【demo.xlsx】工作簿;
    workbook = xlsxwriter.Workbook("demo.xlsx")
    
    # 创建一个名为【2018年销售量】工作表;
    worksheet = workbook.add_worksheet("2018年销售量")
    
    # 使用write_row方法,为【2018年销售量】工作表,添加一个表头;
    headings = ['产品','销量',"单价"] 
    worksheet.write_row('A1',headings)
    # 使用write方法,在【2018年销售量】工作表中插入一条数据;
    # write语法格式:worksheet.write(行,列,数据) 
    
    data = ["苹果",500,8.9]
    for i in range(len(headings)):
        worksheet.write(1,i,data[i]) 
    workbook.close()

    2.3xlrd模块知识点讲解

    这里有一个工作簿“test.xlsx”,该文件中有两个“Sheet工作表”,分别命名为“2018年销售量”、“2019年销售量”,如图所示

     open_workbook()打开工作簿

    # 这里所说的"打开"并不是实际意义上的打开,只是将该表加载到内存中打开。
    # 我们并看不到"打开的这个效果"
    import xlrd 
    file = r"G:Jupyter	est.xlsx"
    xlrd.open_workbook(file)
    #结果如下
    #<xlrd.book.Book at 0x29bb8e4eda0>

    sheet_names()获取sheet名

    import xlrd
    file = r"G:Jupyter	est.xlsx"
    fh = xlrd.open_workbook(file)
    fh.sheet_names()
    #['2018年销售量', '2019年销售量']

    sheets() 对象列表

    import xlrd
    file = r"G:Jupyter	est.xlsx"
    fh = xlrd.open_workbook(file)
    fh.sheets()
    #[<xlrd.sheet.Sheet at 0x29bb8f07a90>, <xlrd.sheet.Sheet at 0x29bb8ef1390>]
    #我们可以利用索引,获取每一个sheet表的对象,然后可以针对每一个对象,进行操作
    
    fh.sheets()[0]
    #<xlrd.sheet.Sheet at 0x29bb8f07a90>
    
    fh.sheets()[1]
    #<xlrd.sheet.Sheet at 0x29bb8ef1390>

    获取nrows和ncols属性

    import xlrd
    file = r"G:Jupyter	est.xlsx"
    fh = xlrd.open_workbook(file)
    fh.sheets()
    fh.sheets()[0].nrows  # 结果是:4
    fh.sheets()[0].ncols  # 结果是:3
    fh.sheets()[1].nrows  # 结果是:4
    fh.sheets()[1].ncols  # 结果是:3

    按行获取,每个Sheet表中的数据row_values()

    import xlrd
    file = r"G:Jupyter	est.xlsx"
    fh = xlrd.open_workbook(file)
    sheet1 = fh.sheets()[0]
    for row in range(fh.sheets()[0].nrows):
       value = sheet1.row_values(row)
       print(value)

    三、实现

    1. 将多个Excel表,合并到一个Excel中(每个Excel中只有一个sheet表)

     代码如下

    import pandas as pd
    import os
    pwd = "G:\b"
    df_list = []
    for path,dirs,files in os.walk(pwd):
        for file in files:
            file_path = os.path.join(path,file)                        
            df = pd.read_excel(file_path) 
            df_list.append(df)
    result = pd.concat(df_list)
    print(result)
    result.to_excel('G:\b\result.xlsx',index=False)

    结果如下:

    2. 将多个Excel表,合并到一个Excel中(每个Excel中不只一个sheet表)

    有两个工作簿,如图所示。一个工作簿是pp.xlsx,一个工作簿是qq.xlsx。工作簿pp.xlsx下,有sheet1和sheet2两个工作表。工作簿qq.xlsx下,也有sheet1和sheet2两个工作表

     代码如下:

    import xlrd
    import xlsxwriter
    import os
    
    # 打开一个Excel文件,创建一个工作簿对象
    def open_xlsx(file):
        fh=xlrd.open_workbook(file)
        return fh
        
    # 获取sheet表的个数
    def get_sheet_num(fh):
        x = len(fh.sheets())
        return x
    
    # 读取文件内容并返回行内容
    def get_file_content(file,shnum):
        fh=open_xlsx(file)
        table=fh.sheets()[shnum]
        num=table.nrows
        for row in range(num):
            rdata=table.row_values(row)
            datavalue.append(rdata)
        return datavalue
    
    def get_allxls(pwd):
        allxls = []
        for path,dirs,files in os.walk(pwd):
            for file in files:
                allxls.append(os.path.join(path,file))
        return allxls
    
    # 存储所有读取的结果
    datavalue = []  
    pwd = "G:\d"                          
    for fl in get_allxls(pwd):
        fh = open_xlsx(fl)     
        x = get_sheet_num(fh)  
        for shnum in range(x):
            print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")
            rvalue = get_file_content(fl,shnum)   
    
    # 定义最终合并后生成的新文件
    endfile = "G:\d\concat.xlsx"
    wb1=xlsxwriter.Workbook(endfile)
    # 创建一个sheet工作对象
    ws=wb1.add_worksheet()
    for a in range(len(rvalue)):
        for b in range(len(rvalue[a])):
            c=rvalue[a][b]
            ws.write(a,b,c)
    wb1.close()
    print("文件合并完成")

    效果如下:

    3. 将一个Excel表中的多个sheet表合并,并保存到同一个excel

     代码如下:

    import xlrd
    import pandas as pd
    from pandas import DataFrame
    from openpyxl import load_workbook
    
    excel_name = r"D:pp.xlsx"
    wb = xlrd.open_workbook(excel_name)
    sheets = wb.sheet_names()
    
    alldata = DataFrame()
    for i in range(len(sheets)):
        df = pd.read_excel(excel_name, sheet_name=i, index=False, encoding='utf8')
        alldata = alldata.append(df)       
    
    writer = pd.ExcelWriter(r"C:UsersAdministratorDesktopscore.xlsx",engine='openpyxl')
    book = load_workbook(writer.path)
    writer.book = book  
    # 必须要有上面这两行,假如没有这两行,则会删去其余的sheet表,只保留最终合并的sheet表
    
    alldata.to_excel(excel_writer=writer,sheet_name="ALLDATA")
    writer.save()
    writer.close()

    效果如下:

    4. 将一个Excel表,按某一列拆分成多张表

    import pandas as pd
    import xlsxwriter
    data=pd.read_excel(r"C:UsersAdministratorDesktopchaifen.xlsx",encoding='gbk')
    
    area_list=list(set(data['店铺']))
    
    writer=pd.ExcelWriter(r"C:UsersAdministratorDesktop拆好的表1.xlsx",engine='xlsxwriter')
    data.to_excel(writer,sheet_name="总表",index=False)
    
    for j in area_list:
        df=data[data['店铺']==j]
        df.to_excel(writer,sheet_name=j,index=False)
    
    writer.save()  #一定要加上这句代码,“拆好的表”才会显示出来

  • 相关阅读:
    Hive任务优化--控制hive任务中的map数和reduce数
    qq浏览器如何全屏截图
    清华差生10年奋斗经历
    hive优化之------控制hive任务中的map数和reduce数
    Hive新功能 Cube, Rollup介绍
    Spring自定义类扫描器 ClassPathScanningCandidateComponentProvider Spring生命周期 Constructor > @PostConstruct > InitializingBean > init-method
    Spring生命周期 Constructor > @PostConstruct > InitializingBean > init-method
    ThreadGroup解读
    Java线程池ExecutorService
    @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/14024457.html
Copyright © 2011-2022 走看看