zoukankan      html  css  js  c++  java
  • python-操作excel之openpyxl

    1. 安装

    pip install openpyxl

    2. 写文件

     创建工作表

    from  openpyxl import  Workbook 
    wb = Workbook()# 实例化
    ws1 = wb.create_sheet('index', 0)  # 根据索引可以指定添加位置,默认不写往后追加
    ws1.title = 'end' # 修改工作表名称
    print(wb.sheetnames) # 查看工作表名称

     

    添加数据

    # 单个数据添加
    ws1['B1'] = 'wind'
    ws1.cell(row=4,column=2,value='nihao')#row 行;column 列
    # 多个添加
    lst = ['名字', '性别', '爱好', "家庭住址"]
    lst2 = ['wind', '男', '打球', '无敌']
    ws1.append(lst)
    ws1.append(lst2)

    # 循环
    lst = [['名字', '性别', '爱好', "家庭住址"], ['wind', '男', '打球', '无敌']]
    for i in lst:
    ws1.append(i)
    
    

     

    函数运算

    ws1['B1'] = 3
    ws1['B2'] = 5
    ws1['B3'] = '=sum(B1:B2)'
    wb.save('my.xlsx')  # 保存

    3 读文件

    from openpyxl import load_workbook

    rb = load_workbook('my.xlsx', read_only=True, data_only=True) # read_only 只读 print(rb.sheetnames) rb1 = rb['index']

    # 单个数据读取
    print(rb1.cell(row=2, column=2).value)
    print(rb1['B1'].value)

    访问单元格

    # 通过切片
    >>> cell_range = ws['A1':'C2']
    # 通过行(列)
    >>> colC = ws['C']
    >>> col_range = ws['C:D']
    >>> row10 = ws[10]
    >>> row_range = ws[5:10]
    # 通过指定范围(行 → 行)
    >>> for row in  ws.iter_rows(min_row=1, max_col=3, max_row=2):
    ...    for cell in  row:
    ...        print(cell)
    <Cell Sheet1.A1>
    <Cell Sheet1.B1>
    <Cell Sheet1.C1>
    <Cell Sheet1.A2>
    <Cell Sheet1.B2>
    <Cell Sheet1.C2> 
    # 通过指定范围(列 → 列)
    >>> for row in  ws.iter_rows(min_row=1, max_col=3, max_row=2):
    ...    for cell in  row:
    ...        print(cell)
    <Cell Sheet1.A1>
    <Cell Sheet1.B1>
    <Cell Sheet1.C1>
    <Cell Sheet1.A2>
    <Cell Sheet1.B2>
    <Cell Sheet1.C2>
    # 遍历所有 方法一
    >>> ws = wb.active
    >>> ws['C9'] = 'hello world'
    >>> tuple(ws.rows)
    ((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
    (<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
    ...
    (<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
    (<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
    # 遍历所有 方法二
    >>> tuple(ws.columns)
    ((<Cell Sheet.A1>,
    <Cell Sheet.A2>,
    <Cell Sheet.A3>,
    ...
    <Cell Sheet.B7>,
    <Cell Sheet.B8>,
    <Cell Sheet.B9>),
    (<Cell Sheet.C1>,
    ...
    <Cell Sheet.C8>,
    <Cell Sheet.C9>))
     

    8. 保存数据

     wb.save('文件名称.xlsx')

    9. 其他

    ① 改变 sheet 标签按钮颜色

    ws.sheet_properties.tabColor = "1072BA"

    ② 获取最大行,最大列

    # 获得最大列和最大行
    print(sheet.max_row)
    print(sheet.max_column)

    ③ 获取每一行,每一列

    • sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。
    • sheet.columns类似,不过里面是每个tuple是每一列的单元格。
     
    # 因为按行,所以返回A1, B1, C1这样的顺序
    for row in sheet.rows:
        for cell in row:
            print(cell.value)
    
    # A1, A2, A3这样的顺序
    for column in sheet.columns:
        for cell in column:
            print(cell.value)
     

    ④ 根据数字得到字母,根据字母得到数字

     
    from openpyxl.utils import get_column_letter, column_index_from_string
    
    # 根据列的数字返回字母
    print(get_column_letter(2))  # B
    # 根据字母返回列的数字
    print(column_index_from_string('D'))  # 4
     

    ⑤ 删除工作表

    # 方式一
    wb.remove(sheet)
    # 方式二
    del wb[sheet]

     

    设置单元格风格

    ① 需要导入的类

    from openpyxl.styles import Font, colors, Alignment

    ② 字体

    • 下面的代码指定了等线24号加粗斜体,字体颜色红色。直接使用cell的font属性,将Font对象赋值给它。
    bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True)
    
    sheet['A1'].font = bold_itatic_24_font

    ③ 对齐方式

    • 也是直接使用cell的属性aligment,这里指定垂直居中和水平居中。除了center,还可以使用right、left等等参数
    # 设置B1中的数据垂直居中和水平居中
    sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

    ④ 设置行高和列宽

    # 第2行行高
    sheet.row_dimensions[2].height = 40
    # C列列宽
    sheet.column_dimensions['C'].width = 30

    ⑤ 合并和拆分单元格

    • 所谓合并单元格,即以合并区域的左上角的那个单元格为基准,覆盖其他单元格使之称为一个大的单元格。
    • 相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。
    # 合并单元格, 往左上角写入数据即可
    sheet.merge_cells('B1:G1') # 合并一行中的几个单元格
    sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格
    • 合并后只可以往左上角写入数据,也就是区间中:左边的坐标。
    • 如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。换句话说若合并前不是在左上角写入数据,合并后单元格中不会有数据。
    • 以下是拆分单元格的代码。拆分后,值回到A1位置
    sheet.unmerge_cells('A1:C3')

    举个例子

    import datetime
    from random import choice
    from time import time
    from openpyxl import load_workbook
    from openpyxl.utils import get_column_letter
    
    # 设置文件 mingc
    addr = "openpyxl.xlsx"
    # 打开文件
    wb = load_workbook(addr)
    # 创建一张新表
    ws = wb.create_sheet()
    # 第一行输入
    ws.append(['TIME', 'TITLE', 'A-Z'])
    
    # 输入内容(500行数据)
    for i in range(500):
        TIME = datetime.datetime.now().strftime("%H:%M:%S")
        TITLE = str(time())
        A_Z = get_column_letter(choice(range(1, 50)))
        ws.append([TIME, TITLE, A_Z])
    
    # 获取最大行
    row_max = ws.max_row
    # 获取最大列
    con_max = ws.max_column
    # 把上面写入内容打印在控制台
    for j in ws.rows:    # we.rows 获取每一行数据
        for n in j:
            print(n.value, end="	")   # n.value 获取单元格的值
        print()
    # 保存,save(必须要写文件名(绝对地址)默认 py 同级目录下,只支持 xlsx 格式)
    wb.save(addr)
    幻想毫无价值,计划渺如尘埃,目标不可能达到。这一切的一切毫无意义——除非我们付诸行动。
  • 相关阅读:
    HDU 1261 字串数(排列组合)
    Codeforces 488C Fight the Monster
    HDU 1237 简单计算器
    POJ 2240 Arbitrage
    POJ 3660 Cow Contest
    POJ 1052 MPI Maelstrom
    POJ 3259 Wormholes
    POJ 3268 Silver Cow Party
    Codesforces 485D Maximum Value
    POJ 2253 Frogger(最短路)
  • 原文地址:https://www.cnblogs.com/TodayWind/p/14018763.html
Copyright © 2011-2022 走看看