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)