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')

浙公网安备 33010602011771号