赞
踩
openpyxl模块是一个读写Excel 文档的Python库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档。
数据如下图所示:
示例代码:
- import openpyxl
-
- # 打开给定的文件名并返回 工作簿
- data = openpyxl.load_workbook('data/体检表.xlsx')
- print(type(data))
- print(data) # 返回一个 workbook 数据类型的值
运行结果:
示例代码:
- import openpyxl
-
- # 打开给定的文件名并返回 工作簿
- data = openpyxl.load_workbook('data/体检表.xlsx')
- print(type(data))
- print(data) # 返回一个 workbook 数据类型的值
-
- # 获取所有表的表名
- sheets_names = data.sheetnames
- print(sheets_names)
-
- # 获取活动表对应的表对象(表对象就是Worksheet类的对象)
- active_sheet = data.active
- print(active_sheet)
-
- # 根据表名获取工作簿中指定的表
- sheet2 = data['Sheet2']
- print(sheet2)
-
- # 根据表对象获取表的名字
- sheet_name1 = active_sheet.title
- sheet_name2 = sheet2.title
- print(sheet_name1, sheet_name2)
-
- # 获取第二列的所有内容
- sheet = data.active
- row_num = sheet.max_row # 获取当前表中最大的行数
- for row in range(1, row_num+1):
- cell = sheet.cell(row, 2)
- print(cell.value)
运行结果:
示例代码:
- import openpyxl
-
- # 打开给定的文件名并返回 工作簿
- data = openpyxl.load_workbook('data/体检表.xlsx')
- print(type(data))
- print(data) # 返回一个 workbook 数据类型的值
-
- # 获取活跃表对象
- sheet = data.active
-
- # 获取单元格对应的 Cell 对象
- a1 = sheet['A1'] # A1 表示A列中的第一行,这儿的列号采用的是从A开始的
- print(a1)
-
- # 获取单元格中的内容
- content = a1.value
- print(content)
-
- # 调用表的 cell()方法时,可以传入整数 作为 row 和 column 关键字参数,也可以得到一个单元格
- content2 = sheet.cell(2, 2).value
- print(content2)
-
- # 获取单元格的行和列信息
- row = a1.row
- print('行:', row)
-
- column = a1.column
- print('列:', column)
-
- coordinate = a1.coordinate
- print(coordinate)
- print("*" * 100)
-
- # 获取第二列的所有内容
- row_num = sheet.max_row # 获取当前表中最大的行数
- for row in range(1, row_num+1):
- cell = sheet.cell(row, 2)
- print(cell.value)
运行结果:
注意:在 Z 列之后,列开始使用两个字母:AA、AB、AC 等。作为替代,在调用表的 cell()方法时,可以传入整数 作为 row 和 column 关键字参数,也可以得到一个单元格。
注意:第一行或第一列的对应的整数 是 1,不是 0。
表对象也可以像列表或者字符串那样进行 切片 操作,来获取电子表格中一行、一列或一个 矩形区域 中的所有 Cell 对象,然后就可以对数据进行相应的操作。
示例代码:
- import openpyxl
- from openpyxl.utils import get_column_letter
-
- # 打开给定的文件名并返回 工作簿
- data = openpyxl.load_workbook('data/体检表.xlsx')
- # print(type(data))
- # print(data) # 返回一个 workbook 数据类型的值
-
- # 获取表对象
- sheet = data.active
-
- # 1.获取整个一行的单元格
- max_column = sheet.max_column # 获取最大列数
- column = get_column_letter(max_column) # 获取最大列数对应的字母列号
- # 获取第一行所有单元格对象
- row2 = sheet['A1':'%s1' % column] # ((<Cell '表1'.A1>, <Cell '表1'.B1>, <Cell '表1'.C1>),)
- print(row2)
-
- for row_cells in row2:
- for cell in row_cells:
- print(cell.coordinate, cell.value)
-
- print("*" * 100)
-
- # 2.获取整个列的单元格
- max_row = sheet.max_row
- columnB = sheet['B1':'B%d' % max_row]
-
- # 获取B列对应的所有单元格对象
- for column_cells in columnB:
- for cell in column_cells:
- print(cell.coordinate, cell.value)
-
- print("*" * 100)
-
- # 3. 获取矩形区域中的单元格对象
- cell_tuples = sheet['A1': 'C3']
- print(cell_tuples)
- for cells in cell_tuples:
- for cell in cells:
- print(cell.coordinate, cell.value)
运行结果:
示例代码:
- import openpyxl
-
- # 创建空的Workbook对象
- w_data = openpyxl.Workbook()
-
- # 获取所有表名
- print(w_data.sheetnames) # ['Sheet']
- # 可知默认情况下,新建的Workbook对象对应的Excel 文件中只有一张名字是 'Sheet' 的表
-
- # 获取活动表
- sheet_active = w_data.active
-
- # 修改表的名字
- sheet_active.title = 'first_table'
-
- # 保存至文件
- w_data.save(filename='data/info.xlsx')
-
- # 新建表
- w_data.create_sheet()
- w_data.create_sheet()
- # for i in range(20):
- # wb.create_sheet()
- print(w_data.sheetnames) # ['first_table', 'Sheet', 'Sheet1']
- # 新建表时,从Sheet开始一直到Sheet n
-
- w_data.create_sheet('second_table')
-
- # `工作簿对象.create_sheet(title, index)` - 在指定工作簿中的指定位置(默认是最后)创建指定名字的表,并且返回表对象
- w_data.create_sheet('third_table', 1)
-
- print(w_data.sheetnames) # ['first_table', 'third_table', 'Sheet', 'Sheet1', 'second_table']
-
- # 删除表
- w_data.remove(w_data['Sheet1'])
- w_data.save(filename='data/info.xlsx')
-
- # 写入数据
- w_data = openpyxl.load_workbook('data/info.xlsx')
- sheet = w_data['first_table'] # 获取表
-
- sheet['A1'] = '姓名'
- sheet['B1'] = '年龄'
- sheet['C1'] = '性别'
-
- sheet['A2'] = '张三'
- sheet['B2'] = 25
- sheet['C2'] = '男'
-
- w_data.save('data/info.xlsx')
运行结果:
示例代码:
- # 利用requests获取天行数据中疫情数据,并且将获取到的数据使用excel文件保存到表中。
- import requests
- import openpyxl
- from openpyxl.utils import get_column_letter
-
- # 1.获取数据
- url = 'http://api.tianapi.com/txapi/ncovabroad/index?key=c9d408fefd8ed4081a9079d0d6165d43'
- rep = requests.get(url)
- news_list = rep.json()['newslist']
-
- # 2.设置表头信息
- headers = {'continents': ('洲', 'A'),
- 'provinceName': ('国家', 'B'),
- 'currentConfirmedCount': ('现有确诊', 'C'),
- 'confirmedCount': ('累计确诊', 'D'),
- 'curedCount': ('治愈', 'E'),
- 'deadCount': ('死亡', 'F')}
-
- # 3.创建工作表
- wb = openpyxl.Workbook()
- sheet = wb.active
-
- # 4.写入数据
- # 先写入第一行的表头
- column_num = 1
- for key in headers:
- column = get_column_letter(column_num)
- location = f'{column}1'
- sheet[location] = headers[key][0]
- column_num += 1
-
- # 再从第二行开始写入爬取到的数据
- row = 2
- for news in news_list: # 遍历每条数据项,一个数据项对应一个字典
- for key in news: # 遍历数据键值
- if key in headers: # 保证键是表头中的某一项我们需要的数据
- location = f'{headers[key][1]}{row}' # 存在表中的位置
- value = news[key] # 需要的数据
- sheet[location] = value # 写入
- row += 1
-
- wb.save(filename='data/epidemic.xlsx')
运行结果:
示例代码:
- import openpyxl
- from openpyxl.styles import Font, PatternFill, Border, Side, Alignment # 字体、填充图案、边框、侧边、对齐方式
-
- # 1.打开工作簿
- data = openpyxl.load_workbook('data/体检表.xlsx')
- sheet = data.active
-
- # 2.设置单元格字体样式
- """
- Font(
- name=None, # 字体名,可以用字体名字的字符串
- strike=None, # 删除线,True/False
- color=None, # 文字颜色
- size=None, # 字号
- bold=None, # 加粗, True/False
- italic=None, # 倾斜,Tue/False
- underline=None # 下划线, 'single', 'singleAccounting', 'double','doubleAccounting'
- )
- """
- # 创建字体对象,并调整合适的参数
- font1 = Font(
- name='微软雅黑',
- size=15,
- italic=False,
- color='ff0000',
- bold=False,
- strike=False,
- underline='single',
- )
-
- # 设置指定单元格的字体
- # 单元格对象.font = 字体对象
- area = sheet['A1':'E1']
- for row in area:
- for _ in row:
- _.font = font1 # 调整字体
-
- # 3.设置单元格填充样式
- """
- PatternFill(
- fill_type=None, # 设置填充样式: 'darkGrid', 'darkTrellis', 'darkHorizontal', 'darkGray', 'lightDown', 'lightGray', 'solid', 'lightGrid', 'gray125', 'lightHorizontal', 'lightTrellis', 'darkDown', 'mediumGray', 'gray0625', 'darkUp', 'darkVertical', 'lightVertical', 'lightUp'
- # '深色网格“,”深色网格“,”深色水平“,”深色灰色“,”浅色向下“,”浅灰色“,”纯色“,”浅色网格“,”灰色125“,”浅色水平“,”浅色网格“,”深色向下“,”中灰色“,”灰色0625“,”深色向上“,”深色垂直“,”浅色垂直“,”浅色向上“
- start_color=None# 设置填充颜色
- )
- """
-
- # 设置填充对象
- fill = PatternFill(fill_type='solid', start_color='FFC0CB')
-
- # 设置单元格的填充样式
- # 单元格对象.fill = 填充对象
- area = sheet['A1':'E1']
- for row in area:
- for _ in row:
- _.fill = fill # 调整填充格式
-
- # 4. 设置单元格对齐样式
- # 创建对象
- al = Alignment(
- horizontal='right', # 水平方向:center, left, right
- vertical='top', # 垂直方向: center, top, bottom
- )
- # 设置单元格的对齐方式
- sheet['B2'].alignment = al
-
- # 5. 设置边框样式
- # 设置边对象(四个边的边可以是一样的也可以不同,如果不同就创建对个Side对象)
- # border_style取值('dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin')
- # 单点划线,双点划线,点划线,双划线,头发,中划线,单点中划线,双点中划线,中划线,斜划线,粗划线,细划线
- side = Side(border_style='thin', color='000000')
-
- # 设置边框对象
- # left、right、top、bottom表示的是边框的四个边,四个边可以使用一个边对象
- bd = Border(left=side, right=side, top=side, bottom=side)
- # 设置单元格的边框
- area = sheet['A1':'E1']
- for row in area:
- for _ in row:
- _.border = bd
-
- # 6.设置单元格的宽度和高度
- # 设置列宽
- sheet.column_dimensions['A'].width = 10
- # 设置行高
- sheet.row_dimensions[1].height = 30
-
- # 7. 保存
- data.save(filename='data/体检表2.xlsx')
运行结果:
示例代码:
- import openpyxl
- import datetime
-
- datas = [
- ('学号', '姓名', '年龄', '专业', '考试时间'),
- ('B00001', '张1', 18, '语文', datetime.datetime(2019, 6, 18, 0, 0)),
- ('B00002', '张2', 19, '数学', datetime.datetime(2019, 6, 19, 0, 0)),
- ('B00003', '张3', 20, '英语', datetime.datetime(2019, 6, 20, 0, 0)),
- ('B00004', '张4', 21, '物理', datetime.datetime(2019, 6, 21, 0, 0)),
- ('B00005', '张5', 22, '化学', datetime.datetime(2019, 6, 22, 0, 0)),
- ('B00006', '张6', 23, '生物', datetime.datetime(2019, 6, 23, 0, 0)),
- ('B00007', '张7', 24, '历史', datetime.datetime(2019, 6, 24, 0, 0))
- ]
-
- # 创建空的Workbook对象
- w_data = openpyxl.Workbook()
-
- # 获取活动表
- sheet = w_data.active
-
- for i in range(1, len(datas) + 1):
- for j in range(1, 6):
- sheet.cell(row=i, column=j, value=datas[i - 1][j - 1])
-
- w_data.save('data/info.xlsx')
运行结果:
示例代码:
- import openpyxl
- import datetime
-
- datas = [
- ('B00001', '张1', 18, '语文', datetime.datetime(2019, 6, 18, 0, 0)),
- ('B00002', '张2', 19, '数学', datetime.datetime(2019, 6, 19, 0, 0)),
- ('B00003', '张3', 20, '英语', datetime.datetime(2019, 6, 20, 0, 0)),
- ('B00004', '张4', 21, '物理', datetime.datetime(2019, 6, 21, 0, 0)),
- ('B00005', '张5', 22, '化学', datetime.datetime(2019, 6, 22, 0, 0)),
- ('B00006', '张6', 23, '生物', datetime.datetime(2019, 6, 23, 0, 0)),
- ('B00007', '张7', 24, '历史', datetime.datetime(2019, 6, 24, 0, 0))
- ]
-
- # 创建空的Workbook对象
- w_data = openpyxl.Workbook()
-
- # 创建 sheet 对象
- sheet1 = w_data.active
- sheet1.title = 'Sheet1'
- sheet2 = w_data.create_sheet("Sheet2")
- sheet3 = w_data.create_sheet("Sheet3")
-
- # 添加标题行
- headers = ['学号', '姓名', '年龄', '专业', '考试时间']
- sheet1.append(headers)
- sheet2.append(headers)
- sheet3.append(headers)
- # 注意:添加了标题行,下面写入数据时,sheet.cell中的row要往下移动一行,否则会覆盖掉标题行
-
- # 将数据写入sheet1
- for i in range(1, len(datas) + 1):
- for j in range(1, 6):
- sheet1.cell(row=i + 1, column=j, value=datas[i - 1][j - 1])
-
- # 将数据写入sheet2
- for i in range(1, len(datas) + 1):
- for j in range(1, 6):
- sheet2.cell(row=i + 1, column=j, value=datas[i - 1][j - 1])
-
- # 将数据写入sheet3
- for i in range(1, len(datas) + 1):
- for j in range(1, 6):
- sheet3.cell(row=i + 1, column=j, value=datas[i - 1][j - 1])
-
- w_data.save('data/info.xlsx')
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。