You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用openpyxl复制Excel行转列时首尾单元格显示####和0问题求助

问题分析与解决方案

异常原因

  1. ####显示问题:目标列(第3列)列宽不足,无法完整显示单元格内容,Excel自动用####替代。
  2. 末尾出现0的问题:第二个循环错误使用了源文件的最大行数mr2作为循环范围,而实际需要复制的是ws2第8行的所有列,应该用最大列数mc2。当循环行数超过原行的有效列数时,读取到空单元格,openpyxl会默认写入0值。
  3. 冗余循环:原代码中的内层j循环完全多余,因为每次读取的都是固定列/行,内层循环重复执行相同操作,浪费资源。

修正后的代码

import openpyxl as xl

# 打开源文件1
filename = "test.xlsx"
wb1 = xl.load_workbook(filename)
ws1 = wb1.worksheets[0]

# 打开源文件2
filename2 = "historicalweeklydata.xlsx"
wb2 = xl.load_workbook(filename2)
ws2 = wb2.worksheets[0]

# 打开目标文件
filename3 = "test3.xlsx"
wb3 = xl.load_workbook(filename3)
ws3 = wb3.active

# 保存文件名
filename4 = "new.xlsx"

# 获取源文件1的行数(用于复制第一列到目标第2列)
mr = ws1.max_row

# 插入需要的列
ws3.insert_cols(2)
ws3.insert_cols(3)

# 复制test.xlsx第一列到目标文件第2列
for i in range(1, mr + 1):
    # 读取源文件第i行第1列
    cell_value = ws1.cell(row=i, column=1).value
    # 写入目标文件第i行第2列
    ws3.cell(row=i, column=2).value = cell_value

# 复制historicalweeklydata.xlsx第8行到目标文件第3列(转成列)
# 获取源文件2的最大列数(第8行的列数)
mc2 = ws2.max_column
for i in range(1, mc2 + 1):
    # 读取源文件第8行第i列
    cell_value = ws2.cell(row=8, column=i).value
    # 跳过空单元格,避免写入0
    if cell_value is None:
        continue
    # 写入目标文件第i行第3列
    ws3.cell(row=i, column=3).value = cell_value

# 设置目标第3列的列宽,解决####显示问题
ws3.column_dimensions['C'].width = 15  # 根据实际内容调整宽度

# 保存文件
wb3.save(filename4)

关键修改说明

  • 移除了冗余的内层j循环,简化代码逻辑
  • 第二个循环改用mc2(源文件2的最大列数)作为循环范围,确保只复制第8行的有效列内容
  • 添加空单元格判断,避免空值被写入为0
  • 设置目标列(C列)的列宽,解决内容显示不全导致的####问题

内容的提问来源于stack exchange,提问作者BlaiseThomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:18:19