尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于DDPG的电力市场报价策略复现与训练调参实战
最近把某篇 Trans 系列期刊里的“基于 Agent 的电力市场深度强化学习报价策略”用 Python 完整复现了一遍从读公式到改环境再到调 DDPG 训练整个流程下来踩了不少坑。这篇文章就当一次复盘把我在复现时做的关键决策、代码组织方式、训练时遇到的奇葩问题都写出来希望能给正在做类似论文复现或电力市场强化学习研究的人一点参考。这里先说明一下论文标题里的“深度决策梯度”并不是什么新算法对应到实际代码就是深度确定性策略梯度DDPG也就是 Deep Deterministic Policy Gradient。只不过有些论文作者在翻译时会用“决策梯度”这个词来表示策略梯度类方法。所以下面我会以 DDPG 为主线来展开同时会交代清楚为什么这类连续动作问题不能用 DQN 这类离散动作算法硬解。如果你正在做多智能体电力市场、电力现货报价策略、或者任何涉及连续动作的博弈决策建模这篇文章会比较对口。1. 电力市场决策问题与论文复现思路1.1 这到底是个什么问题报价而不是定价电力市场里的发电商并不是自己说了算想卖多少钱就卖多少钱。实际交易中心会收集所有报价按价格从低到高排序再结合用户侧负荷需求来确定出清价格所有成交机组通常按统一边际价格结算。这个机制很像拍卖你报高了可能卖不出去报低了虽然能成交但利润空间被压缩。所以 Agent 要学的不是“怎么定电价”而是“怎么报价”。报价是一个连续动作可以在价格上限之内取任意数值。报价策略要考虑自己的成本、系统负荷、竞争对手可能的报价、历史出清价格等一堆信息。这个问题本质上是一个多 Agent 序贯博弈所有发电商都在同时学习一个 Agent 改策略整个出清结果就变了其他 Agent 的状态转移也变了。论文复现时要做的第一件事不是急着写网络而是把这个市场机制落到代码层面。我当时的做法是写一个模拟市场环境类接收所有 Agent 的动作也就是报价系数然后按发电成本计算实际报价调用一个简单的出清函数返回每个 Agent 的中标电量和统一出清价。环境返回的奖励就是每台机组的利润。这一步看起来简单但确实最容易出错。比如报价排序时相同价格的机组怎么处理机组的中标上限怎么限制需求曲线是刚性还是弹性这些细节直接决定后续训练能不能收敛。论文里可能一句话带过“按照边际出清规则结算”但代码里每一个判断分支都要落实。1.2 为什么选深度确定性策略梯度而不是其他算法一开始我也想过 DQN但很快发现不对。DQN 输出的是离散动作的概率分布需要在有限的报价档位里做选择。可实际电力市场里报价可以是连续的即使你只允许报价格上限百分比 50% 到 150% 之间的任意值离散化之后档位稍微一多动作空间就爆炸而且相邻档位的价值差异很小DQN 很难学到精细的边际调整策略。DDPG 正好解决这个问题。它是 Actor-Critic 结构Actor 网络直接输出一个连续动作向量在一个完全确定性的市场出清环境下给定观测状态Actor 输出一个连续报价系数。Critic 网络负责评估“在这个观测和动作组合下未来期望收益有多大”。训练时用 DQN 的那套经验回放和 target 网络思想让 Critic 更新稳定再用确定性策略梯度去更新 Actor。这里还有个关键点DDPG 是 off-policy 算法可以用一个行为策略去探索环境然后把经验存进回放池随时从中采样更新。论文里的电力市场仿真需要大量交互数据如果被 on-policy 方法限制每次更新都要重新采样训练会慢到怀疑人生。off-policy 让数据利用率高很多这也是论文选这类算法的重要原因。当然多 Agent 环境下硬套单 Agent DDPG 会有非平稳问题。因为每个 Agent 的观测里如果包含对手的报价信息对手策略一变你的状态转移就变了Critic 的价值估计会乱跳。我在复现时采用的是多个 DDPG 实例并行训练每个 Agent 有自己独立的行为网络和评估网络同时环境中加入上一轮所有 Agent 的报价作为公共观测量这样能让每个智能体对竞争环境有感知。1.3 论文复现的完整工作流复现这套代码我基本按下面四步走。先通读论文里的模型定义和市场出清公式把状态空间、动作空间、奖励函数三个要素列出来。然后写环境不依赖强化学习算法先用随机策略去跑一遍检查出清逻辑和奖励数值是否合理。接着搭 DDPG 算法框架分成网络结构、经验回放、探索策略、训练主循环几个模块。最后才是调参训练盯着奖励曲线和报价行为判断是否收敛。这四个步骤里我花时间最多的是环境验证而不是神经网络。原因很简单如果环境算出的奖励平均值本身就不对后面网络学出来的策略再漂亮也是无源之水。而且论文里的公式有些符号不完整得靠购物式推断比如成本系数、容量约束这些参数具体取值很可能需要参考同领域其他文献补全。2. 环境建模核心细节从物理电网到 Agent 观测空间2.1 市场模型简化统一出清与边际定价电力市场环境我采用了最常用的简化模型。假设系统内有 N 个发电商每个发电商一台机组。每台机组有私有成本参数线性成本系数和二次成本系数。发电商向市场提交一个报价系数实际报价就等于报价系数乘以基础成本。这个报价系数的取值范围我设置成 0.5 到 1.5意思是可以在成本价的一半到一点五倍之间报价。市场运营商收到所有报价后计算每一档实际报价按价格从小到大排序然后按负荷需求逐台出清。出清时还要考虑每台机组的最大出力限制。当累计中标容量超过负荷需求后最后一次被调用的机组部分牺牲出力最后一台机组的报价就是系统统一出清价。我在环境里把负荷需求设置成一个时变函数。为了让强化学习学到的策略更贴近真实市场需求曲线不是固定数值而是包含周期性波动和随机扰动。这个设计会让出清价有波动Agent 才有必要去学习“在低需求时报低一些避免停机在高需求时报高一些吃利润”。这里有一种容易忽略的边界处理如果所有机组都报高价出清价会高于真实供需水平市场变成“卖方市场”如果都报低价利润被压没。Agent 群体要通过学习达到一个纳什均衡似的状态不会无限抬高价格也不会恶意低价竞争。2.2 观测空间与动作空间定义观测空间的设计决定了 Agent 到底能“看到”什么。我在复现时给每个 Agent 的观测包含六类信息自身机组当前成本参数、上一轮自身中标电量、上一轮统一出清价、当前负荷需求、上一轮所有 Agent 的平均报价、以及一个时间特征表示当前处于日内哪个时段。这些信息混合了私有信息与公共信息。自身成本参数是私有观测负荷需求和出清价是公共信息。这里需要注意观测空间里的数据量纲差异很大负荷可能是几百兆瓦成本是几十元每兆瓦时直接喂给神经网络容易让训练波动。我在环境里对所有连续观测做了归一化统一映射到 0 到 1 之间。动作空间是每个 Agent 的报价系数连续值输出范围需要限制。Actor 网络最后一层用 tanh 激活输出范围在 -1 到 1再映射到 0.5 到 1.5。这个映射过程我单独封装成一个函数因为后续如果改变报价范围只需要改这一处。价格上限的约束不是靠网络结构完成的。Agent 即使输出 1.5 的报价系数也要经过市场出清。但如果你不做额外惩罚Agent 可能会一直报上限价。所以我在奖励函数里已经隐含了约束报价过高导致流标利润为零这比额外加惩罚项更干净。2.3 奖励函数设计与多 Agent 博弈关系奖励函数在强化学习里直接决定策略走向。对于发电商来说最自然的奖励就是利润中标电量乘以出清价减去发电成本。如果机组没有中标奖励就是零。这里我没有加入额外惩罚项因为市场机制本身已经对不合理报价做出反馈报高了难中标报低了利润低。多 Agent 环境下每个 Agent 有自己的奖励不能简单求和以后再分配给所有 Agent。有的论文会用团队奖励但电力市场竞争场景里每个发电商都是独立利益主体应该用独立奖励。这在代码里就体现为每个 Agent 各自维护自己的 replay buffer、actor、critic训练时只采样自己的经验。由于所有 Agent 同时更新环境是非平稳的。一个 Agent 的奖励变化不仅取决于自己动作还取决于对手动作变化。让每个 Agent 观测中引入上一轮所有 Agent 的报价能缓解部分非平稳性但无法完全消除。从我的实验来看DDPG 在这种环境下还是能收敛到比较稳定的报价策略不过收敛速度会比单 Agent 环境慢不少需要耐心跑几千个 episode。3. Python 代码实现与训练实操3.1 环境准备与关键依赖我用的 Python 版本是 3.10深度学习框架选了 PyTorch版本 2.1。虽然 TensorFlow 也能写 DDPG但 PyTorch 的动态图机制在调试网络结构时舒服得多。环境仿真部分只用了 NumPy没有引入额外的电力系统仿真库因为简化市场模型本身不复杂自行实现更能确保和论文逻辑一致。Python3.10 numpy1.24 torch2.1 gymnasium0.29 # 用来定义环境接口方便包装 pandas2.0 # 记录训练日志 matplotlib3.8 # 可视化出清价格和报价曲线gymnasium 在这里不是必须的但用它的接口规范环境能省很多事。我给环境类实现了 reset、step 两个方法内部维护一个全局状态字典。每个 Agent 的外部策略拿到的观测是字典切片然后各自输出动作。环境内部一次性收集所有动作统一出清再返回下一状态和奖励。3.2 网络结构与 DDPG 核心代码DDPG 网络实现我拆成了两个类Actor 和 Critic。Actor 结构很简单输入层接观测维度两层 256 个神经元的全连接层中间用 ReLU 激活输出层用 tanh 激活。因为动作范围映射到 0.5 到 1.5tanh 输出后再做线性映射。这里我尝试过用三层全连接但效果提升有限反而增加了训练时间最终保留两层。Critic 结构稍微特殊一些它同时接收状态和动作所以我把观测输入和动作输入分开处理。观测过一个全连接层后和动作拼接在一起再过两层全连接最后输出一个 Q 值。这样搭的目的是让 Critic 在评估状态价值时能充分考虑到动作信息而不是把动作简单追加在输入后面。import torch import torch.nn as nn class Actor(nn.Module): def __init__(self, state_dim, hidden_dim256, action_dim1, action_range(0.5, 1.5)): super().__init__() self.net nn.Sequential( nn.Linear(state_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, action_dim), nn.Tanh() ) low, high action_range self.low low self.high high def forward(self, state): # tanh输出[-1,1]映射到[low, high] out self.net(state) action (out 1) / 2 * (self.high - self.low) self.low return action class Critic(nn.Module): def __init__(self, state_dim, action_dim, hidden_dim256): super().__init__() self.state_fc nn.Linear(state_dim, hidden_dim) self.fc1 nn.Linear(hidden_dim action_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, 1) def forward(self, state, action): s torch.relu(self.state_fc(state)) x torch.cat([s, action], dim-1) x torch.relu(self.fc1(x)) return self.fc2(x)这里有个很关键的细节target 网络的结构必须和主网络完全一致但权重延迟更新。我在训练时没有用 PyTorch 自带的模型拷贝而是手动写了一个软更新函数每一轮训练后将 target 网络参数按一定比例向主网络靠近。tau 0.005 def soft_update(target_net, source_net): for target_param, source_param in zip(target_net.parameters(), source_net.parameters()): target_param.data.copy_( tau * source_param.data (1 - tau) * target_param.data )软更新比例 tau 不能太大太大会导致 target 网络跟踪太紧价值估计很容易发散。论文里常见取值是 0.001 到 0.01我最终固定为 0.005。3.3 训练主循环与经验回放实现训练主循环是标准 DDPG 流程每个 episode 开始时重置环境在各台机组初始化随机成本参数。每个时间步每个 Agent 根据当前观测用带有探索噪声的 Actor 策略生成动作。环境执行动作返回奖励和下一观测存入每个 Agent 自己的 replay buffer。之后从 buffer 里随机采样 batch训练 Actor 和 Critic。探索噪声我用的是高斯噪声而不是 OU 噪声。OU 噪声在物理控制问题里有优势因为它能产生时间相关性但在报价策略上高斯噪声足够而且参数更少。噪声标准差从 0.2 开始随着 episode 数增加线性衰减到 0.02让 Agent 前期充分探索后期集中利用。class ReplayBuffer: def __init__(self, capacity200000): self.capacity capacity self.buffer [] self.pos 0 def push(self, state, action, reward, next_state): if len(self.buffer) self.capacity: self.buffer.append(None) self.buffer[self.pos] (state, action, reward, next_state) self.pos (self.pos 1) % self.capacity def sample(self, batch_size): batch random.sample(self.buffer, batch_size) state torch.FloatTensor([b[0] for b in batch]) action torch.FloatTensor([b[1] for b in batch]) reward torch.FloatTensor([b[2] for b in batch]).unsqueeze(1) next_state torch.FloatTensor([b[3] for b in batch]) return state, action, reward, next_state def train_ddpg(agent_id, policy, replay_buffer, batch_size64, gamma0.99): state, action, reward, next_state replay_buffer.sample(batch_size) with torch.no_grad(): next_action policy.target_actor(next_state) target_q reward gamma * policy.target_critic(next_state, next_action) current_q policy.critic(state, action) critic_loss nn.MSELoss()(current_q, target_q) policy.critic_optimizer.zero_grad() critic_loss.backward() policy.critic_optimizer.step() actor_loss -policy.critic(state, policy.actor(state)).mean() policy.actor_optimizer.zero_grad() actor_loss.backward() policy.actor_optimizer.step() soft_update(policy.target_actor, policy.actor) soft_update(policy.target_critic, policy.critic)要注意Critic 如果收敛不好Actor 的梯度方向是错的。所以训练时我会更关注 Critic 的 loss 曲线如果 Critic loss 一直不降Actor 大概率在瞎学。我的做法是每 50 个 episode 记录一次平均 Q 值和 Critic loss观测它们是否有相关性。3.4 多 Agent 训练组织同步更新还是交替更新多 Agent 环境里每个 Agent 虽然有独立网络但训练节奏如果错开会加剧非平稳性。我采用的是同步更新一个 episode 内收集完所有 Agent 的经验后在 episode 末尾统一更新所有 Agent。这样每个 Agent 训练时使用的都是同一轮环境交互结果经验池里的数据时间对齐。如果每个 Agent 用不同的采样频率环境交互数据会有滞后Agent 学习到的策略会落后于实际环境变化。当然同步更新的代价是单次训练耗时更长因为要依次更新 N 个网络。我的模拟环境里默认 5 个 Agent单次更新耗时仍在可接受范围内。还有一个容易忽略的点replay buffer 里存放的观测如果包含上一轮所有 Agent 报价一旦对手策略变化旧经验中记录的历史报价和新策略下的报价分布差异会很大。我在训练时设置了一个 buffer 清洗策略当评估阶段的平均报价分布发生明显偏移时只保留最近 50% 的经验。这个方法没有论文依据但实测能提高稳定性。4. 训练效果分析与调参实录4.1 如何判断收敛不是只看奖励曲线强化学习训练里最直观的就是奖励曲线但只盯着奖励曲线很容易被误导。因为电力市场是多 Agent 博弈每个 Agent 的奖励受到其他 Agent 策略影响短期波动很大。一个 Agent 奖励上升很可能是另一个 Agent 策略突然变差导致的不代表整体策略质量提升。我的判断标准有三个。第一各 Agent 的平均报价系数是否稳定在一个区间不再大范围震荡。第二统一出清价是否和理想竞争均衡价格接近不能长期偏离。第三随机种子改变后跑多次训练是否仍然收敛到相近策略如果每次结果千差万别说明训练过程不稳定。我记录了一张训练日志表每 100 个 episode 统计平均奖励、平均报价、出清价、中标率。用 pandas 保存成 CSV训练结束用 matplotlib 画曲线。其中报价曲线的稳定性是判断收敛最直观的信号。指标早期0-500中期500-1500后期1500-3000平均报价系数1.2 左右反复跳动逐步回落稳定在 1.05 附近统一出清价偏高波动剧烈波动变小进入合理区间Agent 中标率波动大各 Agent 交替中标形成稳定模式Critic Loss初期快速下降缓慢下降基本平稳这张表是我训练 3000 个 episode 后的记录。可以看到后期报价系数稳定在 1.05 附近说明 Agent 学会了在高价无法中标和低价利润微薄之间取平衡。4.2 常见问题排查奖励崩了、动作退化、不收敛我在复现中出现过三种典型问题第一个是训练到一半突然出现 NaN 奖励。排查下来是因为 Critic 的 Q 值估计溢出导致计算损失时梯度爆炸。解决办法是给奖励做归一化同时将梯度裁剪设置在 1.0。PyTorch 里用 clip_grad_norm_ 即可。第二个问题是所有 Agent 都报最高价市场变成极端卖方市场。这是典型的探索不充分Agent 没能发现低价中标后的长期收益。我调整了噪声衰减速度从 3000 个 episode 衰减改为 6000 个 episode 衰减同时把初始噪声标准差提高到 0.3。换了探索策略后报价分布明显回归理性。第三个问题是 Critic 不学习Q 值估计基本不变化。检查后发现是 reward scale 问题每度电利润在几十元到几百元之间而 Q 值初始范围很小导致 MSE loss 看起来很小但梯度更小。我把奖励除以一个基准数值缩小到 0 到 1 区间之后 Critic 才开始正常工作。还有一个藏在数据层面的问题当某个 Agent 连续多次不中标它的 replay buffer 里大量堆积“零奖励”经验。这些经验没有有效梯度导致策略学不到区分度。我增加了一个最小中标率约束在环境里给每个 Agent 一定比例的优先调度权模拟市场中的优先调度机组避免个别 Agent 彻底退出学习。4.3 调参经验网络大小、学习率与噪声策略DDPG 参数敏感性很高我在调参过程里积累了几个比较实用的经验。Actor 和 Critic 的隐藏层大小从 128 到 512 都试过最后 256 最稳。太小拟合不了状态转移中的非线性关系太大容易过拟合到历史经验泛化到新场景时反而崩溃。学习率上Critic 要比 Actor 学得快一点。我用 Actor 学习率 1e-4Critic 学习率 3e-4。这样设定有一定的理论依据Critic 需要准确估计 Q 值给 Actor 提供稳定的梯度方向。如果 Critic 学得慢Actor 会顺着错误的梯度方向更新最后越跑越歪。批量大小 64、经验回放容量 200000、折扣因子 0.99 是相对通用的配置。折扣因子 0.99 意味着 Agent 主要关注未来几十步内的收益和电力市场按小时滚动出清的周期基本匹配。如果改成 0.95Agent 会变得短视倾向于本期高价中标而牺牲未来市场份额整体收敛效果下降。探索噪声衰减必须和总 episode 数配合。我的训练总时长为 8000 个 episode前 10% 用高噪声探索中间 50% 逐步衰减最后 40% 保持低噪声微调。这个比例不是绝对的建议看报价曲线的过渡是否平滑来调整。如果衰减过快早期未探索充分后期容易被局部最优卡住。4.4 复现过程中容易被忽略的细节有几个坑论文里完全不会写但复现时特别重要。固定随机种子是第一个。PyTorch、NumPy、Python 自带的 random 三个库都要设置。如果不固定即使所有超参数相同每次训练结果都不同根本没法判断调参效果。评估策略时一定要关闭探索噪声。我在测试阶段把 Actor 的输出直接当作最终动作不做噪声添加。否则评估出的平均奖励被探索噪声污染无法反映真实策略水平。出清排序里如果用快速排序相同报价时顺序每次可能不同这会影响中标结果。我在排序时给相同报价的机组增加一个随机器排序的稳定排序策略确保市场结算公平。这个细节直接影响多 Agent 环境下某些 Agent 是否系统性地吃亏。观测归一化不能只在环境里做一次。对于在线训练新状态到来时应该复用之前计算出的均值和方差来变换不能用全量数据的统计量。我的做法是维护一个可增量更新的均值和方差估计器每收集一万条经验更新一次训练和评估时统一调用。5. 复现延伸从简化环境到更真实的市场这篇论文复现做的是简化单时段市场但思路可以扩展到更复杂的场景。比如把统一出清改成节点边际电价出清这时候 Agent 不仅要学报价还要考虑电网阻塞位置奖励函数会变成区域价格乘以区域中标电量状态空间需要加入节点间潮流信息。网络结构上可以引入图神经网络来提取电网拓扑特征。还有一个容易扩展的方向是多种结算机制对比。现在只用了统一边际价格但有些市场采用按报价支付或差价合约结算。同一样的 DDPG 代码只要改环境里的结算函数就能对比不同机制下 Agent 的报价行为和市场价格水平。这个扩展做起来很快也能让论文复现工作更有说服力。我在实际跑完这套代码之后一个很深的体会是强化学习电力市场博弈研究里环境可信度比算法复杂度重要得多。网络结构再花哨如果出清机制、回报函数和市场价格形成过程有问题训练结果都没有现实意义。这也解释了为什么论文复现第一步一定要先把环境逻辑核对清楚而不是急着写神经网络。最后再分享一个小技巧训练结束后把学到的 Actor 网络导成 ONNX 格式然后在新的天气、负荷场景下快速推理观察报价曲线和市场出清价的变化。这个步骤能帮你判断 Agent 是真的学到了电力市场供需规律还是仅仅死记硬背了训练时的负荷模式。我后续还在往这个方向接着做后续有结果了再继续更新。
RELATED

