python3:openpyxl解析和生成excel的常用方法

news2024/11/15 17:18:03

解析

打开已经存在的工作簿

openpyxl.load_workbook()方法

from openpyxl import load_workbook

wb2 = load_workbook('test.xlsx')
print wb2.get_sheet_names()

'''
['Sheet2', 'New Title', 'Sheet1']
'''

生成

创建一个工作簿

from openpyxl import Workbook

# 一个工作簿(workbook)在创建的时候同时至少也新建了一张工作表(worksheet)
wb = Workbook()
# openpyxl.workbook.Workbook.active()调用得到正在运行的工作表
ws = wb.active

新建一张表

# 默认插在工作簿末尾
 ws1 = wb.create_sheet() 
# 插入在工作簿的第一个位置
ws2 = wb.create_sheet(0) 

在创建工作表的时候系统自动命名。他们按照序列依次命名 (Sheet, Sheet1, Sheet2, …)

修改工作表的名称

ws.title = "New Title"
# 标签栏的背景色默认为白色,改变标签栏的字体颜色
ws.sheet_properties.tabColor = "1072BA"

获取工作表

# 获取一个工作表
ws3 = wb["New Title"]
# 得到工作簿的所有工作表
wb4 = wb.get_sheet_names()
# 循环得到所有的工作表
for sheet in wb:
   print(sheet.title)

操作数据

通过索引获取

# 通过索引得到单元格数据,将返回在A4处的单元格,如果不存在将在A4新建一个
c = ws['A4']
# 为单元格的值赋值
ws['A4'] = 4

通过cell获取

c = ws.cell('A4')
# 根据行列值获取单元格
d = ws.cell(row = 4, column = 2)

特点

上面的两种方法,如果遍历了单元格而非想要使用它们也将会在内存当中创建

for i in range(1,101):
   for j in range(1,101):
        ws.cell(row = i, column = j)

代码将会在内存中创建100*100个单元格

获取多个单元格

方式1:使用切片

cell_range = ws['A1':'C2']

方式2


tuple(ws.iter_rows('A1:C2'))
'''
((<Cell Sheet1.A1>, <Cell Sheet1.B1>, <Cell Sheet1.C1>),
 (<Cell Sheet1.A2>, <Cell Sheet1.B2>, <Cell Sheet1.C2>))
'''
for row in ws.iter_rows('A1:C2'):
              for cell in row:
                    print cell
'''
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
'''

方式3:迭代文件中所有的行或者列

openpyxl.worksheet.Worksheet.xxx方法

rows()
ws = wb.active
ws['C9'] = 'hello world'
ws.rows
'''
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
'''
columns()
ws.columns
'''
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))
'''

数据存储(为单元格赋值)

通过cell

c = ws.cell('A4')
# 根据行列值获取单元格
d = ws.cell(row = 4, column = 2)

c.value = 'hello, world'
print(c.value)
'''
hello, world
'''
d.value = 3.14
print(d.value)
'''
3.14
'''

也可以保存python中的其他数据格式

保存到文件

直接保存

openpyxl.workbook.Workbook.save()方法

wb = Workbook()
wb.save('test.xlsx')

这个操作将会在没有认识提示的情况下用现在写的内容,覆盖掉原文件中的所有内容

保存为一个模板

wb = load_workbook('test.xlsx')
 wb.save('test.xltx', as_template=True)

如果as_template=False(默认),则将文件或模板保存为文件

wb = load_workbook('test.xltx')
wb.save('test.xlsx', as_template=False)

清理不需要的单元格


合并单元格:merge_cells

预期效果
在这里插入图片描述
merge_cells 的使用方法有两种,一种是指定range_string参数,一种是指定具体的行与列

方法1:指定range_string参数

import openpyxl

def merge_cell():
    wb = openpyxl.Workbook()        # 创建一个excel文件
    sheet = wb.active               # 获得一个的工作表
    sheet.title = "省市信息"
	# A1:A3 ,一个是合并区域的左上角,一个是合并区域的右下角单元格,第二种方法是
    sheet.merge_cells("A1:A3")
    sheet.cell(1, 1, '吉林省')
    citys = ["长春", "吉林", "四平"]
    for index, city in enumerate(citys):
        sheet.cell(index+1, 2, city)

    wb.save("./data/省市信息.xlsx")


