使用openpyxl复制Excel行转列时首尾单元格显示####和0问题求助
问题分析与解决方案
异常原因
- ####显示问题:目标列(第3列)列宽不足,无法完整显示单元格内容,Excel自动用####替代。
- 末尾出现0的问题:第二个循环错误使用了源文件的最大行数
mr2作为循环范围,而实际需要复制的是ws2第8行的所有列,应该用最大列数mc2。当循环行数超过原行的有效列数时,读取到空单元格,openpyxl会默认写入0值。 - 冗余循环:原代码中的内层
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
相关产品推荐
相关产品推荐