相关推荐

实时网络同步技术实战:消息模型与协同编辑完整方案

实时网络同步技术实战:消息模型与协同编辑完整方案

做实时网络同步技术,十个项目里至少有八个死在对“同步”的理解不够狠。你以为是 WebSocket 没配好,最后发现是多端更新顺序全乱;你以为是消息队列吞吐不够,结果发现是根本没人定义“一次有效的同步”到底长什么样。我在做在线文档…

📅 2026/10/22 3:51:58
RTSP转HLS实战:.NET进程化稳定推流方案

RTSP转HLS实战:.NET进程化稳定推流方案

1. 项目概述:为什么要把RTSP流转成HLS?这事儿真不是为了“炫技”你手头有一台支持RTSP协议的网络摄像头,可能是某款工业级IPC,也可能是某实验室自搭的树莓派USB摄像头方案,它能稳定输出rtsp://192.168.1.100:554/strea…

📅 2026/10/22 3:51:58
InfluxDB时序数据库原理与实战:时间即主键的原生设计

InfluxDB时序数据库原理与实战:时间即主键的原生设计

1. 这不是又一个“数据库”,而是一把专为时间刻度打磨的手术刀InfluxDB这个词,最近在运维后台、IoT设备管理界面、监控大屏配置文档里出现的频率,已经高到让不少刚接手告警系统的同学在深夜改完Grafana面板后,盯着日志里那一长串i…

