第13章:处理Excel电子表格(笔记)

article/2025/11/9 11:35:13

13.1:Excel文档

13.2:安装openpyxl模块

pip install --user --Uopenpuxl==2.6.2

 这是安装2.6.2版本的,比较新的版本与学习的书籍的信息有一点不兼容

13.3:读取Excel文档

13.3.1:用openpyxl模块打开Excel文档

import openpyxlwb = openpyxl.load_workbook("example.xlsx")
type(wb)
load_workbook()函数接收文件名返回workbook数据类型,打开文件

13.3.2:从工作簿中取得工资表

import openpyxlwb = openpyxl.load_workbook("example.xlsx")
print(wb.sheetnames)
# ['Sheet1']sheet = wb['Sheet1']
print(sheet)
# <Worksheet "Sheet1">print(sheet.title)
# Sheet1anotherSheet = wb.active
print(anotherSheet)
# <Worksheet "Sheet1">
sheetnames属性可以取得工作簿中所有的表名
去一个表可以直接使用带方括号:wb['Sheet1']
active属性可以获取工作簿的活动表
title属性可以获取它的名称

13.3.3:从表中取得单元格

import openpyxlwb = openpyxl.load_workbook("example.xlsx")
sheet = wb['Sheet1']
print(sheet['A1'])
print(sheet['A1'].value)
c = sheet['b1']
print(c.value)
print('Row %s, Column %s is %s' % (c.row, c.column, c.value))
print('Cell %s is %s' % (c.coordinate, c.value))

 

 Cell对象有一个value属性,它包含这个单元格的值,row、column和coordinate属性提供单元格位置信息

import openpyxlwb = openpyxl.load_workbook("example.xlsx")
sheet = wb['Sheet1']
print(sheet.cell(row=1, column=2))
print(sheet.cell(row=1, column=2).value)
for i in range(1, 8, 2):print(i, sheet.cell(row=i, column=2).value)

使用cell方法传入row值和column值,可以得到单元格的Cell对象和指定sheet['B1']一样

 

import openpyxlwb = openpyxl.load_workbook("example.xlsx")
sheet = wb['Sheet1']
print(sheet.max_row)
print(sheet.max_column)

 max_row和max_column属性来确定表的大小

13.3.4:列字母和数字之间的转换

import openpyxl
from openpyxl.utils import column_index_from_string, get_column_letterwb = openpyxl.load_workbook("example.xlsx")
sheet = wb['Sheet1']
print(get_column_letter(1))
print(get_column_letter(2))
print(get_column_letter(27))
print(get_column_letter(900))print(get_column_letter(sheet.max_column))
print(column_index_from_string('a'))
print(column_index_from_string('aa'))

get_column_letter()函数传入整数可以知道其整数对应的列,column_index_from_string()函数正好相反

13.3.5:从表中取得行和列

import openpyxlwb = openpyxl.load_workbook("example.xlsx")
sheet = wb['Sheet1']
print(tuple(sheet['a1':'c3']))
for rowOfCellObjects in sheet['a1':'c3']:for cellObj in rowOfCellObjects:print(cellObj.coordinate, cellObj.value)print("---END OF ROW---")

 指明要取的矩形框范围比如:sheet['a1':'c3']然后用循环嵌套把值输出来

import openpyxlwb = openpyxl.load_workbook("example.xlsx")
sheet = wb.active
print(list(sheet.columns)[1])
for cellObj in list(sheet.columns)[1]:print(cellObj.value)

 13.4:项目:从电子表格中读取数据

import openpyxl, pprintwb = openpyxl.load_workbook("censuspopdata.xlsx")
sheet = wb.active
countyData = {}for row in range(2, sheet.max_row+1):state = sheet['b' + str(row)].valuecounty = sheet['c' + str(row)].valuepop = sheet['d' + str(row)].valuecountyData.setdefault(state, {})countyData[state].setdefault(county, {'tracts': 0, 'pop': 0})countyData[state][county]['tracts'] += 1countyData[state][county]['pop'] += int(pop)resultFile = open('census2010.py', 'w')
resultFile.write('allData = ' + pprint.pformat(countyData))
resultFile.close()

13.5:写入Excel文档

13.5.1:创建并保存Excel文档

import openpyxlwb = openpyxl.Workbook()
print(wb.sheetnames)
sheet = wb.active
print(sheet.title)
sheet.title = 'Span'
print(wb.sheetnames)

 Workbook函数可以创建一个新的Excel,但以上代码电子表格不会保存需要调用save()方法

