2025年3月15日 星期六 甲辰(龙)年 月十四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python的openpyxl封装实现读取表格数据

时间:12-09来源:作者:点击数:15

Python的openpyxl封装实现读取表格数据

数字一律按浮点型输出,日期输出成一串小数,布尔型输出0或1,所以我们必须在程序中做判断处理转换 成我们想要的数据类型 ctype的取值:0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error 

  • #!/usr/bin/env python
  • # coding=utf-8
  • # 封装实现读取表格数据
  • # 2018.11.10增加了如果不传sheet_name默认读取第一个表格的功能
  • # 2022.1.10 write_excel增加了设置日期格式的单元格,写入日期格式一般是写入公式:=Date(2022,01,02)
  • # 2022.2.7 dict_data 优化了获取数据的代码
  • import xlrd,os
  • from xlrd import xldate_as_tuple
  • from datetime import datetime
  • from openpyxl import load_workbook
  • import re
  • class ExcelUtil:
  • def __init__(self, excel_path, sheet_name=None):
  • self.excel_path = excel_path
  • self.wb = load_workbook(excel_path,data_only=True)
  • self.data = xlrd.open_workbook(excel_path)
  • # 如果sheet_name传入值了并且名字在表格的sheet表名里就用这个名的表,如果没有就默认选择第一个表格
  • if sheet_name != None and sheet_name in self.wb.sheetnames:
  • self.table = self.data.sheet_by_name(sheet_name)
  • self.ws = self.wb[sheet_name]
  • else:
  • self.table = self.data.sheets()[0]
  • self.ws = self.wb.worksheets[0]
  • try:
  • # 获取第一行作为key值
  • self.keys = self.table.row_values(0)
  • except:
  • print()
  • # 获取总行数
  • self.rowNum = self.table.nrows
  • # 获取总列数
  • self.colNum = self.table.ncols
  • # 获取表格数据
  • def dict_data(self):
  • if self.rowNum <= 1:
  • print("总行数小于1,请核实表格数据!")
  • os._exit(0)
  • else:
  • r = []
  • # 行数,从第2行取数据,第一行为表头,如果从第一行取数据,1改为0或不写
  • for row in range(1,self.rowNum):
  • s = {}
  • # 列数
  • for col in range(self.colNum):
  • ctype = self.table.cell(row,col).ctype
  • cell = self.table.cell_value(row,col)
  • # 如果表格中是日期,那么要进行转化
  • if ctype == 3:
  • # xldate_as_tuple(cell,0)返回的是一个元组
  • date = datetime(*xldate_as_tuple(cell,0))
  • cell = date.strftime('%Y-%m-%d %H:%M')
  • s[self.keys[col]] = cell
  • # 如果是整型
  • elif ctype == 2 and cell % 1 == 0:
  • s[self.keys[col]] = int(cell)
  • else:
  • s[self.keys[col]] = cell
  • r.append(s)
  • # j=1代表第二行
  • # j = 1
  • # i控制循环次数,也就是取多少行数据
  • # for i in range(self.rowNum - 1):
  • # s = {}
  • # # 从第二行取对应values值
  • # values = self.table.row_values(j)
  • # # 列数
  • # for x in range(self.colNum):
  • # # 如果表格中是日期,那么要进行转化
  • # ctype = self.table.cell(j, x).ctype
  • # cell = self.table.cell_value(j, x)
  • # if ctype == 3:
  • # date = datetime(*xldate_as_tuple(cell, 0))
  • # cell = date.strftime('%Y-%m-%d %H:%M')
  • # s[self.keys[x]] = cell
  • # # 如果是整型
  • # elif ctype == 2 and cell % 1 ==0:
  • # s[self.keys[x]] = int(cell)
  • # else:
  • # s[self.keys[x]] = values[x]
  • # r.append(s)
  • # j += 1
  • return r
  • # 往表格里写入数据
  • def write_excel(self,row,col,value,filePath,date_format=None):
  • # dateCell=self.ws.cell(row,col,value=value)
  • dateCell=self.ws.cell(row,col)
  • dateCell.value=value
  • # 如果是日期格式,单独设置单元格格式
  • if date_format != None:
  • print("处理的{}行{}列单元格为日期格式".format(row,col))
  • dateCell.number_format = 'yyyy/mm/dd;@'
  • self.wb.save(filePath)
  • if __name__ == "__main__":
  • filePath = "../产品.xlsx"
  • sheetName = "Sheet1"
  • data = ExcelUtil(filePath,sheetName)
  • print(data.dict_data())
  • # data.write_excel(2,7,'是',filePath)
  • # 写入日期格式一般是写入公式=Date(2022,01,02)
  • ExpireDate = '2022-01-02'
  • date = ExpireDate.split("-")
  • y = date[0]
  • m = date[1]
  • d = date[2]
  • ExpireDate = '=DATE(' + y + ',' + m + ',' + d + ')'
  • # data.write_excel(2,7,ExpireDate,filePath,date_format='')

使用方法:

  • from process_excel import ExcelUtil
  • data = ExcelUtil("./代理IP.xlsx").dict_data()
  • for i in range(len(data)):
  • xx = data[i]['表头']
  • # 修改2行5列数据
  • ExcelUtil("./代理IP.xlsx").write_excel(2, 5, '有效', filePath)
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