📅 2026/10/22 3:51:58
MORE NEWS

更多资讯

📰

音频处理学术速递:从论文跟踪到工程落地的完整指南

1. 音频处理学术速递的定位与价值拆解1.1 这个栏目到底在解决什么问题做音频算法的人都有一个共同的痛点:这个领域太碎了。语音识别、语音合成、语音增强、音频事件检测、音乐信息检索、声学场景分类、语音分离、回声消除、带宽扩展……每一个子方向都有自己的顶会顶…

📰

Mujoco六自由度火箭LQR控制仿真:从建模到闭环实战

简介:本资源面向航天动力学仿真与控制方向的学习者与研究者,提供一套基于Mujoco物理引擎的模型火箭六自由度仿真与控制验证方案,重点解决二维矢量喷管推力方向控制与姿态稳定问题。压缩包共28个文件,约7.77MB,包含15个…

📰

UE5 C++ TSet详解:从哈希集合原理到成员函数实战

最早我在一个收集品系统里用 TArray 存“已收集物品 ID”,每次拾取都拿TArray::Contains扫一遍。数据量到几千条之后,每次拾取都要线性扫描,存档读取和 UI 刷新也跟着卡。后来把容器换成 UE5 C 的TSet,存在性判断从 O(n) 变成平均…

📰

ROS2 ArUco 工具包实战:从检测到位姿估计的避坑指南

简介:这份开源工具包面向在ROS2环境下开展计算机视觉与增强现实开发的机器人研究者、工程师及高校学生,核心解决Aruco标记的高精度识别、追踪与三维位姿估计问题。包内共21个文件,以8个Python脚本为主体,配合msg消息定义、xml与ya…

📰

计算机系统漫游:从比特到并发,构建底层认知的第一课

1. 先说清楚:这门"系统课"第一站到底在讲什么CSAPP的第一章叫《计算机系统漫游》。很多人初看这一章会觉得过于宽泛:又是信息表示,又是编译流程,又是硬件,又是操作系统,像一篇大杂烩。但我作为写…

📰

QtXlsx在VS2019下的编译配置与Excel读写实战

上个月做内部设备管理工具,客户要求把运行报表导出成Excel。桌面端技术栈很早就定死了:Qt 5.15.2配VS2019,UI部分两天收工,结果Excel读写这块硬生生卡了我大半天。QtXlsx从源码编译、VS2019工程挂接、链接报错、调试闪退&#xff…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