摘要
本文介绍了基于openpyxl库实现从URL读取Excel文件并提取单元格内容和样式信息的方法。主要实现了两个功能:1)获取指定Sheet指定区域的单元格值及样式(如字体大小、颜色、背景色等);2)获取Excel中所有Sheet名称列表。文章详细说明了核心思路、完整代码实现及测试示例,并总结了注意事项和适用场景。该方法无需将Excel保存到本地,适合微服务和接口调用场景,可用于报表解析、在线预览、样式还原等多种业务需求。
一、背景说明
在实际业务中,我们经常会遇到这样的需求:
-
Excel 文件不在本地,而是通过 HTTP URL 提供
-
需要读取 Excel 中指定 Sheet
-
不仅要读取单元格的值,还要获取:
- 字体大小
- 字体颜色
- 背景色
- 主题色
- 字体名称等样式信息
-
同时支持获取 所有 Sheet 名称列表
本文基于 openpyxl,实现了两个实用函数:
- 根据 URL + Sheet 名称 + 单元格范围,读取单元格内容和样式
- 根据 URL,获取 Excel 中所有 Sheet 名称
二、环境准备
1. Python 版本
bash
Python 3.7+
2. 安装依赖
bash
pip install openpyxl
三、核心思路
1️⃣ 从 URL 读取 Excel 文件
Excel 并不需要先保存到磁盘,可以直接通过 urllib.request.urlopen 读取二进制内容,再用 io.BytesIO 转为内存文件:
python
file = urllib.request.urlopen(direct_link).read()
wb = load_workbook(filename=io.BytesIO(file))
2️⃣ 获取 Sheet
python
sheet = wb[sheet_name]
3️⃣ 按区域读取单元格
openpyxl 支持类似 A2:A5、A1:C10 这种 Excel 区域写法:
python
cell_3 = sheet[sheet_info]
遍历时需要 双重循环(行 + 列):
python
for row in cell_3:
for column in row:
...
四、完整代码实现
1️⃣ 获取指定 Sheet 指定区域的单元格信息
python
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
2️⃣ 获取 Excel 中的所有 Sheet 名称
python
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
五、测试示例
python
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)
六、运行结果示例
1️⃣ 单元格信息返回结果
json
{
"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
}
]
}
2️⃣ Sheet 列表返回结果
json
{
"code": 200,
"msg": "获取成功",
"data": [
"供应商信息表",
"采购中标信息表",
"订单信息表",
"采购合理性数据分析(答案)"
]
}
七、注意事项与坑点总结
-
theme / rgb 可能为空
- 必须先判断类型,否则会报错
-
区域遍历是二维结构
sheet["A2:A5"]返回的是「行数组」
-
Excel 不落盘,适合微服务 / 接口调用
-
异常建议细化
- 实际生产可区分网络异常、Sheet 不存在、区域错误等
八、适用场景
- 报表解析服务
- Excel 在线预览
- 样式还原
- BI / 数据分析前置处理
- 后端接口返回 Excel 元信息