openpyxl 模块


openpyxl 模块

  • 安装第三方模块

pip install openpyxl

读sheet

from openpyxl import load_workbook
?
#打开excel文件
workbook = load_workbook("文件名")
?
#1.获取所有的sheet名称
name_list = workbook.sheetnames
print(name_list)
?
#2.根据名称获取sheet
sheet_object = workbook["sheetname"]
print(sheet_object)
?
#3.根据索引获取sheet
sheet = worksheets[0]
?
#4.循环获取所有的sheet
for sheet_object in wcrkbook:
   print(sheet_object)
#不加.sheetnames内部也是自动获取sheetnames的
   

读sheet中单元格的数据

from openpyxl import load_workbook
?
workbook = load_workbook("文件路径")
sheet = workbook.worksheets[1]
?
#1.获取 第n行 &第n列 的单元格(起始位置是1)
cell = sheet.cell(1,1)
print(cell)
print("内容",cell.value)
print("样式",cell.style)
print("字体",cell.font)
print("排序",cell.alignment)
?
#2.根据Excel的位置获取数据
cell_al = sheet["A1"]
print(cell_al.value)
?
#3.获取第n行的单元格
cell_list = sheet[1]
?
for cell in sheet[1]:
   print(cell.value)
   
#4.循环获取所有行数据
for row in sheet.rows:
   print(row[0].value)
   
#5.循环获取所有列
for col in sheet.columns:
   print(col[0].value)
?

读合并的单元格

from openpyxl import load_workbook
?
workbook = load_workbook("文件路径")
sheet = workbooks[2]
?
#1.获取单元格
c1 = sheet.cell(1,1)
print(c1) #
print(c1.value) #用户信息
#第一个和第二个合并单元格,第一个显示值,第二个显示null
c1 = sheet.cell(1,2)
print(c1) #
print(c1.value) #None
?

写Excel

  • 原Excel文件基础上写内容

    from openpyxl import load_workbook
    ?
    workbook = load_workbook("文件路径")
    sheet = worksheets[0]
    ?
    #1.找到单元格,并修改单元格的内容
    cell = sheet.cell(1,1)
    cell.value = "值"
    ?
    #将excel文件保存到p2.xlsx文件中
    workbook.save("文件路径")
  • 新创建Excel文件写内容

    from openpyxl import workbook
    ?
    #创建excel且默认会创建一个sheet(名称为sheet)
    workbook = workbook.Workbook()
    ?
    sheet = worksheets[0]
    ?
    #找到单元格,并修改单元格的内容
    cell = sheet.cell(1,1)
    cell.value = "值"
    ?
    #将excel文件保存到p2.xlsx文件中
    workbook.save("文件路径")
from openpyxl import workbook
?
workbook = workbook.workbook()
?
#1.修改sheet名称
sheet = worksheets[0]
sheet.title = "值"
workbook.save("p2.xlsx")
?
#2.创建sheet并设置sheet颜色
sheet = workbook.create_sheet("工作计划",0)#零代表位置
sheet.sheet_properties.tabColor = "1072BA"
workbook.save("P2.xlsx")
?
#3.默认打开的sheet
workbook.active = 0
workbook.save("p2.xlsx")
?
#4.拷贝sheet
sheet = workbook.create_sheet("工作计划")
sheet.sheet_properties.tabColor = "1072BA"
?
new_sheet = workbook.copy_worksheet(workbook["Sheet"])
new_sheet.title = "新的计划"
workbook.save("p2.xlsx")
?
#5.删除sheet
del workbook["用户列表"]
workbook.save("files/p2.xlsx")

操作单元格

from openpyxl import load_workbook
from openpyxl.styles import Alignment,Border,Side,Font,PatternFill,GradientFill
?
workbook = load_workbook("文件")
sheet = workbook.worksheet[1]
#1.获取某个单元格,修改值
cell = sheet.cell(1,1)
cell.value = "开始"
?
#2.获取某个单元格,修改值
sheet["V3"] = "Alex"
vb.save("p2.xlsx")
?
#3.获取某些单元格,修改值
cell_list = sheet[B2:C3]
#b2到c3拿到的值是(b2,b3,c2,c3)
for row in cell_list:
   for cell in row :
       cell.value = "新的值"