if __name__ == '__main__':
    merge_cell()

方法2:指定具体的行与列

指定合并区域的开始和结束行列号

sheet.merge_cells(start_row=1, end_row=3, start_column=1, end_column=1)

读取合并后的单元格

合并后,单元格里的值存储在合并区域的左上角单元格里,因此要读取左上角单元格。

def read_merge_cell():
    wb = openpyxl.load_workbook("./data/省市信息.xlsx")
    sheet = wb.get_sheet_by_name("省市信息")
    print(sheet.cell(1, 1).value)       # 吉林省
    print(sheet.cell(2, 1).value)       # None
    print(sheet.cell(3, 1).value)       # None

if __name__ == '__main__':
    read_merge_cell()

设置自动列宽

思路:

  1. 通过遍历,计算最大列宽,同时注意中文宽度;
  2. 调整列宽。
from openpyxl import load_workbook, workbook
from openpyxl.utils import get_column_letter

# 第一步:计算每列最大宽度
def getOpenpyxlColWidth(ws):
    colWidths = []
    for i in range(1, ws.max_column + 1):  # 每列循环
        colWidth = 1  # 定义初始列宽,并在每个行循环完成后重置
        for j in range(1, ws.max_row + 1):  # 每行循环
            sz = ws.cell(row=j, column=i).value  # 每个单元格内容
            if isinstance(sz, str):  # 中文占用多个字节,需要分开处理
                lk = len(sz.encode('gbk'))  # gbk解码一个中文两字节,utf-8一个中文三字节,gbk合适
            else:
                lk = len(str(sz))
            if colWidth < lk:
                colWidth = lk  # 借助每行循环将最大值存入lk中
        colWidths.append(colWidth)  # 将每列最大宽度加入列表。
    return colWidths


wb = load_workbook('自动列宽.xlsx')
ws = wb.active
 

if __name__ == '__main__':
	wb = load_workbook('自动列宽.xlsx')
	ws = wb.active
	colWidths=getOpenpyxlColWidth(sheet)
	# 第二步:设置列宽
	for i in range(1, ws.max_column +1):
	    k = get_column_letter(i) #将数字转化为列名,26个字母以内也可以用[chr(i).upper() for i in range(97, 123)],不用导入模块
	    ws.column_dimensions[k].width = lks[i-1]+2 #设置列宽,一般加两个字节宽度,可以根据实际情况灵活调整
	wb.close()
	wb.save('自动列宽.xlsx')

参考:https://blog.csdn.net/crammy/article/details/120469646

设置行高

# 设置行高 第一行 40
sheet1.row_dimensions[1].height = 40
# 设置第二行行高25
sheet1.row_dimensions[2].height = 25

设置列宽

# 设置列宽 A20 F10 E10
sheet1.column_dimensions['A'].width = 20
sheet1.column_dimensions['F'].width = 10
sheet1.column_dimensions['E'].width = 10

将数据保存到excel中

openpyxl结合pandas

# openpyxl 结合 pandas
# 本例演示了 sheet 和 DataFrame 之间如何互相转换

from openpyxl import *
from openpyxl.utils.dataframe import dataframe_to_rows
from itertools import islice
import pandas as pd
import sys

path = sys.path[0] + "\demo3.xlsx"
wb = Workbook()
sheet1 = wb.active
sheet1.title = "sheet1"


data1 = {
    "name": ['zhao', 'qian', 'sun', 'li', 'zhou'],
    "age": [40, 25, 22, 28, 28],
    "gender": ['M', 'F', 'M', 'M', 'F'],
    "city": ['beijing', 'beijing', 'shanghai', 'beijing', 'shanghai']
}
df1 = pd.DataFrame(data=data1)
# DataFrame 数据写入 sheet
#    index 用于指定是否需要写入索引列的数据
#    header 用于指定是否需要写入标题数据
for row in dataframe_to_rows(df1, index=False, header=True):
    sheet1.append(row)
'''
保存到 sheet 后的数据是这样的
name	age	gender	city
zhao	40	M	beijing
qian	25	F	beijing
sun	22	M	shanghai
li	28	M	beijing
zhou	28	F	shanghai

'''


