openpyxl操作excel表格

python 读写 excel 有好多选择, xlrd/xlwt、openpyxl。

之所以推荐两个库是因为这两个库分别操作的是不同版本的 excel,xlrd 操作的是 xls/xlxs 格式的 excel,
而 openpyxl 只支持 xlxs 格式的excel,openpyxl 使用起来会更方便一些,所以如果你只操作 xlxs 文件的话,
那么可以优先选择 openpyxl,如果要兼容 xls 的话,那就用 xlrd/xlwt 吧。 本处使用openpyxl来实现
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.chart import (PieChart , ProjectedPieChart, Reference)
from openpyxl.chart.series import DataPoint

data = [
    ['Pie', 'Sold'],
    ['Apple', 50],
    ['Cherry', 30],
    ['Pumpkin', 10],
    ['Chocolate', 40],
]

wb = Workbook()
ws = wb.active

for row in data:
    ws.append(row)

pie = PieChart()
labels = Reference(ws, min_col=1, min_row=2, max_row=5)
data = Reference(ws, min_col=2, min_row=1, max_row=5)
pie.add_data(data, titles_from_data=True)
pie.set_categories(labels)
pie.title = "Pies sold by category"

# Cut the first slice out of the pie
slice = DataPoint(idx=0, explosion=20)
pie.series[0].data_points = [slice]

ws.add_chart(pie, "D1")

ws = wb.create_sheet(title="Projection")

data = [
    ['Page', 'Views'],
    ['Search', 95],
    ['Products', 4],
    ['Offers', 0.5],
    ['Sales', 0.5],
]

for row in data:
    ws.append(row)

projected_pie = ProjectedPieChart()
projected_pie.type = "pie"
projected_pie.splitType = "val" # split by value
labels = Reference(ws, min_col=1, min_row=2, max_row=5)
data = Reference(ws, min_col=2, min_row=1, max_row=5)
projected_pie.add_data(data, titles_from_data=True)
projected_pie.set_categories(labels)

ws.add_chart(projected_pie, "A10")

from copy import deepcopy
projected_bar = deepcopy(projected_pie)
projected_bar.type = "bar"
projected_bar.splitType = 'pos' # split by position

ws.add_chart(projected_bar, "A27")

# Save the file
wb.save("./sample.xlsx")
饼图
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference, Series

wb = load_workbook('./sample.xlsx')
ws1=wb.active

wb = Workbook()
ws = wb.active
for i in range(10):
    ws.append([i])

values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10)
chart = BarChart()
chart.add_data(values)
ws.add_chart(chart, "E15")

# Save the file
wb.save("./sample1.xlsx")
柱状图

 

读取

from openpyxl import load_workbook

wb = load_workbook('balances.xlsx', read_only=False, data_only=True)
# 控制带有公式的单元格是否具有公式(默认值)   Excel上次读取工作表时存储的值

print(wb.sheetnames)  # ['New Title', 'Sheet', 'Mysheet']
wb1 = wb['New Title']
# ws = wb.active     #获取第一个sheet
# wb.get_sheet_by_name("New Title"  )

# wb1.guess_types = False
# wb1["D1"]="12%"
# wb1.guess_types = True    print ws["D1"].value会打印百分数b
# wb1.guess_types = False   print ws["D1"].value会打印小数

print(wb1['B4'].value)
print(wb1.cell(row=4, column=2).value)

print(wb1.max_row)  # 最大行数
print(wb1.max_column)  # 最大列数

# ######################## 获取行和列 ####################################
# 因为按行,所以返回A1, B1, C1这样的顺序
for row in wb1.rows:
    for cell in row:
        print(cell.value)

# A1, A2, A3这样的顺序
# for column in wb1.columns:    # read_only=False
#     for cell in column:
#         print(cell.value)

for row_cell in wb1['A1':'B3']:
    for cell in row_cell:
        print(cell.value)

# ######################## 设置字体 ####################################
from openpyxl.styles import Font, colors

bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True, underline="single")
wb1['A1'].font = bold_itatic_24_font
wb1['A1'] = 'SX'

# ######################## 对齐方式 ####################################
from openpyxl.styles import Alignment

