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

    python 读写 excel有很多选择,但是,方便操作的库不多,在我尝试了几个库之后,我觉得两个比较方便的库是xlrd/xlwt、openpyxl。

    之所以推荐这两个库是因为这两个库分别操作的是不同版本的excel,xlrd操作的是xls/xlxs格式的excel,openpyxl只支持xlxs格式的excel,openpyxl使用起来更方便一些。

    安装

    pip install openpyxl

    如果excel里面有图片(jpeg,png,bmp,......)需要安装图片处理模块

    pip install pillow

    excel写

    from openpyxl import Workbook
    wb = Workbook()

    创建一个新的工作簿

    ws1 = wb.create_sheet("Mysheet")        #默认最后一个
    ws1.sheet_properties.tabColor="0000FF" #修改工作表标签颜色 ws2
    = wb.create_sheet("Mysheet", 0) #第一个
    ws3 = wb.get_sheet_by_name('Sheet')
    ws3.title = "Test"

    拷贝模板做新表

    ws3 = wb.copy_worksheet(wb['Sheet1'])

    保存

    wb.save('balances.xlsx')

    修改工作簿的名称

    ws.title = "New Title"

    获取所有工作簿名称

    print(wb.sheetnames)

    获取其中一个工作簿名称

    for sheet in wb:
        print(sheet)
    wb["New Title"]  #直接获取名称为New Title的工作薄

    删除工作表 

    wb.remove_sheet(wb.get_sheet_by_name(“中文表名”))
    wb.remove_sheet(ws2)  

    excel写数据

    ws['A4']=4 #这将返回A4处的单元格,如果尚不存在,则创建一个单元格。值可以直接分配
    ws.cell(row=4, column=2, value=10) # 也可以通过cell来进行写入,通过行数和列数来找到单元格所在的位置,通过value来赋值
    ws.cell(row=3, column=2).value = "AAAAA"

    excel读

    from openpyxl import load_workbook  #导入模块
    wb = load_workbook(filename = 'balances.xlsx') #打开文件,默认可读写,若有需要可以指定write_only和read_only为True
    sheet = wb['test2'] #找到工作表
    print(sheet['B4'].value) #输出内容
    # B9处写入平均值
    sheet['B9'] = '=AVERAGE(B2:B8)'
    附上load_workbook()6个参数:
    
     - filename: string类型,文件路径 或路径对象
    
     - read_only:布尔型,超大型文件,为节省内存,建议开启此参数
    
     - keep_vba :布尔型,True则保留vba代码  
    
     - guess_types:布尔型, 读取单元格数据类型时,启用或禁用类型推断
    
     - data_only:布尔型,True则包含公式的单元格,显示最近计算结果 
    
     - keep_links:布尔型,True保留外部链接

    但是如果是读取的时候需要加上data_only-True这样读到的B9返回的就是数字,如果不加这个参数,返回的是公式本身‘-AVERRAGE(B2:B8)'

    append函数

    可以一次添加多行数据,从第一行空白开始写入(下面都是空白行)

    
    

    import openpyxl
    wb = openpyxl.Workbook()
    ws1 = wb.get_sheet_by_name('Sheet')
    ws1.title = "Test"
    DATA = [
    ['第一天', 123, 12, 123, 900, 231, 7],
    ['第二天', 13, 56, 3, 900, 231, 90],
    ['第三天', 216, 38, 37, 543, 55, 376],
    ['第四天', 89, 99, 88, 453, 87, 527]
    ]
    for row in DATA:
    ws1.append(row)

    获得最大行和最大列

    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)

    上面的代码就可以获得所有所有单元格的数据。如果要获得某行的数据呢?给其一个索引就行了,因为sheet.rows是生成器类型,不能使用索引,转换成list后在使用,list(sheet.rows)[2]这样就获得第三行的tuplle对象。

    for cell in list(sheet.rows)[2]:
        print(cell.value)

    如何获得任意区间的单元格?

    可以使用range函数,下面的写法,获得了以A1为左上角,B3为右下角矩形区域的所有单元格,注意range是从1开始的,因为在openpyxl中为了和excel中的表达方式一致并不和编程语言的习惯以0表示第一个值。

    还可以像使用切片那样使用。sheet['A1':B3']返回一个tuple,该元组内部还是元组,由每行的单元格构成。

    for row_cell in sheet_ranges['A1':'B3']:
        for cell in row_cell:
            print(cell)

    设置单元格风格--Style

    先导入需要的类

    from openpyxl.styles import Font, colors, Alignment

    分别可指定字体相关,颜色,对齐方式。

    字体

    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 openpyxl
    wb = openpyxl.Workbook()
    #ws1 = wb.active
    ws1 = wb.get_sheet_by_name('Sheet')
    ws1.title = "Test"
    ws2 = wb.create_sheet("ABC")
    wb.create_sheet(u"中文表名")
    ws1.sheet_properties.tabColor="0000FF"
    ws2.sheet_properties.tabColor="FF00FF"
    ws1['A1'] = "hehehe"
    ws1['B2'] = "hahaha"
    wb.save("test.xlsx")

     

    遍历方式向多个单元格中写入值:

    import openpyxl
    wb = openpyxl.Workbook()
    ws1 = wb.get_sheet_by_name('Sheet')
    ws1.title = "Test"
    i = 0
    # 遍历方式1:
    ws1['A1'] = "遍历方式1"
    print("遍历方式1")
    j = 1
    for col in ws1.iter_cols(min_row=2, min_col=2, max_row=7, max_col=6):
        print("Cols No." + str(j) + ":  ", end="")
        print(col)
        j = j + 1
        for cell in col:
            cell.value = i
            i = i + 1
    ws2 = wb.create_sheet("Test2")
    i = 0
    # 遍历方式2:
    ws2['A1'] = "遍历方式2"
    print("遍历方式2")
    j = 1
    for row in ws2["B2:F7"]:
        print("Row No." + str(j) + ":  ", end="")
        print(row)
        j = j + 1
        for cell in row:
            cell.value = i
            i = i + 1
    wb.save("test.xlsx")

    #操作单列
    print ws1["A"]
    for cell in ws1["A"]:
        print cell.value
    
    #操作多列,获取每一个值
    print ws1["A:C"]
    for column in ws1["A:C"]:
        for cell in column:
            print cell.value
    
    #操作多行
    row_range = ws1[1:3]
    print row_range
    for row in row_range:
        for cell in row:
            print cell.value
    
    print "*"*50
    for row in ws1.iter_rows(min_row=1, min_col=1, max_col=3, max_row=3):
        for cell in row:
            print cell.value
    
    #获取所有行
    print ws1.rows
    for row in ws1.rows:
        print row
    
    print "*"*50
    #获取所有列
    print ws1.columns
    for col in ws1.columns:
        print col
    
    wb.save("e:\sample.xlsx")

    使用公式

    import openpyxl
    wb = openpyxl.Workbook()
    ws1 = wb.get_sheet_by_name('Sheet')
    ws1.title = "Test"
    DATA = [
        ['第一天', 123, 12, 123, 900, 231, 7],
        ['第二天', 13, 56, 3, 900, 231, 90],
        ['第三天', 216, 38, 37, 543, 55, 376],
        ['第四天', 89, 99, 88, 453, 87, 527]
    ]
    ws1['A1'] = '这是一个测试用表格'
    for row in DATA:
        ws1.append(row)
    ws1.append(['合计', '=sum(B2:B5)', '=sum(C2:C5)', '=sum(D2:D5)', '=sum(E2:E5)', '=sum(F2:F5)', '=sum(G2:G5)'])
    wb.save("test.xlsx")

    单元格样式设置

    from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
    
    PatternFill 填充
    Font 字体
    Aignment 对齐
    Border 边框
    Side 边线

    font = Font(size=14, bold=True, name='微软雅黑', color="FF0000") # 字体
    alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)

    thin = Side(border_style="thin", color="0000FF") # 边框
    border = Border(left=thin, right=thin, top=thin, bottom=thin)
    ws1['A1'].alignment = alignment # 对齐方式
    ws1['A1'].font = font # 可以一个单元格设置
    for row in ws1['A2:G6']: # 可以指定区域设置
      for cell in row:
        cell.border = border

    # 填充单元格样式
    fill = PatternFill(patternType="solid", start_color="33CCFF")
    ws1['A1'].fill = fill
    for row in ws1.iter_rows(min_row=ws1.max_row, max_col=ws1.max_column):
      for cell in row:
        cell.fill = PatternFill(patternType="solid", start_color="0066FF")
        cell.font = Font(bold=True, color="FFFFFF")
        cell.alignment = Alignment(horizontal="center")
    wb.save("test.xlsx")

    工作表的标签颜色修改

  • 相关阅读:
    LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)
    精帖转载(关于stock problem)
    LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)
    LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
    LeetCode 120. Triangle
    基于docker 搭建Elasticsearch5.6.4 分布式集群
    从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
    Harbor实现容器镜像仓库的管理和运维
    docker中制作自己的JDK+tomcat镜像
    docker镜像制作---jdk7+tomcat7基础镜像
  • 原文地址:https://www.cnblogs.com/feifeifeisir/p/10419262.html
Copyright © 2011-2022 走看看