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.弄清楚工作表的属性,单元格的属性有哪些,方法有哪些就可以了
'''
学习代码:openpyxl_2
最新推荐文章于 2024-08-13 17:31:17 发布