for row_cell in wb1['B2':'G10']:
    for cell in row_cell:
        cell.alignment = Alignment(horizontal='center', vertical='center')  # right,left

# ######################## 设置行高和列宽 ####################################
# 有时候数据太长显示不完,就需要拉长拉高单元格
# 第2行行高
wb1.row_dimensions[2].height = 40
# C列列宽
wb1.column_dimensions['C'].width = 30

# ######################## 合并和拆分单元格 ####################################
wb1.merge_cells('B1:G1')  # 合并一行中的几个单元格
"""
合并后只需要往第一个表格写数据
如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。
换句话说若合并前不是在左上角写入数据,合并后单元格中不会有数据。
"""
# wb1.unmerge_cells('A1:C3')


# ############# 设定单元格的边框、字体、颜色、大小和边框背景色 ###############
from openpyxl.styles import NamedStyle, Font, Border, Side, PatternFill

highlight = NamedStyle(name="highlight")
highlight.font = Font(name='微软雅黑', size=11, bold=False, italic=False, vertAlign=None, underline='none', strike=False,
                      color='FF000000')
highlight.fill = PatternFill("solid", fgColor="DDDDDD")  # 背景填充
bd = Side(style='thick', color="000000")
highlight.border = Border(left=bd, top=bd, right=bd, bottom=bd)

print(dir(wb1["A1"]))
wb1["A1"].style = highlight
# ############# 常用的样式和属性设置 ###############


from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font

fill = PatternFill(fill_type="solid", start_color='FFEEFFFF', end_color='FF001100')

# 边框可以选择的值为:'hair', 'medium', 'dashDot', 'dotted', 'mediumDashDot', 'dashed', 'mediumDashed', 'mediumDashDotDot', 'dashDotDot', 'slantDashDot', 'double', 'thick', 'thin']
# diagonal 表示对角线
bd = Border(left=Side(border_style="thin", color='FF001000'),
            right=Side(border_style="thin", color='FF110000'),
            top=Side(border_style="thin", color='FF110000'),
            bottom=Side(border_style="thin", color='FF110000'),
            diagonal=Side(border_style=None, color='FF000000'),
            diagonal_direction=0, outline=Side(border_style=None, color='FF000000'),
            vertical=Side(border_style=None, color='FF000000'),
            horizontal=Side(border_style=None, color='FF110000'))

alignment = Alignment(horizontal='general', vertical='bottom', text_rotation=0, wrap_text=False, shrink_to_fit=False,
                      indent=0)
number_format = 'General'
protection = Protection(locked=True, hidden=False)

wb1["B5"].fill = fill
wb1["B5"].border = bd
wb1["B5"].alignment = alignment
wb1["B5"].number_format = number_format

wb.save('balances.xlsx')

 写

from openpyxl import Workbook

wb = Workbook()  # 默认有一个Sheet工作薄

# 创作一个新的工作薄
ws1 = wb.create_sheet('Mysheet')  # 在最后添加
ws2 = wb.create_sheet('Mysheeta', 0)  # 在第一个添加
ws2.sheet_properties.tabColor = "1072BA"  # 设定sheet的标签的背景颜色

target = wb.copy_worksheet(ws2)

# 修改工作薄的名称
ws2.title = "New Title"

# 查看工作薄的名称列表        ['New Title', 'Sheet', 'Mysheet']
print(wb.sheetnames)

# 写数据
ws2["A4"] = 4
ws2.cell(row=4, column=2, value=10)  # 按单元格来区分,从1开始

l = [1, 2, 3, 4, '', 6]
ws2.append(l)  # 在最下边,添加了一行
from openpyxl.drawing.image import Image

img = Image('e:\\1.png')
ws1.add_image(img, 'A1')

ws1.column_dimensions.group('A', 'D', hidden=True)  # 隐藏a到d列范围内的列

# Excel内置函数
"""
ws2['G5'] = '=SUM(A5:F5)'       #  一片区域:=SUM(A6:F10)
"""
# 保存
wb.save('balances.xlsx')

  

 

posted @ 2019-04-04 11:49  慕沁  阅读(1222)  评论(0)    收藏  举报