vb.save("p2.xlsx")
?
#4.对齐方式
cell = sheet.cell(1,1)
#herizontal,水平方向对齐方式:“general”,"left","center"句中,"right","fill","justify","centercontinuous","distributed"
#vertieal,垂直方向对齐方式:"top","center","bottom","justify","distributed"
#text_rotation,旋转角度
#wrap_text,是否自动换行
cell.alignment = Alignment(horizontal="center",vertical="distributed",text_rotation=45,wrap_text=True)
wb.save("p2.xlsx")
?
#5.边框
#side的style有如下:dashDot,dashDotDot,dashed,dotted,double,hair,mediun,mediumDashDot,mediumDashDotdot,mediumDashed,slantDashDot,thick,thin.
sell = sheet.cell(9.2)
cell.border = Border(
top = Side(style="thin",color="FFB6C1"),  
   bottom=Side(style="dashed",color="9932cc"),
   left=Side(style="dashed",color="9932cc"),
   right=Side(style="dashed",color="9932cc"),
   diagonal=Side(style="thin",color="483D8B"),#对角线
   diagonalUp=True,#左下-右上
   #diagonalDown=True #左上-右下
)
wb.save("p2.xlsx")
?
#6.字体
cell = sheet.cell(5,1)
cell.font = Font(name="微软雅黑",size=45,color="ff0000",underline="single") #underline下划线
wb.save("p2.xlsx")
?
#7.背景色
cell = sheet.cell(5,3)
cell.fill = PatternFill("solid",fgColor="99ccff")
wb.save("p2.xlsx")
?
#8.渐变背景色
cell = sheet.cell(5,5)
cell.fill = GradientFill("linear",stop=("FFFFFF","99ccff","000000"))#从左到右的三个颜色
wb.save("p2.xlsx")
?
#9.宽高(索引从1开始)
sheet.row_idmensions[1].height = 50
sheet.column_dimensions["E"].width = 100
wb.save("p2.xlsx")
?
#10.合并单元格
sheet.merge_cells("B2:D8")
#这是两种
sheet.merge_cells(start_row=15,start_column=3,end_row=18,end_column=8)
wb.save("p2.xlsx")
#这是解除合并单元格的
sheet.unmerge_cells("B2:D8")
wb.save("p2.xlsx")
?
#11.写入公式
sheet = wb.worksheets[3]
sheet["D1"] = "合计"
sheet["D2"] = "=B2*C2"
wb.save("p2.xlsx")
?
sheet = wb.worksheets[3]
sheet["D3"] = "=sum(B3,C3)"
wb.save("p2.xlsx")
?
#12.删除
#idx,要删除的索引位置
#anount,从索引位置开始要删除的个数(默认为1)
sheet.delete_rows(idx=1,anount=2)
sheet.delete_cols(idx=1,anount=3)
wb.save("p2.xlsx")
?
#13.插入
sheet.insert_rows(idx=5,anount=10)
sheet.insert_cols(idx=3,anount=2)
wb.save("p2.xlsx")
?
#14.循环写内容
?
sheet = wb["Sheet"]
cell_range = sheet["A1:C2"]
for row in cell_range:
   for cell in row:
       cell.value = "xx"
#第5行第1列到第7行第10列
for row in sheet.iter_rows(min_row=5,min_col=1,max_col=7,max_row=10):
   for cell in row:
       cell.value = "oo"
wb.save("p2.xlsx")
?
#15.移动
#将H2:J10范围的数据,向右移动15个位置、向上移动1个位置
sheet.nove_range("H2:J10",rows=-1,cols=15)
wb.save("p2.xlsx")
?
#16.打印区域
sheet.print_area = "A1:D200"
wb.save("p2.xlsx")
?
#17.打印时,每个页面的固定表头
sheet.print_title_cols = "A:D"
sheet.print_title_rows = "1:3"
wb.save("p2.xlsx")

作业

  1. 补充代码:实现去网上获取指定地区的天气信息,并写入excel中。

    import requests
    ?
    while True:
       city = input("请输入城市(Q/q退出):")
       if city.upper()=="Q":
           break
       url = "http://ws.webxml.com.cn//webServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName={}".format(city)
       res = requests.get(url=url)
       print(res.text)
       
       #1.提取xml格式中的数据
       #2.为每个城市创建一个sheet,并将获取的xml格式中的数据写入到excel中。
       from openpyxl import load_workbook
    ?
           workbook = load_workbook("a1.xlsx")
           sheet = workbook.create_sheet("工作计划")
           sheet.title = city
           sheet = workbook[city]
           cell=sheet["A1:AH1"]
           text=str(res.text)[:-16].split("")[1:]
           for i in range(len(text)):
               cell[0][i].value = text[i][:-13]
               print(text[i][:-13])
           workbook.save("a1.xlsx")
  2. 读取ini文件内容,按照规则写入到Excel中[mysqld]

    datadir=/var/lib/mysql
    socket=py-mysql-bin
    log-bin=py-mysql-bin
    character-set-server=utf8
    collation-server=utf8_general-ci
    log-error=/var/log/mysqld.log
    symbolic-links=0
    ?
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    ?
    [client]
    default-character-set=utf8
    #1.读取ini格式的文件,并创建一个excel文件,并且每个节点创建一个sheet,然后将节点下的键值写入到excel中。
    #2.首行,字体白色&单元格背景色蓝色
    #3.内容均句中
    #4.边框
    from openpyxl import workbook
    from openpyxl.styles import Alignment,Border,Side,Font,PatternFill,GradientFill
    v="""[mysqld]
    datadir=/var/lib/mysql
    socket=py-mysql-bin
    log-bin=py-mysql-bin
    character-set-server=utf8
    collation-server=utf8_general-ci
    log-error=/var/log/mysqld.log
    symbolic-links=0
    ?
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    ?
    [client]
    default-character-set=utf8"""
    workbook = workbook.Workbook()
    del workbook["Sheet"]
    bb = 2
    border = Border(
              top = Side(style="thin",color="000000"),  
              bottom=Side(style="thin",color="000000"),
              left=Side(style="thin",color="000000"),
              right=Side(style="thin",color="000000"))
    for i in v.split("\n"):
      if "[" in i:
          sheet = workbook.create_sheet(i[1:-1])
          for k,v in {"A1":"键","B1":"值"}.items():
              cell=sheet[k]
              cell.value = v
              cell.font = Font(name="微软雅黑",color="FFFAFA")
              cell.fill = PatternFill("solid",fgColor="00EEEE")
              cell.border = border
              cell.alignment = Alignment(horizontal="center",vertical="center")
              bb=2
      else:
          cell=sheet["A%s:B%s"%(bb,bb)][0]
          s=i.split("=")
          if bool(s[0])== False:
              continue
          cell[0].value = s[0]  
          cell[1].value = s[1]
          cell[0].border = border
          cell[1].border = border
          bb += 1
          workbook.save("a2.xlsx")
    workbook.save("a2.xlsx")