当前位置:首页>python>Python 零基础100天—Day81 openpyxl 操作 Excel

Python 零基础100天—Day81 openpyxl 操作 Excel

  • 2026-08-21 14:00:43
Python 零基础100天—Day81 openpyxl 操作 Excel

🐍 Python Day81:openpyxl 操作 Excel — 自动化办公利器

🕐 预计用时:3-4 小时 | 🎯 目标:掌握 Excel 读写、样式设置、公式计算、图表生成和批量处理


📖 今日目录

  1. openpyxl 是什么?
  2. 读取 Excel
  3. 写入 Excel
  4. 单元格操作
  5. 样式与格式
  6. 公式计算
  7. 图表生成
  8. 数据验证与保护
  9. 实战:批量生成工资条
  10. 今日练习
  11. 今日小结

1. openpyxl 是什么?

openpyxl 是 Python 操作 Excel(.xlsx 格式)最常用的库。它可以读写 Excel 文件、设置样式、插入图表、计算公式——完全用代码替代手动操作。

# 安装
pip install openpyxl

# 为什么用 openpyxl 而不是手动操作 Excel?
# 手动操作:打开 → 复制 → 粘贴 → 保存 → 重复 100 次...
# openpyxl:写一个循环,100 个文件 10 秒搞定

# 常见场景:
# ✅ 批量生成报表(如月度销售报告)
# ✅ 批量生成工资条(每人一张表)
# ✅ 合并多个 Excel 文件
# ✅ 数据清洗和转换
# ✅ 自动生成图表
格式
特点
openpyxl
.xlsx
读写+样式+图表+公式,最全能
xlrd
.xls
只读旧格式,已停止维护
xlwt
.xls
只写旧格式,已停止维护
pandas
两者
数据分析,底层调用 openpyxl
xlsxwriter
.xlsx
只写,图表功能更强

2. 读取 Excel

from openpyxl import load_workbook

# === 打开工作簿 ===
wb = load_workbook('sales_data.xlsx')

# 查看所有工作表名
print(wb.sheetnames)  # ['Sheet1', 'Sheet2', '汇总']

# 获取工作表
ws = wb.active                    # 当前活动工作表
ws = wb['Sheet1']                 # 按名称获取
ws = wb.worksheets[0]             # 按索引获取

# === 读取单元格 ===
# 方式1:坐标字符串
value = ws['A1'].value             # 读取 A1 单元格的值
value = ws['B3'].value

# 方式2:行号列号(从1开始!)
value = ws.cell(row=1, column=1).value   # 等同于 A1
value = ws.cell(row=3, column=2).value   # 等同于 B3

# === 读取范围 ===
# 读取一列
for row in ws.iter_rows(min_row=1, max_row=10, min_col=1, max_col=1):
    for cell in row:
        print(cell.value)

# 读取多列
for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=5):
    name = row[0].value     # A 列
    price = row[1].value    # B 列
    qty = row[2].value      # C 列
    total = row[3].value    # D 列
    print(f'{name}: {price} × {qty} = {total}')

# === 读取所有数据(推荐方式)===
def read_excel_data(filepath):
    """读取 Excel 所有数据为列表"""
    wb = load_workbook(filepath)
    ws = wb.active

    headers = []
    data = []

    for i, row in enumerate(ws.iter_rows(values_only=True)):
        if i == 0:
            headers = list(row)      # 第一行是表头
        else:
            data.append(dict(zip(headers, row)))

    wb.close()
    return headers, data

headers, data = read_excel_data('sales_data.xlsx')
print(f'表头: {headers}')
print(f'数据行数: {len(data)}')
print(f'第一行: {data[0]}')

💡 读取注意事项:

• 行号和列号都从 1 开始(不是 0!)
• cell.value 返回单元格的值,空单元格返回 None
• ws.max_row 和 ws.max_column 获取最大行列数
• 用完记得 wb.close() 关闭文件


3. 写入 Excel

from openpyxl import Workbook

# === 创建新工作簿 ===
wb = Workbook()
ws = wb.active
ws.title = '销售数据'  # 重命名工作表

# === 写入数据 ===
# 方式1:直接指定单元格
ws['A1'] = '姓名'
ws['B1'] = '销售额'
ws['C1'] = '日期'

ws['A2'] = '小明'
ws['B2'] = 15000
ws['C2'] = '2026-01-15'

# 方式2:通过行号列号
ws.cell(row=3, column=1, value='小红')
ws.cell(row=3, column=2, value=18000)
ws.cell(row=3, column=3, value='2026-01-16')

