鱼C论坛

 找回密码
 立即注册
查看: 224|回复: 2

[已解决]删除excel行导致下面的行前三列的数据被合并

[复制链接]
发表于 2024-10-6 15:11:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#定义一个删除空行的函数
def delete_empty_rows(sheet):
# 删除第7行开始的空行
    rows_to_delete = []
    for row in range(7, 999):
        if sheet.cell(row=row, column=1).value is None:
            rows_to_delete.append(row)

    for row in reversed(rows_to_delete):
        sheet.delete_rows(idx=row)

删除空行的函数如上,对空行进行判断并删除空行

现在问题是删除空行执行侯,对所有999后面的行出现了异常操作,列1,2,3的值被合并为一个单元格,只保存列1的值


外观检验        合格        检验员                        日期                        年       月       日
如上,外观检验 合格 检验员是列1,2,3的数据,执行删除空行函数后,如下
外观检验                                日期                        年       月       日

查下来是行1001,1002执行了三列单元格的合并操作,解除合并后能恢复三个数据。
求助怎么解决

最佳答案
2024-10-6 15:17:58
您遇到的问题是删除空行后,意外对后面的行进行了合并操作。根据描述,大概率是由于Excel对象模型在删除行后,行中的某些属性(例如合并单元格属性)没有被正确处理导致的。

在OpenPyXL中,删除行时需要特别注意已经合并的单元格,因为合并单元格跟普通单元格在删除时的行为会不同。为避免这个问题,我们可以先解除合并单元格,然后再进行删除操作。

以下是处理步骤:

1. **解除合并单元格**:
   在删除空行之前,先遍历并解除需要删除行的合并单元格。这可以确保删除行时不会影响到合并区域。

2. **删除空行**:
   按照您现有的方法删除空行。

以下是代码示例:
from openpyxl import load_workbook

def delete_empty_rows(sheet):
    max_row = sheet.max_row  # 获取当前工作表的最大行数
    rows_to_delete = []

    # 解除合并单元格
    for merge in sheet.merged_cells.ranges:
        # 检测是否有任何合并单元格包含在我们的删除行范围内
        if merge.min_row >= 7 and merge.min_row <= max_row:
            sheet.unmerge_cells(str(merge))

    # 检查第7行开始的行是否为空
    for row in range(7, max_row + 1):
        # 假设我们仅在第一列为空时认为整行为空
        if sheet.cell(row=row, column=1).value is None:
            rows_to_delete.append(row)

    # 删除标记的空行
    for row in reversed(rows_to_delete):
        sheet.delete_rows(idx=row)

# 示例用法
wb = load_workbook('your_file.xlsx')
ws = wb.active  # 假设您在第一个工作表
delete_empty_rows(ws)
wb.save('updated_file.xlsx')

**注意事项**:
- 确保在删除合并单元格之前,文件没有其它会影响的数据应用。
- 建议在操作前备份Excel文件,以防数据丢失。

这样处理完之后,应该不会再有合并单元格的问题出现。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-10-6 15:17:10 | 显示全部楼层
这个问题可以用其他办法解决,但是我还是想知道怎么会这样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-6 15:17:58 | 显示全部楼层    本楼为最佳答案   
您遇到的问题是删除空行后,意外对后面的行进行了合并操作。根据描述,大概率是由于Excel对象模型在删除行后,行中的某些属性(例如合并单元格属性)没有被正确处理导致的。

在OpenPyXL中,删除行时需要特别注意已经合并的单元格,因为合并单元格跟普通单元格在删除时的行为会不同。为避免这个问题,我们可以先解除合并单元格,然后再进行删除操作。

以下是处理步骤:

1. **解除合并单元格**:
   在删除空行之前,先遍历并解除需要删除行的合并单元格。这可以确保删除行时不会影响到合并区域。

2. **删除空行**:
   按照您现有的方法删除空行。

以下是代码示例:
from openpyxl import load_workbook

def delete_empty_rows(sheet):
    max_row = sheet.max_row  # 获取当前工作表的最大行数
    rows_to_delete = []

    # 解除合并单元格
    for merge in sheet.merged_cells.ranges:
        # 检测是否有任何合并单元格包含在我们的删除行范围内
        if merge.min_row >= 7 and merge.min_row <= max_row:
            sheet.unmerge_cells(str(merge))

    # 检查第7行开始的行是否为空
    for row in range(7, max_row + 1):
        # 假设我们仅在第一列为空时认为整行为空
        if sheet.cell(row=row, column=1).value is None:
            rows_to_delete.append(row)

    # 删除标记的空行
    for row in reversed(rows_to_delete):
        sheet.delete_rows(idx=row)

# 示例用法
wb = load_workbook('your_file.xlsx')
ws = wb.active  # 假设您在第一个工作表
delete_empty_rows(ws)
wb.save('updated_file.xlsx')

**注意事项**:
- 确保在删除合并单元格之前,文件没有其它会影响的数据应用。
- 建议在操作前备份Excel文件,以防数据丢失。

这样处理完之后,应该不会再有合并单元格的问题出现。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表