import openpyxlwb = openpyxl.Workbook()
sheet = wb.active
sheet.title = 'Span'
wb.save('test.xlsx')

save()方法用于保存Excel文件

13.5.2:创建和删除工作表

import openpyxlwb = openpyxl.Workbook()
print(wb.sheetnames)
print(wb.create_sheet())
print(wb.sheetnames)
wb.create_sheet(index=0, title='First Sheet')
print(wb.sheetnames)
del wb['Sheet']
print(wb.sheetnames)

 

create_sheet()方法创建一个新的工作表,位置默认在最后。index和title关键参数指定新的工作表的索引和名。
del操作符可以删除一个工作表

13.5.3:将值写入单元格

import openpyxlwb = openpyxl.Workbook()
sheet = wb['Sheet']
sheet['a1'] = 'Hello world!'
print(sheet['a1'].value)

 将值写入单元格和普通的赋值差不多,知道单元格的坐标字符串后将值赋给其对象

13.6:项目:更新电子表格

import openpyxlwb =openpyxl.load_workbook("produceSales.xlsx")
sheet = wb['Sheet']PRICE_UPDATES ={'Garlic': 3.07,'Celery': 1.19,'Lemon': 1.27
}
for rowNum in range(2, sheet.max_row):produceName = sheet.cell(row=rowNum, column=1)if produceName in PRICE_UPDATES:sheet.cell(row=rowNum, column=1).value = PRICE_UPDATES[produceName]
wb.save('updatedProduceSales.xlsx')

13.7:设置单元格的字体风格

import openpyxl
from openpyxl.styles import Fontwb = openpyxl.Workbook()
sheet = wb['Sheet']
italic24Font = Font(size=24, italic=True)   # italic设置斜体
sheet['a1'].font = italic24Font
sheet['a1'] = 'Hello world!'
wb.save('styles.xlsx')

Font()定义字体风格,将所需的风格按参数填入

13.8:Font对象

Font()函数的关键字参数

关键字参数数据类型描述
name字符串设置字体名称
size整型设置字体大小
bold布尔型是否为粗体
italic布尔型是否为斜体
import openpyxl
from openpyxl.styles import Fontwb = openpyxl.Workbook()
sheet = wb['Sheet']
fontObj1 = Font(name='Times New Roman', bold=True)   # italic设置斜体
sheet['a1'].font = fontObj1
sheet['a1'] = 'Times New Roman'fontObj2 = Font(size=24, italic=True)   # italic设置斜体
sheet['b3'].font = fontObj2
sheet['b3'] = '24 pt Italic'wb.save('styles.xlsx')

13.9:公式

用编程的方式在单元格中添加公式就和赋值一样

import openpyxlwb = openpyxl.Workbook()
sheet = wb['Sheet']
sheet['a1'] = 200
sheet['a2'] = 300
sheet['a3'] = '=SUM(A1:A2)'
wb.save('writeFormula.xlsx')

13.10:调整行和列

13.10.1:设置行高和列宽

import openpyxlwb = openpyxl.Workbook()
sheet = wb['Sheet']
sheet['a1'] = 'Tall row'
sheet['b2'] = 'Wide column'
sheet.row_dimensions[1].height = 70
sheet.column_dimensions['b'].width = 20
wb.save('dimensions.xlsx')

Worksheet对象有row_dimensions和column_dimensions属性分别控制行高和列宽。

行高可设高度为0到409之间的整数或浮点数默认行高为12.75。

列宽可设0到255之间的整数和浮点数,默认列宽为8.43个字符

13.10.2:合并和拆分单元格

import openpyxlwb = openpyxl.load_workbook('merged.xlsx')
sheet = wb['Sheet']
sheet.merge_cells('a1:d3')
sheet.merge_cells('c5:d5')
sheet.unmerge_cells('a1:d3')
wb.save('merged.xlsx')

merge_cells()方法可以将一个矩形区域的单元格合并为一个单元格。

unmerge——cells()方法可以将一个合并矩形区域的单元格拆分为独立的单元格

13.10.3:冻结窗口

Worksheet对象有一个freeze_panes属性,可以设置一个Cell对象或一个单元格坐标的字符串,设置后单元格上边的所有行和列都会被冻结,其他的行和列不会被冻结

import openpyxlwb = openpyxl.load_workbook('produceSales.xlsx')
sheet = wb['Sheet']
sheet.freeze_panes = 'a2'
wb.save('freezeExample.xlsx')