# === 批量写入(推荐)===
data = [
    ['姓名', '销售额', '日期'],
    ['小明', 15000, '2026-01-15'],
    ['小红', 18000, '2026-01-16'],
    ['小刚', 12000, '2026-01-17'],
    ['小美', 22000, '2026-01-18'],
    ['小强', 16500, '2026-01-19'],
]

for row in data:
    ws.append(row)  # 逐行追加

# === 保存 ===
wb.save('output.xlsx')
wb.close()
print('✅ 文件已保存: output.xlsx')

# === 从 Pandas DataFrame 写入 ===
import pandas as pd

df = pd.DataFrame({
    '姓名': ['小明', '小红', '小刚'],
    '销售额': [15000, 18000, 12000],
})

# 方式1:pandas 直接写(简单)
df.to_excel('pandas_output.xlsx', index=False)

# 方式2:openpyxl 写入已有工作簿(灵活)
wb = Workbook()
ws = wb.active
ws.title = '销售数据'

# 写入表头
for col, header in enumerate(df.columns, 1):
    ws.cell(row=1, column=col, value=header)

# 写入数据
for row_idx, row_data in enumerate(df.values, 2):
    for col_idx, value in enumerate(row_data, 1):
        ws.cell(row=row_idx, column=col_idx, value=value)

wb.save('formatted_output.xlsx')
wb.close()

4. 单元格操作

from openpyxl import Workbook
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font

wb = Workbook()
ws = wb.active

# === 列宽设置 ===
ws.column_dimensions['A'].width = 20       # A 列宽 20
ws.column_dimensions['B'].width = 15       # B 列宽 15
ws.column_dimensions['C'].width = 30       # C 列宽 30

# 批量设置列宽
for col in range(1, 11):
    letter = get_column_letter(col)
    ws.column_dimensions[letter].width = 15

# === 行高设置 ===
ws.row_dimensions[1].height = 30           # 第1行高 30

# 批量设置行高
for row in range(1, 20):
    ws.row_dimensions[row].height = 25

# === 合并单元格 ===
ws.merge_cells('A1:D1')                    # 合并 A1 到 D1
ws['A1'] = '2026年销售报表'
ws['A1'].font = Font(size=16, bold=True)

# 取消合并
# ws.unmerge_cells('A1:D1')

# === 插入行/列 ===
ws.insert_rows(2)          # 在第2行前插入一行
ws.insert_cols(3)          # 在第3列前插入一列

# 删除行/列
ws.delete_rows(2)          # 删除第2行
ws.delete_cols(3)          # 删除第3列

# === 复制工作表 ===
ws_copy = wb.copy_worksheet(ws)
ws_copy.title = '备份'

# === 删除工作表 ===
# del wb['Sheet2']
# wb.remove(ws_copy)

wb.save('cell_ops.xlsx')
wb.close()

5. 样式与格式

from openpyxl import Workbook
from openpyxl.styles import (
    Font, PatternFill, Alignment, Border, Side, numbers
)

wb = Workbook()
ws = wb.active

# === 字体样式 ===
ws['A1'] = '标题'
ws['A1'].font = Font(
    name='微软雅黑',       # 字体
    size=16,               # 字号
    bold=True,             # 加粗
    italic=False,          # 斜体
    color='FFFFFF',        # 字体颜色(白色)
)

# === 背景填充 ===
ws['A1'].fill = PatternFill(
    start_color='07C160',  # 背景色(微信绿)
    end_color='07C160',
    fill_type='solid'      # 纯色填充
)

# === 对齐方式 ===
ws['A1'].alignment = Alignment(
    horizontal='center',   # 水平居中
    vertical='center',     # 垂直居中
    wrap_text=True          # 自动换行
)

# === 边框 ===
thin_border = Border(
    left=Side(style='thin', color='000000'),
    right=Side(style='thin', color='000000'),
    top=Side(style='thin', color='000000'),
    bottom=Side(style='thin', color='000000'),
)
ws['A1'].border = thin_border

# === 数字格式 ===
ws['B2'] = 15000
ws['B2'].number_format = '#,#
#0.00'        # 千分位 + 2位小数
ws['B2'].number_format = '¥#,##0.00'       # 人民币格式
ws['B2'].number_format = '0.00%'           # 百分比格式
ws['B2'].number_format = 'YYYY-MM-DD'      # 日期格式

# === 批量设置样式(推荐写法)===
def set_header_style(cell):
    """设置表头样式"""
    cell.font = Font(name='微软雅黑', size=12, bold=True, color='FFFFFF')
    cell.fill = PatternFill(start_color='07C160', fill_type='solid')
    cell.alignment = Alignment(horizontal='center', vertical='center')
    cell.border = thin_border

