Excel/WPS表格 列名列号转换(以列号获取列名、以列名获取列号)

文章介绍了如何在Python脚本中使用openpyxl库时,提供更便捷的列号或列名写入功能。作者分享了一对一转换方法,包括基础版实现及用于验证列名的正则表达式,同时鼓励读者提出更优解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:
做表格的读写操作,想让脚本面向使用者有最大的便利性,兼容支持通过列号(第N列)或者列名(AB列)来指定写入列的位置

解决方案:

  • openpyxl.utils 中提供有相关模块,可以直接使用
from openpyxl.utils import column_index_from_string, get_column_letter

查看源码,发现该模块实现转换的方式是先递归枚举一遍形成映射字典,然后查字典返回结果,且默认最大支持到 “ZZZ” 列。
为了环保 [\手动狗头]🤭,所以想直接一对一转换实现,就出现了下一条解决方案,简化重现他的部分代码逻辑直接实现一对一转换。

  • 一对一直接转换

基础版开箱即用:

from typing import Union
import re


MAX_COLUMN_NUM = 16384
MAX_COLUMN_NAME = 'XFD'


def get_column_name(column_number: Union[int, 
根据上述代码再在WPS开发工具选项中编写VB宏代码程序,对Excel文件中源工作表表格数据进行筛选统计汇总,已知该Excel文件源工作表内的数据格式如下: 0.源工作表名为“告警记录”。 1.第一行为当前源工作表数据统计起止时间行,格式:<统计日期:年-月-日 时:分:秒 至 年-月-日 时:分:秒>。 2.第二行为当前源工作表标题行,标题“信名称”在第二行第三、标题“故障类型”在第二行第五、标题“发生时间”在第二行第六其数据格式为<年-月-日 时:分:秒>、标题“恢复时间”在第二行第七其数据格式为<年-月-日 时:分:秒>、标题“持续时间”在第二行第八其数据格式为<时:分:秒>、标题“故障详情”在第二行第九。 3.第三行开始为当前源工作表数据行的起始行。 4.第二行第三标题“信名称”单元格数据格式有两种,以判断该单元格内“信名称”字符串中是否包含'/'进行自动区分?若遍历该字符串内包含有'/',则再判断有几个'/'?若只包含1个'/'则该单元格内数据格式:<节目名称1/节目名称2_卫星名称1>;若包含2个'/'则该单元格内数据格式:<节目名称1/节目名称2/节目名称3_卫星名称1>;若包含3个'/'则该单元格内数据格式:<节目名称1/节目名称2/节目名称3/节目名称4_卫星名称1>以此类推。若遍历该字符串内没有'/',则该单元格内数据格式:<节目名称1_卫星名称1>。 5.针对第二行第九标题“故障详情”每个单元格内数据字符串进行遍历,若标题“故障详情”单元格内同时包含字符串<PAT>及<Table_ID为0x00>则引用当前行“信名称”单元格内的所有“节目名称1/2/3...”分别表示当前该“节目名称1/2/3...”PAT表丢失;若标题“故障详情”单元格内同时包含字符串<PMT>及<Table_ID为0x02>则再判断该单元格数据包含几个'、'?若为0个则标题“故障详情”该单元格数据格式:<PMT表规定时间内未出现Table_ID为0x02的段:'PMT_ID1'('节目简写1')>,若为1个则标题“故障详情”该单元格数据格式:<PMT表规定时间内未出现Table_ID为0x02的段:'PMT_ID1'('节目简写1')、'PMT_ID2'('节目简写2')>以此类推; 上述描述完该Excel文件源工作表内的全局数据格式的前提下,请另新建一页工作表并命名“卫星节目故障统计表”并满足以下针对源工作表节目故障筛选统计的要求: 1.在“卫星节目故障统计表”工作表创建标题行:[影响卫星]、[影响节目]、[发生时间]、[结束时间]、[持续时间]、[故障类型]; 2.规定“卫星节目故障统计表”工作表标题行[发生时间][结束时间]两整单元格数据字符串格式:<年-月-日 时:分:秒>显示,[持续时间]单元格数据字符串格式由<时:分:秒>转换为<秒>显示,工作表单元格全部居中显示; 3.依据源工作表内标题行“信名称”整单元格数据进行筛选相同名称行并根据该“信名称”单元格内字符串中是否包含'/'自动进行“信名称”数据格式区分; 4.根据第3点在筛选行中提取“信名称”单元格数据格式内的“卫星名称1”并依次顺序赋值到“卫星节目故障统计表”工作表标题行[影响卫星]下方单元格; 5.根据第3点先判断被筛选出的“信名称”单元格内“节目名称1/2/3...N”的数量,再在被筛选行中依次提取“信名称”单元格数据格式内的“节目名称1/2/3...N”并依次赋值到“卫星节目故障统计表”工作表标题行[影响节目]下方单元格再按照“节目名称”是否相同进行上下排序;
最新发布
07-04
<think>我们根据新的要求调整代码:1.将持续时间转换为秒(已实现)2.设置目标工作表的所有单元格居中显示3.其他要求与之前相同注意:在之前的代码中,我们已经处理了时间格式持续时间转换。现在需要添加单元格居中的设置。修改点:-在代码最后,添加设置目标工作表整个数据区域居中的代码。另外,注意标题行已经设置,所以居中的范围是从A1到最后一(F)的最后一数据行。步骤:1.创建目标工作表并写入数据2.设置时间的格式(之前已做)3.设置整个数据区域(包括标题)居中我们将使用以下代码设置居中:dstSheet.Range("A1:F"& dstRow -1).HorizontalAlignment =xlCenter注意:因为dstRow是下一个空行的行,所以数据最后一行是dstRow-1。同时,我们还需要考虑标题行(第1行)也要居中。完整代码:</think>以下是根据您的最新要求完善的VBA宏代码,增加了单元格居中显示功能并优化了数据处理逻辑: ```vb Sub GenerateSatelliteProgramReportV3() Dim srcSheet As Worksheet Dim dstSheet As Worksheet Dim lastRow As Long, dstRow As Long Dim signalCell As Range, detailCell As Range Dim signalStr As String, detailStr As String Dim programs() As String, satellite As String Dim programCount As Integer, i As Integer Dim durationSeconds As Long ' 设置源工作表目标工作表 Set srcSheet = ThisWorkbook.Sheets("告警记录") ' 创建目标工作表(如果存在则先删除) Application.DisplayAlerts = False On Error Resume Next ThisWorkbook.Sheets("卫星节目故障统计表").Delete On Error GoTo 0 Application.DisplayAlerts = True Set dstSheet = ThisWorkbook.Sheets.Add(After:=srcSheet) dstSheet.Name = "卫星节目故障统计表" ' 创建目标表头 dstSheet.Range("A1:F1") = Array("影响卫星", "影响节目", "发生时间", "结束时间", "持续时间()", "故障类型") ' 获取源数据最后行 lastRow = srcSheet.Cells(srcSheet.Rows.Count, "C").End(xlUp).Row dstRow = 2 ' 目标表起始行 ' 遍历源数据行(从第3行开始) For Each dataRow In srcSheet.Range("C3:C" & lastRow).Rows Set signalCell = dataRow.Cells(1, 1) ' C(信名称) Set detailCell = signalCell.Offset(0, 6) ' I(故障详情) signalStr = CStr(signalCell.Value) detailStr = CStr(detailCell.Value) ' 解析信名称 Dim splitSignal() As String splitSignal = Split(signalStr, "_") If UBound(splitSignal) < 1 Then GoTo NextRow ' 跳过无效格式 satellite = splitSignal(UBound(splitSignal)) ' 获取卫星名称 ' 提取所有节目名称 Dim programStr As String programStr = Left(signalStr, Len(signalStr) - Len(satellite) - 1) programs = Split(programStr, "/") programCount = UBound(programs) + 1 ' 获取当前行其他数据 Dim occurTime As String, resumeTime As String, durationStr As String, faultType As String occurTime = FormatDateTime(signalCell.Offset(0, 3).Value, vbGeneralDate) ' F(发生时间) resumeTime = FormatDateTime(signalCell.Offset(0, 4).Value, vbGeneralDate) ' G(恢复时间) durationStr = signalCell.Offset(0, 5).Value ' H(持续时间) faultType = signalCell.Offset(0, 2).Value ' E(故障类型) ' 将持续时间转换为秒 durationSeconds = ConvertDurationToSeconds(durationStr) ' 为每个节目创建记录 For i = 0 To programCount - 1 dstSheet.Cells(dstRow, 1) = satellite dstSheet.Cells(dstRow, 2) = programs(i) dstSheet.Cells(dstRow, 3) = occurTime dstSheet.Cells(dstRow, 4) = resumeTime dstSheet.Cells(dstRow, 5) = durationSeconds dstSheet.Cells(dstRow, 6) = faultType dstRow = dstRow + 1 Next i NextRow: Next dataRow ' 按节目名称排序 If dstRow > 2 Then With dstSheet.Sort .SortFields.Clear .SortFields.Add Key:=dstSheet.Range("B2:B" & dstRow - 1), _ SortOn:=xlSortOnValues, Order:=xlAscending .SetRange dstSheet.Range("A1:F" & dstRow - 1) .Header = xlYes .Apply End With End If ' 设置时间格式 dstSheet.Columns("C:D").NumberFormat = "yyyy-mm-dd hh:mm:ss" dstSheet.Columns("E").NumberFormat = "0" ' 自动调整宽 dstSheet.Columns("A:F").AutoFit ' 设置所有单元格居中显示 If dstRow > 2 Then With dstSheet.Range("A1:F" & dstRow - 1) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With End If ' 冻结标题行 dstSheet.Rows(1).FreezePanes = True MsgBox "卫星节目故障统计表生成完成!共处理 " & dstRow - 2 & " 条记录。" End Sub ' 将时:分:秒格式转换为秒 Function ConvertDurationToSeconds(durationStr As String) As Long Dim parts() As String Dim hours As Integer, minutes As Integer, seconds As Integer ' 分割时间字符串 parts = Split(durationStr, ":") ' 确保有三部分 If UBound(parts) < 2 Then ConvertDurationToSeconds = 0 Exit Function End If ' 转换为数值 On Error Resume Next hours = CInt(parts(0)) minutes = CInt(parts(1)) seconds = CInt(parts(2)) On Error GoTo 0 ' 计算总秒数 ConvertDurationToSeconds = hours * 3600 + minutes * 60 + seconds End Function ``` ### 主要优化功能: 1. **单元格居中显示**: ```vb With dstSheet.Range("A1:F" & dstRow - 1) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With ``` - 设置整个数据区域(包括标题行)水平居中垂直居中 - 仅当有数据时执行(`If dstRow > 2 Then`) 2. **时间格式处理**: - 使用`FormatDateTime`确保时间格式统一 - 持续时间显示为纯数字(秒数) - 时间应用自定义格式`"yyyy-mm-dd hh:mm:ss"` 3. **用户体验增强**: - 添加标题行冻结:`dstSheet.Rows(1).FreezePanes = True` - 自动调整宽保持美观 - 完成时显示处理记录数量的消息框 4. **错误处理优化**: - 跳过无效的信名称格式 - 持续时间转换添加错误处理 - 空表检查防止运行时错误 ### 完整功能说明: 1. **数据提取流程**: - 解析信名称 → 分离卫星名节目名 - 提取时间信息 → 格式化为标准时间格式 - 转换持续时间 → 时:分:秒 → 秒数 - 复制故障类型 → 保持原样 2. **数据处理逻辑**: ```mermaid graph TD A[遍历源数据行] --> B{解析信名称} B -->|成功| C[提取节目名表] B -->|失败| D[跳过此行] C --> E[获取时间数据] E --> F[转换持续时间] F --> G[为每个节目创建记录] G --> H[添加到目标表] H --> I[排序节目名称] I --> J[设置格式居中] ``` 3. **输出格式要求**: | 列名 | 格式 | 说明 | |--------------|---------------------|----------------------| | 影响卫星 | 文本 | 居中显示 | | 影响节目 | 文本 | 居中显示,按字母排序 | | 发生时间 | yyyy-mm-dd hh:mm:ss | 居中显示 | | 结束时间 | yyyy-mm-dd hh:mm:ss | 居中显示 | | 持续时间() | 数字 | 居中显示 | | 故障类型 | 文本 | 居中显示 | ### 使用说明: 1. 在WPS Excel中按`Alt+F11`打开VBA编辑器 2. 插入新模块并粘贴上述代码 3. 运行宏`GenerateSatelliteProgramReportV3` 4. 结果将输出到新建的"卫星节目故障统计表",具有以下特点: - 所有单元格内容居中显示 - 标题行冻结方便查看 - 时间格式统一规范 - 节目名称按字母顺序排序 - 持续时间显示为秒数 ### 注意事项: - 确保源数据格式符合描述要求 - 如果信名称格式不符合`节目1/节目2/..._卫星名`规范,该行将被跳过 - 持续时间转换仅支持`时:分:秒`格式,其他格式可能返回0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值