python 使用 openpyxl 的用法(一)

向某个格子中写入内容并保存

方式一:直接修改源文件中的单元格

from openpyxl import load_workbook

workbook = load_workbook(filename='../data/1.1test.xlsx')

sheet = workbook.active

print(sheet)

# 方式一:相当于直接修改源文件
sheet['A1'] = '这是一个不错的开始'

workbook.save(filename='../data/1.1test.xlsx')

方式二:修改单元格内容后另存文件

from openpyxl import load_workbook

workbook = load_workbook(filename='../data/1.1test.xlsx')

sheet = workbook.active

print(sheet)

# 方式一:将“A1”单元格的数据改为了“拜拜了,您来”,并另存为了“1.2test.xlsx”文件
cell = sheet['A1']
cell.value = '拜拜了,您来'

workbook.save(filename='../data/1.2test.xlsx')

向表格中插入行数据 .append()

from openpyxl import load_workbook
from OpenpyxlTest.utils.random_util import RandomUtil

workbook = load_workbook(filename='../data/2.1test.xlsx')
sheet = workbook.active

r = RandomUtil()

for index in range(100):
    sheet.append([index+1,r.create_name(),r.create_phone(),r.create_city()])

workbook.save('../data/2.1test.xlsx')

RandomUtil:

import random