# sheet 转 DataFrame
#   firstColumnIsIndexColumn 用于指定第一列是否是索引列
#     True 把第一列作为 DataFrame 的索引列
#     False 自动生成 DataFrame 的索引列
# 注:本函数会将 sheet 的第一行转换为 DataFrame 的列名
def sheetToDataFrame(sheet, firstColumnIsIndexColumn):
    data = sheet.values
    if (firstColumnIsIndexColumn):
        cols = next(data)[1:] 
        data = list(data)
        idx = [r[0] for r in data]
        data = (islice(r, 1, None) for r in data)
    else:
        cols = next(data)[:] 
        data = list(data)
        idx = None
        data = (islice(r, 0, None) for r in data)
    return pd.DataFrame(data, index=idx, columns=cols)

df2 = sheetToDataFrame(sheet1, True)
df3 = sheetToDataFrame(sheet1, False)

print(df2)
'''      age gender      city
zhao   40      M   beijing
qian   25      F   beijing
sun    22      M  shanghai
li     28      M   beijing
zhou   28      F  shanghai'''
print(df3)
'''
   name  age gender      city
0  zhao   40      M   beijing
1  qian   25      F   beijing
2   sun   22      M  shanghai
3    li   28      M   beijing
4  zhou   28      F  shanghai
'''


