zoukankan      html  css  js  c++  java
  • Python操作Excel

    Python操作Excel

    需要安装第三方模块,这里选用openpyxl(适用于最新的xlsx格式)

    pip install openpyxl

    读Excel

    1.sheet相关操作

    from openpyxl import load_workbook
    wb = load_workbook("pdata.xlsx")
    
    # 1.获取所有sheet名称
    print(wb.sheetnames)
    
    # 2.选择sheet,基于名称
    sheet = wb["Sheet1"]
    cell = sheet.cell(2,1) # 获取指定单元格 (行,列)
    print(cell.value) # 获取指定单元格的值
    
    # 3.选择sheet,基于索引
    sheet = wb.worksheets[0]
    cell = sheet.cell(2,1) # 获取指定单元格 
    print(cell.value) # 获取指定单元格的值
    

    2.单元格操作

    from openpyxl import load_workbook
    wb = load_workbook("pdata.xlsx")
    sheet = wb.worksheets[0]
    
    # 1.获取某个单元格
    # cell = sheet.cell(2,1) # 获取指定单元格,方式一
    cell = sheet['A2']       # 获取指定单元格,方式一
    print(cell.value) # 取内容
    print(cell.style) # 样式
    print(cell.alignment) # 对齐方式
    
    # 2.获取第N行所有单元格数据
    for cell in sheet[1]:
        print(cell.value)
        
    # 3.获取所有行(某一列)的单元格数据
    for row in sheet.rows:
        print(row[0].value,row[1].value)
        
    # 4.获取所有列(某一行)的单元格数据
    for col in sheet.columns:
        print(col[0].value,col[1].value)
    # 5.有合并单元格,值为左上角,其他为None
    

    写Excel

    1.原文件基础上写

    from openpyxl import load_workbook
    
    wb = load_workbook("pdata.xlsx")
    
    sheet = wb.worksheets[0]
    cell = sheet.cell(2,1)
    cell.value = '新接口'  # 直接赋予新值
    wb.save("pdata.xlsx")  # 保存时文件需要关闭状态
    
    

    2.新建文件写

    from openpyxl import workbook
    
    wb = workbook.Workbook()  # 创建excel默认会创建一个sheet
    
    sheet = wb.worksheets[0]
    cell = sheet.cell(2,1)
    cell.value = '新接口'  # 直接赋予值
    wb.save("pdata1.xlsx")  # 保存时文件需要关闭状态
    
    

    3.操作sheet

    # 修改sheet名称
    sheet = wb.worksheets[0]
    sheet.title = '个人计划'
    wb.save("pdata1.xlsx")
    
    # 新建sheet并设置颜色
    sheet = wb.create_sheet("新计划",0)
    sheet.sheet_properties.tabColor = '3c7d0d'
    wb.save("pdata1.xlsx")
    
    # 默认打开sheet
    wb.active = 0
    wb.save("pdata1.xlsx")
    
    # 拷贝sheet
    new_sheet = wb.copy_worksheet(wb["个人计划"])
    wb.save("pdata1.xlsx")
    
    # 删除sheet
    del wb["个人计划"]
    wb.save("pdata1.xlsx")
    

    4.写单元格操作

    from openpyxl import workbook
    
    wb = workbook.Workbook()  # 创建excel默认会创建一个sheet
    sheet = wb.worksheets[0]
    
    # 修改某一单元格
    cell = sheet.cell(2,1)
    cell.value = '开始'  # 直接赋予值 或者sheet["A1"] = '开始'
    
    # 修改某些单元格
    cell_list = sheet['B3':'C4']
    for row in cell_list:
        for cell in row:
            cell.value = '填充'
    wb.save("pdata2.xlsx") 
    
    # 插入行列
    sheet.insert_rows(idx=5,amount=10)
    sheet.insert_cols(idx=3,amount=2)
    wb.save("pdata2.xlsx") 
    
    # 写入公式
    sheet = wb.workbooks[0]
    sheet["D3"] = "=sum(B3,C3)" # 或者 sheet["D3"] = "=B3+C3"
    wb.save("pdata2.xlsx") 
    

    设置单元格风格

    openpyxl的单元格样式由6种属性决定,每一种都是一个类

    • font(字体类):字号、字体颜色、下划线等
    • fill(填充类):颜色等
    • border(边框类):设置单元格边框
    • alignment(位置类):对齐方式
    • number_format(格式类):数据格式
    • protection(保护类):写保护

    需要导入的类

    from openpyxl.styles import Font, colors, Alignment, Border, PatternFill

    字体

    微软雅黑24号,加粗斜体,字体颜色红色

    font = Font(name='微软雅黑', size=24, italic=True, color=colors.RED, bold=True) sheet['A1'].font = font

    背景颜色

    sheet['A1'].fill = PatternFill('solid',fgColor='b6eafb')

    对齐方式

    cell的属性aligment,这里指定垂直居中和水平居中。除了center,还可以使用right、left等等参数。

    设置A1中的数据垂直居中和水平居中

    sheet['A1'].alignment = Alignment(horizontal='center', vertical='center')

    设置边框

    side = Side(style='thin',color='000000') # 边框样式与颜色

    border = Border(top=side,bottom=side,left=side,right=side)

    sheet['A1'].border = border

    设置行高和列宽

    设置第1行行高

    sheet.row_dimensions[1].height = 20

    设置A列列宽

    sheet.column_dimensions['A'].width = 25

    合并和拆分单元格

    以合并区域的左上角的那个单元格为基准,覆盖其他单元格为一个单元格。
    相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。

    合并单元格, 保留左上角数据,其余值丢弃

    sheet.merge_cells('B1:G1') # 合并一行中的几个单元格

    sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格

    合并后只可以往左上角写入数据,也就是区间中:左边的坐标。

    拆分单元格的代码,拆分后,左上角保留原值。

    sheet.unmerge_cells('A1:C3')

    综合实例

    • 读取.ini文件配置信息,并整理写入Excel(此处使用了MySQL的配置文件)
    import os
    import configparser
    from openpyxl import workbook
    from openpyxl.styles import Font, Alignment, Border, PatternFill,Side
    
    # 文件路径处理
    base_dir = os.path.dirname(os.path.abspath('my.ini'))
    file_path = os.path.join(base_dir,'my.ini')
    out_file_path = os.path.join(base_dir,'my.xlsx')
    
    wb = workbook.Workbook()
    del wb['Sheet']
    
    # 解析ini格式文件
    config = configparser.ConfigParser()
    config.read(file_path,encoding='utf-8')
    
    # 循环获取节点
    for section in config.sections():
        sheet = wb.create_sheet(section)
        
        # 边框和居中
        side = Side(style='thin',color='000000')
        border = Border(top=side,bottom=side,left=side,right=side)
        align = Alignment(horizontal='center',vertical='center')
        sheet.column_dimensions['A'].width = 30
        sheet.column_dimensions['B'].width = 30
        
        # 表头
        title_dict = {"A1":"键","B1":"值"}
        for position,text in title_dict.items():
            cell = sheet[position]
            # 设置值
            cell.value = text
            # 设置居中
            cell.alignment = align
            # 设置背景色
            cell.fill = PatternFill('solid',fgColor='b6eafb')
            # 设置字体颜色
            cell.font = Font(name='微软雅黑',color="FFFFFF")
            # 设置边框
            cell.border = border
        row_index = 2
        # 读取此节点下所有键值对,并写入sheet
        for group in config.items(section):     # ('port', '3306')
            print(group)
            for col,text in enumerate(group,1):
                cell = sheet.cell(row_index,col)
                # 设置值
                cell.value = text
                # 设置居中
                cell.alignment = align
                # 设置边框
                cell.border = border
            row_index+=1
    
    wb.save(out_file_path)
    
    ('port', '3306')
    ('default-character-set', 'utf8')
    ('port', '3306')
    ('basedir', 'E:/MySQL/MySQL Server 5.7/')
    ('datadir', 'D:/MySQL/MySQL Server 5.7/Data')
    ('character-set-server', 'utf8')
    ('default-storage-engine', 'INNODB')
    ('sql-mode', '"STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
    ('general-log', '0')
    ('general_log_file', '"ZHAN.log"')
    ('slow_query_log_file', '"ZHAN-slow.log"')
    ('long_query_time', '10')
    ('log-error', '"ZHAN.err"')
    ('relay_log', '"ZHAN-relay"')
    ('server-id', '1')
    ('report_port', '3306')
    ('lower_case_table_names', '1')
    ('secure-file-priv', '"D:/MySQL/MySQL Server 5.7/Uploads"')
    ('myisam_max_sort_file_size', '100G')
    ('sync_relay_log', '10000')
    ('sync_relay_log_info', '10000')
    ('自定义参数', '自定义值')
    
  • 相关阅读:
    exynos4412—CMU裸板复习
    有道云笔记markdown插入图片
    win10自带输入法提交所有中文输入的问题
    【wp】i春秋百度杯CTF比赛2016年12月场writeup
    【wp】百度杯2017年春秋欢乐赛
    【python】为markdown自动生成目录
    【C】MSP432P401R手动实现呼吸灯斗艳
    【python】django实现扫码签到
    【python】观影时定时自动截图
    程序片段
  • 原文地址:https://www.cnblogs.com/tianming66/p/14264736.html
Copyright © 2011-2022 走看看