class RandomUtil:
    # 1 姓氏(所有姓氏)
    NAME_XING = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许',
                 '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章',
                 '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳',
                 '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常',
                 '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹',
                 '姚', '邵', '湛', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞',
                 '熊', '纪', '舒', '屈', '项', '祝', '董', '梁', '杜', '阮', '蓝', '闵', '席', '季', '麻', '强', '贾', '路', '娄', '危',
                 '江', '童', '颜', '郭', '梅', '盛', '林', '刁', '锺', '徐', '丘', '骆', '高', '夏', '蔡', '田', '樊', '胡', '凌', '霍',
                 '虞', '万', '支', '柯', '昝', '管', '卢', '莫', '经', '房', '裘', '缪', '干', '解', '应', '宗', '丁', '宣', '贲', '邓',
                 '郁', '单', '杭', '洪', '包', '诸', '左', '石', '崔', '吉', '钮', '龚', '程', '嵇', '邢', '滑', '裴', '陆', '荣', '翁',
                 '荀', '羊', '於', '惠', '甄', '麹', '家', '封', '芮', '羿', '储', '靳', '汲', '邴', '糜', '松', '井', '段', '富', '巫',
                 '乌', '焦', '巴', '弓', '牧', '隗', '山', '谷', '车', '侯', '宓', '蓬', '全', '郗', '班', '仰', '秋', '仲', '伊', '宫',
                 '甯', '仇', '栾', '暴', '甘', '钭', '厉', '戎', '祖', '武', '符', '刘', '景', '詹', '束', '龙', '叶', '幸', '司', '韶',
                 '郜', '黎', '蓟', '薄', '印', '宿', '白', '怀', '蒲', '邰', '从', '鄂', '索', '咸', '籍', '赖', '卓', '蔺', '屠', '蒙',
                 '池', '乔', '阴', '鬱', '胥', '能', '苍', '双', '闻', '莘', '党', '翟', '谭', '贡', '劳', '逄', '姬', '申', '扶', '堵',
                 '冉', '宰', '郦', '雍', '郤', '璩', '桑', '桂', '濮', '牛', '寿', '通', '边', '扈', '燕', '冀', '郏', '浦', '尚', '农',
                 '温', '别', '庄', '晏', '柴', '瞿', '阎', '充', '慕', '连', '茹', '习', '宦', '艾', '鱼', '容', '向', '古', '易', '慎',
                 '戈', '廖', '庾', '终', '暨', '居', '衡', '步', '都', '耿', '满', '弘', '匡', '国', '文', '寇', '广', '禄', '阙', '东',
                 '欧', '殳', '沃', '利', '蔚', '越', '夔', '隆', '师', '巩', '厍', '聂', '晁', '勾', '敖', '融', '冷', '訾', '辛', '阚',
                 '那', '简', '饶', '空', '曾', '毋', '沙', '乜', '养', '鞠', '须', '丰', '巢', '关', '蒯', '相', '查', '后', '荆', '红',
                 '游', '竺', '权', '逯', '盖', '益', '桓', '公', '万俟', '司马', '上官', '欧阳', '夏侯', '诸葛', '闻人', '东方', '赫连', '皇甫',
                 '尉迟', '公羊', '澹台', '公冶', '宗政', '濮阳', '淳于', '单于', '太叔', '申屠', '公孙', '仲孙', '轩辕', '令狐', '锺离', '宇文',
                 '长孙', '慕容', '鲜于', '闾丘', '司徒', '司空', '亓官', '司寇', '仉', '督', '子车', '颛孙', '端木', '巫马', '公西', '漆雕', '乐正',
                 '壤驷', '公良', '拓跋', '夹谷', '宰父', '穀梁', '晋', '楚', '闫', '法', '汝', '鄢', '涂', '钦', '段干', '百里', '东郭', '南门',
                 '呼延', '归海', '羊舌', '微生', '岳', '帅', '缑', '亢', '况', '後', '有', '琴', '梁丘', '左丘', '东门', '西门', '商', '牟',
                 '佘', '佴', '伯', '赏', '南宫', '墨', '哈', '谯', '笪', '年', '爱', '阳', '佟', '第五', '言', '福']
    # 2 名字(这里只用几个名字 做演示即可)
    # 2.1 男孩名字
    NAME_BODY_MING = ['壮', '昱杰', '开虎', '凯信', '永斌', '方洲', '长发', '可人', '天弘', '炫锐', '富明', '俊枫']
    # 2.2 女孩名字
    NAME_GIRL_MING = ['小玉', '蓝', '琬郡', '琛青', '予舴', '妙妙', '梓茵', '海蓉', '语娜', '馨琦', '晓馥', '佳翊']

    # 集合起来(生成姓名)
    NAMES = NAME_BODY_MING + NAME_GIRL_MING
    def random_name_str(self, gender, is_two_xing=False):
        """
        生成随机姓名
        :param gender: 性别(男、女)
        :param is_two_xing: 姓是否是2个字的(默认是1一个字的姓)
        """
        # step1 生成姓
        xing = ''
        if is_two_xing:
            while True:
                xing_two = self.NAME_XING[random.randint(0, len(self.NAME_XING) - 1)]
                if len(xing_two) == 2:
                    xing = xing_two
                    break
        else:
            while True:
                xing_one = self.NAME_XING[random.randint(0, len(self.NAME_XING) - 1)]
                if len(xing_one) == 1:
                    xing = xing_one
                    break

        # step2 生成名
        ming = ''
        if gender == '男':
            ming = self.NAME_BODY_MING[random.randint(0, len(self.NAME_BODY_MING) - 1)]
        elif gender == '女':
            ming = self.NAME_GIRL_MING[random.randint(0, len(self.NAME_GIRL_MING) - 1)]
        else:
            print('性别错误')

        return xing + ming

    # 生成姓名
    def create_name(self):
        xing = self.NAME_XING[random.randint(0, len(self.NAME_XING) - 1)]
        ming = self.NAMES[random.randint(0, len(self.NAMES) - 1)]
        return xing + ming

    # 生成手机号
    def create_phone(self):
        # 第二位数字
        second = [3, 4, 5, 7, 8][random.randint(0, 4)]

        # 第三位数字
        third = {
            3: random.randint(0, 9),
            4: [5, 7, 9][random.randint(0, 2)],
            5: [i for i in range(10) if i != 4][random.randint(0, 8)],
            7: [i for i in range(10) if i not in [4, 9]][random.randint(0, 7)],
            8: random.randint(0, 9),
        }[second]

        # 最后八位数字
        suffix = random.randint(9999999, 100000000)

        # 拼接手机号
        return f'1{second}{third}{suffix}'

    def create_city(self):
        x = {'河北省': ['石家庄', '唐山', '秦皇岛', '承德'],
             '山东省': ['济南', '青岛', '临沂', '淄博'],
             '湖南省': ['长沙', '衡阳', '湘潭', '邵阳', '岳阳', '株洲'],
             '江西省': ['南昌', '九江', '上饶', '景德镇']}
        s = list(x.keys())  # 省列表
        sheng = random.choice(s)  # 随机选一个省
        city = random.choice(x[sheng])  # 随机选一市
        return f'{sheng} {city}'

在 python 中使用 excel 函数公式

from openpyxl import load_workbook
from openpyxl.utils import FORMULAE

print(FORMULAE)

workbook = load_workbook('../data/3.1test.xlsx')

sheet = workbook.active
# 获取行列数
row = sheet.max_row  # 行
column = sheet.max_column  # 列
sheet['O' + str(1)] = '平均营业额'
for i in range(2, row + 1):
    sheet['O' + str(i)] = f'=AVERAGE(B{i}:M{i})'

workbook.save('../data/3.1test.xlsx')

写在最后

入门使用就这些,更高深的用法在实践中去发现吧。。。

 

THE END
分享
二维码
打赏
< <上一篇
下一篇>>