学习代码:openpyxl_2

import json
import random
import sys,requests
import openpyxl
from openpyxl.styles import Font, PatternFill
import numpy as np
import pandas as pd
from pandas.io.json import json_normalize
from matplotlib import pyplot as plt

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QGroupBox, QHBoxLayout, QMenu, QDialog, \
    QLabel


class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.setUI()

    def setUI(self):
        self.setWindowTitle('Office_Study')

        mainLay = QVBoxLayout()
        self.setLayout(mainLay)

        # 第1章
        Part1_Button = QPushButton('第1章 Excel')
        Part1_Menu = QMenu()
        Part1_Button.setMenu(Part1_Menu)
        mainLay.addWidget(Part1_Button)

        P1_1=Part1_Menu.addAction('01.读取excel文件')
        P1_1.triggered.connect(self.P1_1)

        P1_2=Part1_Menu.addAction('02.写入excel文件')
        P1_2.triggered.connect(self.P1_2)

        P1_3=Part1_Menu.addAction('03.设置单元格样式')
        P1_3.triggered.connect(self.P1_3)

        P1_4=Part1_Menu.addAction('04.单元格对方格式')
        P1_4.triggered.connect(self.P1_4)

        P1_5=Part1_Menu.addAction('05.单元格边框样式')
        P1_5.triggered.connect(self.P1_5)

        P1_6=Part1_Menu.addAction('06.合并与拆分单元格')
        P1_6.triggered.connect(self.P1_6)

        P1_7=Part1_Menu.addAction('07.设置行高与列宽')
        P1_7.triggered.connect(self.P1_7)

        P1_8=Part1_Menu.addAction('08.在单元格中录入公式')
        P1_8.triggered.connect(self.P1_8)

        P1_9 = Part1_Menu.addAction('09.在单元格中插入图片')
        P1_9.triggered.connect(self.P1_9)

        P1_10 = Part1_Menu.addAction('10.在单元格中插入柱状图')
        P1_10.triggered.connect(self.P1_10)


    def P1_1(self): # 01.读取excel文件
        '''
        需要加强的知识点:
            1.遍历切片区域中的单位格
            2.遍历指定行或列中的单元格
        学习笔记:
            1.打开Excel文档
                openpyxl.load_workbook()
                不支持读取.xlx格式的老版本excel文件
            2.获取工作簿中sheet名称
                a.获取所有sheet的名称
                    xl1.sheetnames
                b.获取指定名称的sheet
                    xl1['工作名称']
                c.获取活动工作表
                    xl1.active
            3.创建Cell对象
                a.通过excel中的坐标创建cell对象
                    z["A4"]
                b.通过指定行和列的方法创建cell对象
                    z.cell(row=6,column=3)
            4.cell属性
                value:cell中存储的值
                    print(cell1.value)
                row: 行索引
                    print(cell1.row)
                column: 列索引
                    print(cell1.colum)
                coordinate: 坐标
                    print(cell1.coordinate)
            5.切片:取得指定区域
                x["A2":"C6"]
            6.访问特定行或列的单元格的值,见下面相应代码
            7.获取工作表中的最大行和最大列的数量
                print(z.max_row,z.max_column)
        '''

        # 用openpyxl模块打开Excel文档,不支持读取.xlx格式的老版本excel文件
        xl1 = openpyxl.load_workbook('./防雷接地.xlsx')
        print(xl1)
        # 获取工作簿的sheet表的名称
        y = xl1.sheetnames
        print(y)
        # 获取工作簿的sheet表的名称,2.0老版本不支持此写法
        x = xl1['防雷接地']
        print(x)
        # 获取活动表
        z = xl1.active
        print(z)
        # 从表中取得单元格
        '''
        有了Worksheet对象后,就可以按名字访问Cell对象
        cell属性:
            value:cell中存储的值
            row: 行索引
            column: 列索引
            coordinate: 坐标
        '''
        # 创建Cell对象
        cell1 = z["A4"]
        print(cell1)
        print(cell1.value)
        print(cell1.row)
        print(cell1.column)
        print(cell1.coordinate)
        # 通过指定行和列的方法创建cell对象
        cell2 = z.cell(row=6, column=3)
        print(cell2)
        print(cell2.value)
        print(cell2.row)
        print(cell2.column)
        print(cell2.coordinate)
        # 切片:取得指定区域

        area1 = x["A2":"C6"]
        print(area1)
        # 遍历区域中每一个单元格
        for row in area1:
            for cell in row:
                print(cell.coordinate, cell.value)
        # 要访问特定行或列的单元格的值,也可以利用Worksheet对象的rows和columns属性
        for cell in list(z.columns)[0]:
            print(cell.value)
        for cell in list(x.rows)[6]:
            print(cell.value)
        # 获取工作表中的最大行和最大列的数量
        '''
            max_row
            max_column
        '''
        print(z.max_row, z.max_column)
    def P1_2(self): # 02.写入excel文件
        '''

        '''
        # 创建新的工作表对象
        newxl = openpyxl.Workbook()
        print(newxl)
        # 获取工作表名称
        print(newxl.sheetnames)
        # 给工作表设置名称
        sheet = newxl.active
        sheet.title = "跟进工作记录"
        print(newxl.sheetnames)
        # 保存工作表
        newxl.save('第一个用Python程序创建的Excel工作簿.xlsx')
        # 创建和删除工作表
        '''
            利用create. .sheet( and del语法, 可以在工作簿中添加或删除工作表
            在工作簿中添加或删除工作表之后,记得调用save0方法来保存变更。
        '''
        # 在已有的excel文件中创建工作表
        loadxl1 = openpyxl.load_workbook('第一个用Python程序创建的Excel工作簿.xlsx')
        loadxl1.create_sheet(title='销售记录')
        loadxl1.create_sheet(index=1, title="养殖技术")
        print(loadxl1.sheetnames)
        loadxl1.save('第一个用Python程序创建的Excel工作簿.xlsx')
        # 删除sheet
        loadxl2 = openpyxl.load_workbook('第一个用Python程序创建的Excel工作簿.xlsx')
        del loadxl2['养殖技术']
        print(loadxl2.sheetnames)
        loadxl2.save('第一个用Python程序创建的Excel工作簿.xlsx')
        # 将值写入单元格
        '''
            将值写入单元格,很像将值写入字典中的键
            如果你有单元格坐标的字符串,可以像字典的键一-样,将它用于Worksheet对象,指定要写入的单元格。
        '''
        wb = openpyxl.load_workbook('第一个用Python程序创建的Excel工作簿.xlsx')
        sheet1 = wb.active
        sheet1['A1'] = 'hello\nworld'
        sheet1['A2'] = 'world'
        sheet1["A3"] = 100
        wb.save('第一个用Python程序创建的Excel工作簿.xlsx')
    def P1_3(self): # 03.设置单元格样式
        '''
        1.故意写错参数的值,报错时会提示该参数的值有哪些。比如sheet1['A6'].fill=PatternFill(patternType='lightGray',fgColor='FF1CAE')
          如果故意录错patternType的值,则会报错给出该参数的值有哪些。
        '''

        '''
        为了定义单元格的字体风格,需要从openpyxl.styles模块导入Font和PaternFll工具
        2.字体
        Font(name='Calibri',size=11,bold=False,italic=False,vertAlign=None,underline='none',strike=False, color='FF000000')
        参数解读:
            name:字体名称
                字体名称,注意中文字体前面加u
            size:设置字体大小
                字号大小
            bold:设置是否加粗
                True(加粗)/False(不加粗)
            italic:
                True(倾斜)/False(不倾斜)
            vertAlign:设置上下标
                'None"(默认)/
                'superscript'(上标)/
                'subscript'(下标)
            underline:设置下划线
                'None',(fi)/
                'single’(单下列线)/
                'double’(双下划线)/
                'singleAccounting’(会计用单下列线)/
                'doubleAccounting’(会计用双下划线
            strike:设置删除线
                'True"(显示删除线)/
                'False"(不显示删除线)
            color:颜色
                字体的颜色 RGB转HEX
                RGB转HEX 指的一个RGB转HEX的色号转换网站,比如:
                https://www.jyshare.com/front-end/55/
        '''
        # 创建excel文件并命名sheet
        wb = openpyxl.Workbook()
        print(wb.sheetnames)
        sheet1 = wb.active
        sheet1.title = '设置单元格样式'
        print(wb.sheetnames)
        # 将值写入单元格
        sheet1['A6'] = '字体'
        # 设置字体
        sheet1['A6'].font = Font(name='楷体')

        # 设置文字大小
        sheet1["A6"].font = Font(sz=20)

        # 设置字体颜色
        sheet1['A6'].font = Font(color='7F00FF')

        # 其他样式设置
        '''
            italic=True: 设置斜体
            underline ='single':单下划线,double双下划线,singleAccounting,doubleAccounting
            b= True:加粗
        '''
        # 设置斜体
        sheet1['A6'].font = Font(italic=True)
        # 设置单下划线
        sheet1["A6"].font = Font(underline='double')
        # 设置单元格填充色
        sheet1['A6'].fill = PatternFill(patternType='lightGray', fgColor='FF1CAE')
        '''
            patternType:填充样式,此参数必须填上,否则设置的填充色无效,solid是全部填充的意思
            fgColor:填充色,16进制的RGB值
            以下填充样式的其他类型,空间时间可以使用循环挨个尝试一下
            'lightGray', 'lightDown', 'lightVertical', 'mediumGray', 
            'darkGray', 'darkDown', 'darkVertical', 'gray125', 'darkHorizontal', 
            'lightGrid', 'darkGrid', 'darkTrellis', 'gray0625', 'lightTrellis', 
            'solid', 'darkUp', 'lightHorizontal', 'lightUp'

        '''
        wb.save('设置单元格样式.xlsx')
    def P1_4(self): # 04.单元格对方格式
        '''
        1.单元格的对其方式:导入Alignment模块
            from openpyxl.styles import Alignment
        2.单元格对方的方法
            sheet1['e15'].alignment=Alignment(horizontal='left',vertical='top')
            horizontal表示左右对齐方式,常用参数有:left,center,right
            vertical表示上下对齐方式,常用参数有:top,center,bottom
            可以只设置一个参数:horizontal或vertical
        孙老师的课件
        Alignment(horizontal='general',vertical='bottom', text rotation=0, wrap text=False, shrink to fit=False, indent=0)
        horizontal:
            'general'(常规)/
            'justify'(两端对齐)/
            'right'(靠右)/
            'centercontinuous'(跨列居中)/
            'distributed'(分散对齐)/
            'fill'(填充)/
            center'(居中)/
            'left'(靠左)
        vertical:
            'center'(垂直居中)/
            'top'(靠上)/
            'bottom'(靠下)/
            justify'(两端对齐)/
            'distributed'(分散对齐)
        text rotation:指定文本旋转角度
        wrap text:是否自动换行
        shrink to fit:是否缩小字体填充
        indent:指定缩进
        '''
        import openpyxl
        from openpyxl.styles import Alignment
        wb = openpyxl.Workbook()
        sheet1 = wb.active

        sheet1['e6'] = '建筑'
        sheet1['e7'] = '建筑'
        sheet1['e8'] = '建筑'
        sheet1['e9'] = '建筑'
        sheet1['e10'] = '建筑'
        sheet1['e11'] = '建筑'
        sheet1['e12'] = '右上'
        sheet1['e13'] = '右下'
        sheet1['e14'] = '中中'
        sheet1['e15'] = '左上'

        sheet1.row_dimensions[6].height = 60
        sheet1.row_dimensions[7].height = 60
        sheet1.row_dimensions[8].height = 60
        sheet1.row_dimensions[9].height = 60
        sheet1.row_dimensions[10].height = 60
        sheet1.row_dimensions[11].height = 60
        sheet1.row_dimensions[12].height = 60
        sheet1.row_dimensions[13].height = 60
        sheet1.row_dimensions[14].height = 60
        sheet1.row_dimensions[15].height = 60

        sheet1.column_dimensions['e'].width = 50
        # 设置对齐方式
        sheet1['e6'].alignment = Alignment(horizontal='right')
        sheet1['e7'].alignment = Alignment(horizontal='left')
        sheet1['e8'].alignment = Alignment(horizontal='center')
        sheet1['e9'].alignment = Alignment(vertical='top')
        sheet1['e10'].alignment = Alignment(vertical='center')
        sheet1['e11'].alignment = Alignment(vertical='bottom')
        sheet1['e12'].alignment = Alignment(vertical='top', horizontal='right')
        sheet1['e13'].alignment = Alignment(vertical='bottom', horizontal='right')
        sheet1['e14'].alignment = Alignment(vertical='center', horizontal='center')
        sheet1['e15'].alignment = Alignment(vertical='top', horizontal='left')
        wb.save('单元格对齐方式.xlsx')
    def P1_5(self): # 05.单元格边框样式
        '''
        1.设置cel的边框样式
            需要使用Side, Boder类,步骤:
                a.创建Side对象,通过构造方法参数style和color设置其边的样式和颜色
                b.设置cl的border属性,给其赋值为Border对象, 且设置其上下左右边框为哪-个Side

        2.设置单元格边框线的方法
            s1=Side(style='thin',color='8470FF')
            style表示边框线类型,color表示边框线颜色
            style参数的种类:
            'double'
            'mediumDashDotDot'
            'dashed'
            'dashDot'
            'slantDashDot'
            'dashDotDot'
            'dotted'
            "hair'
            'mediumDashed',
            'thin'
            'mediumDashDot’
            'medium'
            'thick'
        3.设置单元格边框的方法
            sheet1['b5'].border=Border(top=s1,bottom=s2,left=s1,right=s2)
            top,bottom,left,right分别传入边框线的类型,即定义的单元格网格线的类型变量
            使用公式描述则为:
            Border(left=左边线样式,right=右连线样式,top=上边线样式,bottom=下边线样式)
        4.背景填充
        PatternFill(fill_type=None, start_color='FFFFFFFF', end_color='FF000000')
        fil type:
            'None'(不填充)/
            'solid'(实心填充)/
            'darkGray'(75%灰色)
            'mediumGray'(50%灰色)/
            'ightGray'(25%灰色)/
            'gray125'(12.5%灰色)
            'gray0625'(6.25%灰色)/
            'darkHorizonta”(水平条纹)/
            'darkVerical'(垂直条纹)/
            'darkDown'(逆对角线条纹)/
            'darkUp'(对角线条纹)/
            'darkGrid'(对角线剖面线)/
            'darkTrelis'(粗对角线剖面线)/
            'ightHorizonta'(细水平条纹)/
            'lightvertical'(细垂直条纹)/
            'ightDown'(细逆对角线条纹)/
            'ightUp'(细对角线条纹)/
            "ightGrid'(细水平剖面线)/
            'ightTrellis'(细对角线剖面线)
            start_color/fgColor:背景颜色 RGB转HEX
            end_color/bgColor:图案颜色 RGB转HEX
            RGB转HEX 指的一个RGB转HEX的色号转换网站,比如:
                https://www.jyshare.com/front-end/55/
        5.渐变填充 GradientFil
        GradientFil(stop=(渐变颜色1,渐变颜色2,…)
            fill type:
                'linear'(线性渐变)/
                'path'(中心扩散)
            degree:旋转角度
            stop:一个元组(00,XX),00为起始颜色,XX为结束颜色
        6.锁定单元格和隐藏公式
        Protection(locked=True,hidden=False)
            locked:指定是否锁定单元格
            hidden:指定是否隐藏公式
            只有在开启“保护工作表”之后,“锁定单元格”和“隐藏公式”才生效。
        7.行高和列宽
            工作表.row_dimensions[1].height =200
            工作表.column_dimensions['B'].width =100
        '''

        from openpyxl.styles import Side, Border
        import openpyxl
        wb = openpyxl.Workbook()
        sheet1 = wb.active
        sheet1['a1'] = 'a1'
        sheet1['d6'] = "d6"
        s1 = Side(style='thin', color='8470FF')
        s2 = Side(style='double', color='ff0000')
        sheet1["C2"].border = Border(top=s1)
        sheet1['b5'].border = Border(top=s1, bottom=s2, left=s1, right=s2)

        wb.save("单元格边框样式.xlsx")
    def P1_6(self): # 06.合并与拆分单元格
        '''
        1.合并和拆分单元格的方法
            sheet1.merge_cells()
            sheet2.unmerge_cells()
        2.合并单元格
            sheet1.merge_cells('A1:D6')
            将A1:D6区域合并为一个单元格
        3.拆分单元格
            sheet2.unmerge_cells('A1:D6')
            将整体合并区域拆分成单元格
        4.如果拆分区域与合并区域不一致,则需要将大区域拆分后,再进行合
          并,这是excel的手动操作方法,程序操作也是一样
        '''
        import openpyxl
        wb = openpyxl.Workbook()
        sheet1 = wb.active
        # 合并单元格:合并区域为A1:D6
        sheet1.merge_cells('A1:D6')
        sheet1['a1'] = '你好中国'
        wb.save('合并与拆分单元格.xlsx')
        # 拆分单元格,拆分区域应该为一个完整的合并区域,否则会报错。
        wb1 = openpyxl.load_workbook('合并与拆分单元格.xlsx')
        sheet2 = wb1.active
        sheet2.unmerge_cells('A1:D6')
        wb1.save('合并与拆分单元格.xlsx')
    def P1_7(self): # 07.设置行高与列宽
        '''
        1.row_dimensions和column_dimensions是sheet对象的属性,用于设置行高和列宽
        2.sheet1.row_dimensions和sheet1.column_dimensions返回的值分别是一个列表,
          里面是是元组,元组中的元素(行号或列号,行或列所占的内存地址)
        3.设置行高
            sheet1.row_dimensions[2].height=60
            row_dimensions[2]表示第3行
            .height=60是行的属性值,此值的含义是将行高设置为60高
        4.设置列宽
           sheet1.column_dimensions['C'].width=36
            column_dimensions['C']表示C列,此处参数不可以写数字,只能写列名称
            .width=36是列的属性值,此值的含义是将列宽度设置为36
        5.注意:
            a.行的高度可以设置为0到409之间的整数或浮点值。这个值表示高度的点数。一点等于1/72英寸。默认的行高是12.75.
            b.列宽可以设置为0到255之间的整数或浮点数。默认的列宽是8.43个字符。
            c.列宽为零或行高为零,将使单元格隐藏。
        6.单元格地址A1和a1的写法效果是一样的
        '''
        import openpyxl
        wb = openpyxl.Workbook()
        wb.active.title = '行高和列宽'
        sheet1 = wb.active
        sheet1["a1"] = 18
        sheet1['d6'] = '中国'
        # 设置行高
        sheet1.row_dimensions[2].height = 60
        # 设置列宽
        sheet1.column_dimensions['C'].width = 36
        wb.save('设置行高和列宽.xlsx')
    def P1_8(self): # 08.在单元格中录入公式
        '''
        利用openpyxl模块,用编程的方式在单元格中添加公式,就像添加普通的值一样。例如:
            sheet['B9']= '=SUM(B1:B8)'

        '''
        import openpyxl
        wb = openpyxl.Workbook()
        sheet1 = wb.active
        sheet1['a1'] = 100
        sheet1["b1"] = 108
        sheet1['c1'] = '=sum(A1:B1)'
        sheet1['d1'] = '=a1*b1'
        wb.save('在单元格中录入公式.xlsx')
    def P1_9(self): # 孙兴华P18插入图片
        wb= openpyxl.Workbook()
        sheet1=wb.active
        # 1.创建并设置图片对象
        image=openpyxl.drawing.image.Image('./Excel/狼.jpeg')
        image.height=60
        image.width=50
        # 2.将图片插入至工作表中指定单元格
        sheet1.add_image(image,"F6")

        wb.save('在单元格中插入图片.xlsx')
    def P1_10(self): # 孙兴华P18插入柱状图,有时间再学
        wb= openpyxl.Workbook()
        sheet1=wb.active
        # 1.新建一个柱状图对象
        chart1=openpyxl.chart.BarChart()
        # 2.设定数据范围
        data=openpyxl.chart.Reference()

        wb.save('在单元格中插入柱状图.xlsx')


app = QApplication(sys.argv)
w = MyWin()
w.show()
app.exec()
'''
学习openxl库的诀窍
1.创建、保存文件
2.弄清楚工作表的属性,单元格的属性有哪些,方法有哪些就可以了

'''

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值