openpyxl(用于读写 Excel 文件)、os(用于操作系统相关功能,如路径操作、文件存在性检查等)和 time(常用于时间延迟、计时或获取时间戳)三个 Python 标准/第三方库。这是一个常见的组合,常用于自动化处理 Excel 文件,例如:
- 批量读取/生成 Excel 表格
- 动态命名文件(结合
time.strftime()) - 检查文件路径是否存在(
os.path.exists) - 自动保存带时间戳的备份文件(如
report_20240520_143022.xlsx)
✅ 示例:用当前时间生成带时间戳的 Excel 文件名
timestamp = time.strftime("%Y%m%d_%H%M%S")
filename = f"output_{timestamp}.xlsx"
wb = openpyxl.Workbook()
wb.save(filename)
print(f"已保存:{filename}")
✅ 示例:安全检查并创建目录
output_dir = "exports"
os.makedirs(output_dir, exist_ok=True)
wb.save(os.path.join(output_dir, filename))
使用 openpyxl 读取 Excel 中指定工作表的某一列数据(例如:读取工作表 Sheet1 中 B 列的所有非空单元格值),推荐以下两种高效、清晰的方式:
✅ 方法一:按列字母读取(推荐,语义清晰)
from openpyxl import load_workbook
wb = load_workbook("data.xlsx")
ws = wb["Sheet1"] # 指定工作表名;也可用 wb.active 获取活动表
# 读取 B 列(从第1行到最大行),自动跳过空单元格(可选过滤)
column_b_data = [cell.value for cell in ws["B"] if cell.value is not None]
print(column_b_data)
🔍 说明:
ws["B"]返回一个生成器,遍历 B 列所有行的单元格(从第1行开始,至该列最后一行有内容的行)。注意:它包含空单元格(.value为None),因此加if cell.value is not None可过滤空值。
✅ 方法二:按列索引读取(适合动态列号)
from openpyxl.utils import get_column_letter
col_index = 2 # B列对应索引为2(A=1, B=2, ...)
col_letter = get_column_letter(col_index)
column_data = [cell.value for cell in ws[col_letter] if cell.value is not None]
✅ 进阶:只读取有数据的实际范围(更精准,避免尾部空行)
# 获取该列中实际有数据的最大行号(基于工作表维度)
ws.calculate_dimension() # 确保维度已更新(尤其对新写入文件)
max_row = ws.max_row
column_b_data = []
for row in range(1, max_row + 1):
val = ws.cell(row=row, column=2).value # B列 = column=2
if val is not None:
column_b_data.append(val)
💡 提示:
ws.max_row和ws.max_column是估算值,对含大量空行/格式的文件可能不准;如需绝对可靠,建议结合ws.iter_rows(min_col=2, max_col=2, values_only=True)(见下)。
✅ 最佳实践:使用 iter_rows() + values_only=True(内存友好,推荐用于大表)
# 仅获取 B 列(第2列)所有行的值,跳过样式/公式,返回元组
b_column_values = [
row[0] for row in ws.iter_rows(
min_col=2, max_col=2,
min_row=1, max_row=ws.max_row,
values_only=True
) if row[0] is not None
]
📌 注意事项:
openpyxl默认读取时保留公式结果(不是公式文本),如需原始公式请设data_only=False(默认即True,即读结果);- 若需读取公式本身:
load_workbook("file.xlsx", data_only=False),再用cell.value或cell.formula; - 首次打开
.xlsx文件较慢,可考虑read_only=True模式(但不支持ws["B"]语法,需改用ws.iter_cols())。


320

被折叠的 条评论
为什么被折叠?



