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

2019-02-14  本文已影响12人  杨强AT南京

老板叫把一个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)

上一篇下一篇

猜你喜欢

热点阅读