def set_data_style(cell):
    """设置数据单元格样式"""
    cell.font = Font(name='微软雅黑', size=11)
    cell.alignment = Alignment(horizontal='center', vertical='center')
    cell.border = thin_border

# 写入表头并设置样式
headers = ['姓名', '销售额', '日期', '状态']
for col, header in enumerate(headers, 1):
    cell = ws.cell(row=1, column=col, value=header)
    set_header_style(cell)

# 写入数据并设置样式
data = [
    ['小明', 15000, '2026-01-15', '已完成'],
    ['小红', 18000, '2026-01-16', '进行中'],
    ['小刚', 12000, '2026-01-17', '已完成'],
]
for row_idx, row_data in enumerate(data, 2):
    for col_idx, value in enumerate(row_data, 1):
        cell = ws.cell(row=row_idx, column=col_idx, value=value)
        set_data_style(cell)
        # 销售列特殊格式
        if col_idx == 2:
            cell.number_format = '¥#,##0.00'

# === 条件样式(数据条/色阶/图标集)===
from openpyxl.formatting.rule import ColorScaleRule, DataBarRule

# 色阶(最小值红色,中间黄色,最大值绿色)
ws.conditional_formatting.add(
    'B2:B100',
    ColorScaleRule(
        start_type='min', start_color='FF6B6B',
        mid_type='percentile', mid_value=50, mid_color='FFD93D',
        end_type='max', end_color='07C160',
    )
)

# 数据条
ws.conditional_formatting.add(
    'B2:B100',
    DataBarRule(start_type='min', end_type='max', color='07C160')
)

wb.save('styled.xlsx')
wb.close()

💡 样式速查表:

• 字体Font(name, size, bold, color)
• 背景PatternFill(start_color, fill_type='solid')
• 对齐Alignment(horizontal, vertical, wrap_text)
• 边框Border(left, right, top, bottom)
• 数字number_format = '¥#,##0.00'
• 条件conditional_formatting.add(range, rule)


6. 公式计算

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 写入数据
ws['A1'] = '商品'
ws['B1'] = '单价'
ws['C1'] = '数量'
ws['D1'] = '小计'

data = [
    ['苹果', 5.5, 10],
    ['香蕉', 3.8, 20],
    ['橘子', 4.2, 15],
]
for i, row in enumerate(data, 2):
    for j, val in enumerate(row, 1):
        ws.cell(row=i, column=j, value=val)

# 写入公式(用 = 开头)
ws['D2'] = '=B2*C2'           # 苹果小计
ws['D3'] = '=B3*C3'           # 香蕉小计
ws['D4'] = '=B4*C4'           # 橘子小计
ws['D5'] = '=SUM(D2:D4)'     # 合计
ws['D6'] = '=AVERAGE(D2:D4)' # 平均值
ws['D7'] = '=MAX(D2:D4)'     # 最大值
ws['D8'] = '=MIN(D2:D4)'     # 最小值
ws['D9'] = '=COUNT(D2:D4)'   # 计数

# 带条件的公式
ws['E2'] = '=IF(D2>50,"大单","小单")'

# VLOOKUP 公式
ws['F2'] = '=VLOOKUP(A2,$A$2:$D$4,4,FALSE)'

# 跨工作表引用
# ws['G2'] = "=Sheet2!A1"

# 注意:openpyxl 写入的公式需要在 Excel 中打开才能计算
# openpyxl 本身不会计算公式结果,读取时也只能拿到公式字符串
# 如果需要在 Python 中得到计算结果,有两种方式:
# 1. 用 Python 先算好,再把数值写入单元格
# 2. 使用第三方库 formulas 或 pylightxl 进行公式求值
# 例如:先把 (B2*C2) 的结果算出来,再 ws['D2'] = 5.5 * 10

wb.save('formula.xlsx')
wb.close()

7. 图表生成

from openpyxl import Workbook
from openpyxl.chart import BarChart, LineChart, PieChart, Reference

wb = Workbook()
ws = wb.active

# 准备数据
ws['A1'] = '月份'
ws['B1'] = '销售额'
ws['C1'] = '利润'

months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales = [12000, 15000, 13500, 18000, 16500, 22000]
profit = [3000, 4500, 3200, 5500, 4800, 7000]

for i, (month, s, p) in enumerate(zip(months, sales, profit), 2):
    ws.cell(row=i, column=1, value=month)
    ws.cell(row=i, column=2, value=s)
    ws.cell(row=i, column=3, value=p)