13.11:图表

要创建图表,需要以下事情:

  1.  从一个矩形区域选择单元格来创建一个Reference对象
  2. 通过传入Reference对象来创建一个Series对象
  3. 创建一个Chart对象
  4. 将Series对象添加到Chart对象
  5. 可选地设置Chart对象的drawing.top、drawing.left、drawing.width和drawing.height属性
  6. 将Chart对象添加到Worksheet对象

 

import openpyxl
from openpyxl.chart import Reference, Series, BarChartwb = openpyxl.Workbook()
sheet = wb.active
for i in range(1, 11):sheet['a' + str(i)] = irefObj = Reference(sheet, min_col=1, min_row=1, max_row=10, max_col=1)
seriesObj = Series(refObj, title='First series')chartObj = BarChart()
chartObj.title = 'My Chart'
chartObj.append(seriesObj)sheet.add_chart(chartObj, 'c5')
wb.save('sampleChart.xlsx')


http://chatgpt.dhexx.cn/article/V7ttfARP.shtml

相关文章

关于 range.autofilter 和 VBA的 filter

1 range().autofilter容易出错的地方 1.1 range().autofilter的返回值 range().autofilter 返回值总是 true返回值并不是对象&#xff0c;而是执行一个筛选的操作所以 Sub test1_filter5() Dim rng1 As Range Set rng1 Range("b1:b20").AutoFilter(field:1, Crit…

Opencv学习之角点检测

Opencv学习之角点检测 角点检测 在图像处理和计算机视觉领域&#xff0c;兴趣点&#xff08;interest points&#xff09;&#xff0c;也被称作关键点&#xff08;key points&#xff09;、特征点&#xff08;feture points&#xff09;。它被大量用于解决物体识别、图像识别…

VBA-Range.AutoFilter 方法浅析

VBA-Range.AutoFilter 方法的一些“坑” 学到筛选的时候遇到一些小小的“坑”&#xff0c;记录下。 录制出来的宏是这样的&#xff0c; Sub 宏1()宏1 宏Rows("1:1").SelectSelection.AutoFilterActiveSheet.Range("$A$1:$F$1048").AutoFilter field:4, …

Hibernate查询Query By Criterial

提供的检索方式&#xff1a;&#xff08;1&#xff09;导航对象图检索方式 &#xff08;2&#xff09;OID检索方式&#xff08;3&#xff09;HQL检索方式&#xff08;4&#xff09;QBC检索方式[query by Criteria(标准)]&#xff08;5&#xff09;本地SQL检索方式 1、简介 1.…

SLUB和SLAB的区别

转载&#xff1a;http://www.cnblogs.com/tolimit/ 首先为什么要说slub分配器&#xff0c;内核里小内存分配一共有三种&#xff0c;SLAB/SLUB/SLOB&#xff0c;slub分配器是slab分配器的进化版&#xff0c;而slob是一种精简的小内存分配算法&#xff0c;主要用于嵌入式系统。慢…

[linux kernel]slub内存管理分析(7) MEMCG的影响与绕过

文章目录 背景前情回顾描述方法约定 MEMCG总览省流总结简介 slub 相关 memcg机制kernel 5.9 版本之前结构体初始化具体实现 kernel 5.9-5.14kernel 5.14 之后 突破slab限制方法cross cache attackpage 堆风水 总结 背景 前情回顾 关于slab几个结构体的关系和初始化和内存分配…

linux slub分配器,Vi Linux内存 之 Slub分配器(六)

再来看内置式对象&#xff0c;如下图所示。指针位于对象的头部&#xff0c;与对象共用存储空间。这是因为对象被分配出去之前&#xff0c;其存储空间是空闲的可用状态&#xff0c;可用于存放空闲对象指针。对象被分配出去后&#xff0c;也不再需要这个指针了&#xff0c;可以被…

一文给你解决linux内存源码分析- SLUB分配器概述(超详细)

SLUB和SLAB的区别 首先为什么要说slub分配器&#xff0c;内核里小内存分配一共有三种&#xff0c;SLAB/SLUB/SLOB&#xff0c;slub分配器是slab分配器的进化版&#xff0c;而slob是一种精简的小内存分配算法&#xff0c;主要用于嵌入式系统。慢慢的slab分配器或许会被slub取代&…

Linux内存管理(2):SLAB/SLUB系统(基于线性映射)

