美文网首页
PRO-008:使用openpyxl模块实现xls文件拆分

PRO-008:使用openpyxl模块实现xls文件拆分

作者: 杨强AT南京 | 来源:发表于2019-02-14 20:51 被阅读12次

    老板叫把一个xlsx文件拆分成多个文件,每个文件最多1000条数据,匆忙用openpyxl模块写了这个小程序,程序有点龊,发布在这儿做备忘。
      1. xlsx文件读写;
      2.单元格操作;
      3.单元格合并;
      4.工作表的创建与操作;

    一、模块安装

    安装命令:

    localhost:~ yangqiang$ pip install openpyxl
    
    安装截图 openpyxl安装过程截图

    二、实现代码

    # coding = utf-8
    from openpyxl import Workbook
    from openpyxl import load_workbook
    filename  = '数据文件v1'
    # filename = '用户数据v1'
    
    workbook_ = load_workbook(filename + '.xlsx')
    # 得到所有worksheet
    sheet_names = workbook_.get_sheet_names()  # 获得表单名字
    # 获取第一个worksheet
    sheet = workbook_.get_sheet_by_name(sheet_names[0])
    # 把生成器转换为列表
    lines = list(sheet.rows)
    # 获取第一行合并行
    first_line = lines[0]
    # 获取表头字段行
    header = lines[1:2]
    # 获取数据行
    lines = lines[2:]
    
    
    # 把一个数据集保存成一个xlsx文件,参数1:数据集,参数2:拆分文件的流水号。
    def one_sheet(lines_1000, sheet_no):
        # 创建一个xlsx文件对象
        wb_ = Workbook()
        ws = wb_.active    # 取得默认的worksheet
        ws.title = '新测试表%02d' % (sheet_no+1)   # 设置一个标题
        # 第一行写入合并行
        ws.cell(row=1, column=1).value = first_line[0].value
        # 改行所有列合并 
        ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(first_line))
        # 写头:循环写每个字段的值:行从1开始,所以表头行索引是2
        header_idx = 0
        for col_ in header[0]:
            ws.cell(row=2, column=(header_idx + 1)).value = col_.value
            # print(col_.value)
            header_idx += 1
    
        row_idx = 0   # 纪录行索引
        for row_ in  lines_1000:
            col_idx = 0
            for col_ in row_:
                ws.cell(row=(row_idx+3) ,column=(col_idx + 1)).value = col_.value    # 数据行行从3开始
                col_idx += 1    # 纪录列索引
            row_idx += 1
            row_idx %= 1000     # 这行多余,但也没有毛病(半途改逻辑的后果)
        # 保存文件
        wb_.save(filename+'-%02d.xlsx' % (sheet_no + 1))
    
    # 每个文件数据行数
    batche_num = 1000
    # 计算拆分文件个数
    batches = (len(lines) // batche_num) + 1
    # 循环写数据集到每一个文件
    for pt in range(batches):
        # 取数据集,每个数据集最多1000行,最后一个不足1000行,直接处理。 
        lines_ = lines[pt * batche_num : (pt + 1) * batche_num]
        one_sheet(lines_,pt)
    

    相关文章

      网友评论

          本文标题:PRO-008:使用openpyxl模块实现xls文件拆分

          本文链接:https://www.haomeiwen.com/subject/urmyeqtx.html