# === 柱状图 ===
chart = BarChart()
chart.type = 'col'                # 'col'=垂直柱状图, 'bar'=水平
chart.title = '月度销售额'
chart.x_axis.title = '月份'
chart.y_axis.title = '金额'
chart.style = 10                  # 图表样式

# 数据引用
data_ref = Reference(ws, min_col=2, min_row=1, max_row=7)
cats_ref = Reference(ws, min_col=1, min_row=2, max_row=7)

chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(cats_ref)
chart.shape = 4                   # 图表元素形状样式(4=圆角矩形)
chart.width = 20                  # 图表宽度(单位:厘米)
chart.height = 12                 # 图表高度(单位:厘米)

ws.add_chart(chart, 'A10')

# === 折线图 ===
line_chart = LineChart()
line_chart.title = '月度趋势'
line_chart.x_axis.title = '月份'
line_chart.y_axis.title = '金额'

data_ref = Reference(ws, min_col=2, max_col=3, min_row=1, max_row=7)
cats_ref = Reference(ws, min_col=1, min_row=2, max_row=7)

line_chart.add_data(data_ref, titles_from_data=True)
line_chart.set_categories(cats_ref)
line_chart.width = 20
line_chart.height = 12

ws.add_chart(line_chart, 'A28')

# === 饼图 ===
pie_chart = PieChart()
pie_chart.title = '销售占比'

# 饼图只需要一列数据
pie_data = Reference(ws, min_col=2, min_row=1, max_row=7)
pie_cats = Reference(ws, min_col=1, min_row=2, max_row=7)

pie_chart.add_data(pie_data, titles_from_data=True)
pie_chart.set_categories(pie_cats)
pie_chart.width = 15
pie_chart.height = 10

ws.add_chart(pie_chart, 'A46')

wb.save('charts.xlsx')
wb.close()

8. 数据验证与保护

from openpyxl import Workbook
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.worksheet.properties import PageSetupProperties

wb = Workbook()
ws = wb.active

# === 数据验证(下拉列表)===
# 在 A 列创建下拉列表
dv = DataValidation(
    type='list',
    formula1='"已完成,进行中,未开始"',
    allow_blank=True,
)
dv.error = '请从下拉列表中选择'
dv.errorTitle = '输入错误'
ws.add_data_validation(dv)
dv.add('A2:A100')

# 数字范围验证
dv_num = DataValidation(
    type='whole',
    operator='between',
    formula1='0',
    formula2='100',
)
dv_num.error = '请输入 0-100 的整数'
ws.add_data_validation(dv_num)
dv_num.add('C2:C100')

# === 工作表保护 ===
ws.protection.sheet = True
ws.protection.password = 'mypassword'

# 提示:要让某些单元格可编辑,需要先解锁它们
# from openpyxl.styles import Protection
# ws['A1'].protection = Protection(locked=False)  # 解锁 A1
# 然后再开启工作表保护,被解锁的单元格仍可编辑

# === 冻结窗格 ===
ws.freeze_panes = 'A2'      # 冻结第一行(滚动时表头始终可见)

# === 打印设置 ===
ws.print_title_rows = '1:1'  # 打印时每页都重复第一行
# 注意:pageSetUpPr 默认为 None,必须先实例化才能设置属性
ws.sheet_properties.pageSetUpPr = PageSetupProperties(fitToPage=True)
ws.page_setup.fitToWidth = 1
ws.page_setup.fitToHeight = 0
ws.page_setup.orientation = 'landscape'  # 横向打印

wb.save('validated.xlsx')
wb.close()

9. 实战:批量生成工资条

"""
实战场景:HR 需要给每个员工发一张独立的工资条 Excel
输入:一个包含所有员工工资数据的大 Excel
输出:每人一个独立的工资条文件
"""
from openpyxl import load_workbook, Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
import os