# 保存 excel
wb.save(path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka的关键细节 以及 分区和主题的概念

文章目录Kafka中的关键细节1.消息的顺序存储2. 单播消息的实现3.多播消息的实现4.查看消费组及信息主题、分区的概念1.主题Topic2.partition分区Kafka中的关键细节 1.消息的顺序存储 消息的发送方会把消息发送到broker中&#xff0c;broker会存储消息&#xff0c;消息是按照发…

python本科毕业设计基于神经网络的虚假评论识别系统源码,含模型及数据

主要函数&#xff1a; 1.corpusprocess原始语料处理函数 2.train_word2vec生成word2vec向量 3.generate_id2wec获得索引的w2id,和嵌入权重embedding_weights 4.prepare_data 数据预处理 完整代码下载地址&#xff1a;python本科毕业设计基于神经网络的虚假评论识别系统源码 代…

多线程(初阶)——多线程基础

多线程(初阶)——多线程基础 文章目录多线程(初阶)——多线程基础1.认识线程2.多线程程序2.1 第一个Java多线程程序2.2 观察线程的详细情况2.3 sleep方法2.4 run和start方法的区别3.创建线程3.1 继承Thread类3.2实现Runnable接口3.3 通过匿名内部类创建线程3.4通过实现Runnable…

【目标检测】------yolox网络结构

YOLOX网络结构图 卷积和池化计算器&#xff1a; http://www.sqflash.com/cal.html

ServletAPI 2-10复杂参数, 解析完的参数值都会放到 ModelAndViewContainer里面

总结&#xff1a; 找到解析器后&#xff0c;用解析器去解析参数&#xff0c;都使用了resolveArgument()中以下方法 mavContainer.getModel(); mavContainer:模型和视图容器 视图&#xff1a;页面请求要返回一个地方&#xff0c;这个地方的地址叫视图 。比如要到/sucess 模…

CV——day70 零基础学YOLO:YOLOv1

YOLO系列1. 不同阶段算法优缺点分析2. IOU指标计算3. MAP指标计算**指标分析**如何计算MAP4 YOLOv14.1 YOLOv1核心思想4.2 YOLOv1网络架构那么&#xff0c;7 * 7 * 30的输出是怎么来呢&#xff1f;4.3 损失函数4.3.1 位置误差4.3.2 置信度误差(含object)4.3.3 置信度误差(不含o…

股票量化分析工具QTYX使用攻略——小市值轮动选股策略(更新2.5.9)

搭建自己的量化交易系统 如果要长期在市场中立于不败之地&#xff01;必须要形成一套自己的交易系统。 如何学会搭建自己的量化交易系统&#xff1f; 边学习边实战&#xff0c;在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习&#xff0c;也可以用于实战炒股分析…

Springboot农产品特产销售网站maven mysql idea

摘 要 I 1 绪论 1 1.1研究背景 1 1.2研究现状 1 1.3研究内容 2 2 系统关键技术 3 2.1 JSP技术 3 2.2 JAVA简介 3 2.3 MYSQL数据库 4 2.4 B/S结构 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2经济可行性 5 3.1.3操作可…

[Android开发基础2] 七大常用界面控件(附综合案例)

文章目录 一、文本TextView 二、按钮Button 三、编辑输入框EditText 四、图片ImageView 五、单选按钮RadioButton 六、复选框CheckBox 七、系统消息框Toast 综合案例&#xff1a;账号注册界面 一、文本TextView TextView控件用于显示文本信息。 演示&#xff1a; <?…

kafka可视化web管理工具-KafkaMmap

kafka可视化web管理工具-KafkaMmap ​ 使用过kafka的小伙伴应该都知道kafka本身是没有管理界面的&#xff0c;所有操作都需要手动执行命令来完成。但有些命令又多又长&#xff0c;如果没有做笔记&#xff0c;别说是新手&#xff0c;就连老手也不一定能记得住&#xff0c;每次想…

blender绑定骨骼法 2 rig

image.pngimage.png生成一个body_temp add neck 脖子 add chin 下巴 image.pngadd shoulder肩膀 image.pngadd wrist手腕 add spline root .额那个位置 image.pngadd ankle脚踝 image.pngFACIAL setup是面部的骨骼绑定,这里没眼球啥的就不弄了直接 点go 就生成了骨骼. image.pn…

1、SPSS 25的安装

目录 一、简介 二、竞争优势 三、安装步骤 一、简介 SPSS 是一款用于Windows操作系统的数据和科学图形的数值分析软件&#xff0c;能够为用户提供多样的数据统计、处理、报告等功能&#xff0c;还能根据数据帮用户生成离散图、折线图等图形&#xff0c;以更加直观的方式向你…

【数据库增删查改基础版】本文将与大家一起去探索基础版本的数据库增删查改,图文讲解数据库增删查改

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;这篇文章我将带领大家进入基础版本增删查改数据库的学习&#xff0c;后面的文章会有数据库进阶版&#xff0c;更多的约束条件让你润享丝滑。增删查改是数据库操作中极其重要的内容&#xff0c;我们从简单入手&#x…

12.Java二维数组讲解

本篇文章重点需要掌握的内容如下: 后面附有Java二维数组的练习题 文章目录前言一、二维数组的应用场景二、二维数组的初始化1.静态初始化2.动态初始化三、二维数组的内存图1.特殊情况1的写法:特殊情况1的写法的好处:2.特殊情况2的写法四、二维数组的练习题总结前言 一、二维数…

三子棋游戏

前言 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来&#xff0c;相对两边依次摆上三个双方棋子&#xff0c;只要将自己的三个棋子走成一条线&#xff0c;对方就算输了。但是&#xff0c;有很多时候会出现和棋的情况。 文…

Hi3861鸿蒙物联网项目实战:倒车雷达

华清远见FS-Hi3861开发套件&#xff0c;支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能&#xff0c;开发板板载资源丰富&#xff0c;包括传感器、执行器、NFC、显示屏等&#xff0c;同时还配套丰富的拓展模块。开发板配套丰富的学习资料&#xff0c;包括全套开发教程…

Cadence PCB仿真 使用 Allegro PCB SI 敏感网络列表.lst文件的建立方法图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,基本方法3,建立技巧4,总结1,概述 敏感网络表(.lst文件)是一个在PCB设计阶段需要特别关注的网络列表。本文简单介绍其建立或导出方法。 2,基本方法 第1步:使用记事本新建1个文本文档…

vue2原理核心Object.defineProperty()的理解

Object.defineProperty(obj, prop, { configurable:false //默认false ,为true是可以属性修改,删除 enumerable:false //默认false ,为true是可以枚举对象 value:prop对应的值 // 初始为undefined writable:false //默认false ,为true是可以修改value的值 }) o…

python实现XML文件的内容变更

文章目录一、使用背景二、实现效果三、内置库的使用四、代码实现解析五、完整代码一、使用背景 我们在某些情况下需要对XML格式的文件进行内容处理&#xff0c;可以直接打开处理&#xff0c;但是对于一些需要自动化或者不方便手动处理的情况下我们的代码实现就比较关键啦&…

maxlength属性

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>maxlength属性</title> </head> <body> <form action"action_page.php"> <!--…