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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值