def generate_payslips(source_file, output_dir='payslips'):
    """批量生成工资条"""

    os.makedirs(output_dir, exist_ok=True)

    # 读取源数据
    wb_src = load_workbook(source_file)
    ws_src = wb_src.active

    # 获取表头
    headers = [cell.value for cell in ws_src[1]]

    # 样式定义
    header_font = Font(name='微软雅黑', size=12, bold=True, color='FFFFFF')
    header_fill = PatternFill(start_color='07C160', fill_type='solid')
    data_font = Font(name='微软雅黑', size=11)
    center_align = Alignment(horizontal='center', vertical='center')
    thin_border = Border(
        left=Side(style='thin'),
        right=Side(style='thin'),
        top=Side(style='thin'),
        bottom=Side(style='thin'),
    )

    # 逐行生成工资条
    count = 0
    for row_idx in range(2, ws_src.max_row + 1):
        row_data = [ws_src.cell(row=row_idx, column=c).value for c in range(1, len(headers) + 1)]

        # 跳过空行
        if all(v is None for v in row_data):
            continue

        # 创建新的工作簿
        wb_pay = Workbook()
        ws_pay = wb_pay.active
        ws_pay.title = '工资条'

        # 设置列宽
        for col in range(1, len(headers) + 1):
            ws_pay.column_dimensions[get_column_letter(col)].width = 18

        # 写入标题
        ws_pay.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(headers))
        title_cell = ws_pay.cell(row=1, column=1, value='工资条')
        title_cell.font = Font(name='微软雅黑', size=16, bold=True)
        title_cell.alignment = Alignment(horizontal='center', vertical='center')
        ws_pay.row_dimensions[1].height = 40

        # 写入表头
        for col, header in enumerate(headers, 1):
            cell = ws_pay.cell(row=2, column=col, value=header)
            cell.font = header_font
            cell.fill = header_fill
            cell.alignment = center_align
            cell.border = thin_border

        # 写入数据
        for col, value in enumerate(row_data, 1):
            cell = ws_pay.cell(row=3, column=col, value=value)
            cell.font = data_font
            cell.alignment = center_align
            cell.border = thin_border
            # 金额格式
            if isinstance(value, (int, float)) and '薪' in str(headers[col-1]):
                cell.number_format = '¥#,##0.00'

        # 保存
        name = str(row_data[0]).replace('/', '_')  # 文件名安全处理
        filename = f'{output_dir}/工资条_{name}.xlsx'
        wb_pay.save(filename)
        wb_pay.close()
        count += 1

    wb_src.close()
    print(f'✅ 生成完成!共 {count} 个工资条,保存在 {output_dir}/')

# 使用
# generate_payslips('工资表.xlsx', '工资条输出')

10. 今日练习

🏋️ 练习 1:创建学生成绩表

# 用 openpyxl 创建一个学生成绩表:
# - 设置表头样式(绿色背景、白色字体、居中)
# - 10 个学生 × 3 门课的成绩
# - 用公式计算每人总分和平均分
# - 用条件格式高亮低于 60 分的成绩(红色)

🏋️ 练习 2:合并多个 Excel

# 创建 3 个 Excel 文件(模拟 3 个月的销售数据)
# 写一个函数,把它们合并为一个 Excel:
# - 每个月一个工作表
# - 添加一个"汇总"工作表,计算总计

🏋️ 练习 3:自动生成报表

# 从一个销售数据 Excel 中:
# 1. 按品类分组统计
# 2. 生成带图表的 Excel 报告
# 3. 设置打印格式(横向、每页重复表头)

11. 今日小结

知识点
核心内容
读取
load_workbook / iter_rows / cell.value
写入
Workbook / ws.append / ws.cell / wb.save
样式
Font / PatternFill / Alignment / Border / number_format
公式
ws['D2'] = '=B2*C2' / SUM / AVERAGE / IF / VLOOKUP
图表
BarChart / LineChart / PieChart / Reference
验证
DataValidation(下拉列表/范围验证)
保护
ws.protection / freeze_panes / print_title_rows

🚀 明日预告:Day 82 — 邮件自动化

用 Python 自动发邮件!smtplib + email 库,支持纯文本、HTML、附件、批量发送。配合 openpyxl,自动生成报表并发送给老板!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 14:43:26 HTTP/2.0 GET : https://f.mffb.com.cn/a/510786.html
  2. 运行时间 : 0.381439s [ 吞吐率:2.62req/s ] 内存消耗:4,687.35kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=7c9ad5f1ecd359c3e51db74f394bc84c
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001205s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001834s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.035028s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000818s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001324s ]
  6. SELECT * FROM `set` [ RunTime:0.000632s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001504s ]
  8. SELECT * FROM `article` WHERE `id` = 510786 LIMIT 1 [ RunTime:0.001139s ]
  9. UPDATE `article` SET `lasttime` = 1787294607 WHERE `id` = 510786 [ RunTime:0.019460s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.027455s ]
  11. SELECT * FROM `article` WHERE `id` < 510786 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001233s ]
  12. SELECT * FROM `article` WHERE `id` > 510786 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006006s ]
  13. SELECT * FROM `article` WHERE `id` < 510786 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.013872s ]
  14. SELECT * FROM `article` WHERE `id` < 510786 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001973s ]
  15. SELECT * FROM `article` WHERE `id` < 510786 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.057299s ]
0.385384s