一、概述 伙伴系统最大限度地解决了内存管理地外碎片问题,但是对于内碎片问题却无能为力。但内核实际使用内存的时候,却大多是小于一个页的单位。为了解决内核自身使用小块内存的碎片问题,Linux引入了基于对象的内存管理(或者叫内存区管理,Memory Area Management),就是SL…

slub分配器学习系列之linux5.10

前言 前一篇文章对 linux5.10 的 slab 分配器底层实现进行了探究与学习。进一步地&#xff0c;本篇文章将对 linux5.10 的 slub 分配器进行探究&#xff0c;对比看看两者的实现有何不同&#xff0c;做了哪些"必要的"改进。 slub 分配器 关于 slub 分配器的基本原理…

linux内核虚拟内存之slub分配器

上一章主要讲述以页为最小单位进行内存分配的伙伴管理算法&#xff0c;较大程度上避免了内存碎片问题。而实际上对内存的申请却不是每次都申请一个页面的&#xff08;比如文件节点&#xff0c;任务描述符等结构体内存&#xff09;&#xff0c;通常是远小于一个内存页面的大小&a…

4.19内核SLUB内存分配器

初始化 内核的大部分管理数据结构都是通过kmalloc分配内存的&#xff0c;那么slab本身结构的内存管理就出现了一个鸡与蛋的问题&#xff0c;slab数据结构所需内存远小于一整页的内存块&#xff0c;这些最适合kmalloc分配&#xff0c;而kmalloc只有在slab初始化完之后才能使用。…

SLUB内存管理之slub初始化

在讲slub内存管理涉及的四个函数之前&#xff0c;先从slub内存分配算法的初始化开始。系统启动时&#xff0c;会进行slub内存分配算法的初始化&#xff0c;函数流程是&#xff1a;start_kernel() -> mm_init()->kmem_cache_init()。在start_kernel()函数中的setup_arch()…

SLUB DEBUG原理

1. 前言 在工作中&#xff0c;经常会遇到由于越界导致的各种奇怪的问题。为什么越界访问导致的问题很奇怪呢&#xff1f;在工作差不多半年的时间里我就遇到了很多越界访问导致的问题&#xff08;不得不吐槽下IC厂商提供的driver&#xff0c;总是隐藏着bug&#xff09;。比如说…

slub allocator工作原理

前言 在Linux中&#xff0c;伙伴系统&#xff08;buddy system&#xff09;是以页&#xff08;1page等于4K&#xff09;为单位管理和分配内存。对于小内存的分配&#xff0c;如果还是使用伙伴系统进行内存分配&#xff0c;就会导致严重浪费内存。此时&#xff0c;slab分配器就应…

SLUB缓存管理

注&#xff1a;本文分析基于linux-4.18.0-193.14.2.el8_2内核版本&#xff0c;即CentOS 8.2 1、关于SLUB 目前大多数系统都不使用slab作为缓存的管理模式&#xff0c;转而使用slub&#xff0c;比如CentOS 7和8默认都是使用slub管理器。slub是基于slab的进一步优化改进&#x…

slub debug(linux4.16.1)

在命令行选项中添加slub_debugUFPZ&#xff0c;以使能相关检测功能&#xff0c;其含义如下&#xff1a; &#xff08;1&#xff09;U&#xff1a;跟踪该slab内存的相关属性&#xff0c;如其创建时所属的cpu、进程、时间 &#xff08;2&#xff09;F&#xff1a;开启sanity检查功…

linux内核内存管理slub

一、概述 linux内存管理核心是伙伴系统&#xff0c;slab&#xff0c;slub&#xff0c;slob是基于伙伴系统之上提供api&#xff0c;用于内核内存分配释放管理&#xff0c;适用于小内存&#xff08;小于&#xff11;页&#xff09;分配与释放&#xff0c;当然大于&#xff11;页…

内存管理 slub算法

内核管理页面使用了2个算法&#xff1a;伙伴算法和slub算法&#xff0c;伙伴算法以页为单位管理内存&#xff0c;但在大多数情况下&#xff0c;程序需要的并不是一整页&#xff0c;而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理&#xff0c;这就是s…

linux slub分配器,slub分配器

原标题&#xff1a;slub分配器 概述&#xff1a; Linux的物理内存管理采用了以页为单位的buddy system(伙伴系统)&#xff0c;但是很多情况下&#xff0c;内核仅仅需要一个较小的对象空间&#xff0c;而且这些小块的空间对于不同对象又是变化的、不可预测的&#xff0c;所以需要…