摘要
本文介绍了基于openpyxl库实现从url读取excel文件并提取单元格内容和样式信息的方法。主要实现了两个功能:1)获取指定sheet指定区域的单元格值及样式(如字体大小、颜色、背景色等);2)获取excel中所有sheet名称列表。文章详细说明了核心思路、完整代码实现及测试示例,并总结了注意事项和适用场景。该方法无需将excel保存到本地,适合微服务和接口调用场景,可用于报表解析、在线预览、样式还原等多种业务需求。
一、背景说明
在实际业务中,我们经常会遇到这样的需求:
excel 文件不在本地,而是通过 http url 提供
需要读取 excel 中指定 sheet
不仅要读取单元格的值,还要获取:
- 字体大小
- 字体颜色
- 背景色
- 主题色
- 字体名称等样式信息
同时支持获取 所有 sheet 名称列表
本文基于 openpyxl,实现了两个实用函数:
- 根据 url + sheet 名称 + 单元格范围,读取单元格内容和样式
- 根据 url,获取 excel 中所有 sheet 名称
二、环境准备
1. python 版本
python 3.7+
2. 安装依赖
pip install openpyxl
三、核心思路
从 url 读取 excel 文件
excel 并不需要先保存到磁盘,可以直接通过 urllib.request.urlopen 读取二进制内容,再用 io.bytesio 转为内存文件:
file = urllib.request.urlopen(direct_link).read() wb = load_workbook(filename=io.bytesio(file))
获取 sheet
sheet = wb[sheet_name]
按区域读取单元格
openpyxl 支持类似 a2:a5、a1:c10 这种 excel 区域写法:
cell_3 = sheet[sheet_info]
遍历时需要 双重循环(行 + 列):
for row in cell_3:
for column in row:
...
四、完整代码实现
获取指定 sheet 指定区域的单元格信息
from openpyxl import load_workbook
import io
import urllib.request
def get_sheet_info(direct_link, sheet_name, sheet_info):
me = []
res = {}
try:
# 从 url 读取 excel 文件
file = urllib.request.urlopen(direct_link).read()
wb = load_workbook(filename=io.bytesio(file))
# 根据 sheet 名称获取 sheet
sheet = wb[sheet_name]
# 获取指定区域
cell_3 = sheet[sheet_info]
for row in cell_3:
for column in row:
js = {}
js['row'] = column.coordinate
js['value'] = str(column.value)
js['font_sz'] = column.font.sz
# 字体主题色
if isinstance(column.font.color.theme, int):
js['font_theme'] = column.font.color.theme
else:
js['font_theme'] = -1
# 垂直对齐方式
if column.font.vertalign is none:
js['vertalign'] = "none"
else:
js['vertalign'] = column.font.vertalign
# 字体 rgb 颜色
if isinstance(column.font.color.rgb, str):
js['font_color'] = column.font.color.rgb
else:
js['font_color'] = ""
# 背景 rgb 颜色
if isinstance(column.fill.start_color.rgb, str):
js['back_color'] = column.fill.start_color.rgb
else:
js['back_color'] = ""
# 字体名称
js['name'] = column.font.name
# 背景主题色
if isinstance(column.fill.fgcolor.theme, int):
js['back_theme'] = column.fill.fgcolor.theme
else:
js['back_theme'] = -1
me.append(js)
res['code'] = "500"
res['msg'] = "未获取excel信息"
res['data'] = me
return res
except exception:
res['code'] = "400"
res['msg'] = "url获取失败"
return res
获取 excel 中的所有 sheet 名称
def get_sheet_list(direct_link):
res = {}
try:
file = urllib.request.urlopen(direct_link).read()
wb = load_workbook(filename=io.bytesio(file))
res['code'] = 200
res['msg'] = "获取成功"
res['data'] = wb.sheetnames
except exception:
res['code'] = "400"
res['msg'] = "url获取失败"
return res
五、测试示例
a = get_sheet_info(
"http://192.168.31.161:8080/555.xlsx",
"采购合理性数据分析(答案)",
"a2:a5"
)
print(a)
b = get_sheet_list("http://192.168.31.161:8080/555.xlsx")
print(b)
六、运行结果示例
单元格信息返回结果
{
"code": "500",
"msg": "未获取excel信息",
"data": [
{
"row": "a2",
"value": "季度",
"font_sz": 11.0,
"font_theme": 1,
"vertalign": "none",
"font_color": "",
"back_color": "00000000",
"name": "宋体",
"back_theme": -1
},
{
"row": "a3",
"value": "2018-1",
"font_sz": 11.0,
"font_theme": 1,
"vertalign": "none",
"font_color": "",
"back_color": "00000000",
"name": "宋体",
"back_theme": -1
}
]
}
sheet 列表返回结果
{
"code": 200,
"msg": "获取成功",
"data": [
"供应商信息表",
"采购中标信息表",
"订单信息表",
"采购合理性数据分析(答案)"
]
}
七、注意事项与坑点总结
theme / rgb 可能为空:必须先判断类型,否则会报错
区域遍历是二维结构:sheet["a2:a5"] 返回的是「行数组」
excel 不落盘,适合微服务 / 接口调用
异常建议细化:实际生产可区分网络异常、sheet 不存在、区域错误等
八、适用场景
- 报表解析服务
- excel 在线预览
- 样式还原
- bi / 数据分析前置处理
- 后端接口返回 excel 元信息
到此这篇关于python使用openpyxl从url读取excel并获取单元格样式的文章就介绍到这了,更多相关python openpyxl读取excel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论