使用Py复制Excel公式时公式中出现@符号,用户可见@,Py print出来却见不到

我有一些Excel表格需要每个月都去处理,简而言之是我有若干个Excel子表格,需要从中提取出某些特定的数据,然后将这些子表格中的特定数据取出,放到一个汇总表当中,于是我在子表格下方写了很多Excel公式用于提取这些子表格中的特定数据,子表格每个月的格式大同小异,于是我就写了一段Py代码用于复制特定区域(子表格下方公式区域)到下个月的同名子表格的相同位置。

Ps:在书写公式时,发现相同文件夹目录下的Excel工作簿之间的引用在公式中以相对路径呈现,因此我每个月的子表格、汇总表名称都是相同的,只是所处的文件夹不同,例如都是桌面上的11月文件夹、12月文件夹。

然后代码能够读取到公式也能够复制,也能够粘贴,但是在粘贴时会在公式中某些位置添加@符号,进而导致公式计算错误(有的公式不受影响,有的受影响)这些@符号确实存在,我可以看到,也可以将其复制下来,可剪切下来,通过ctrl H替换为空后公式正常。但是通过print输出发现,Py无法发现所有公式中的@。不知如何解决,遂求教各位网友。

循环引用可能是提示INDEX的参数包括了F35单元格,但是这在上月表格中是可以正常计算的


F35=@INDEX(1:99,B33,D35)   (所有的@都是复制后莫名添加的,所有表格所有内容均不含@)

D35计算正常,不存在@。

B33异常=MAX(IF(@A:A="员工小计",@ROW(A:A))),A列存在多个员工小计,这个单元格是读取最后一个的行号,因此采用了MAX函数。

import openpyxl
import os



#代码块1

# 获取用户输入的月份
month = input("请输入月份,(例如:11,12,1等):")
# 定义通用目录路径
base_path = r'C:\Users\Administrator\Desktop'
# 生成完整的目录路径
directory_path = os.path.join(base_path, f'{month}月')
# 获取目录下的所有文件和文件夹
file_list = os.listdir(directory_path)
# 打印文件列表
for file in file_list:
    print(file)
# 函数:复制指定区域内容
def copy_range(src_sheet, src_range, dest_sheet, dest_start_cell):
    # 获取源区域中的所有单元格
    src_cells = src_sheet[src_range]
    # 获取目标开始单元格的行和列
    dest_start_row = dest_start_cell.row
    dest_start_col = dest_start_cell.column

    # 遍历源区域的每一行
    for i, row in enumerate(src_cells):
        # 遍历每一行中的每一个单元格
        for j, cell in enumerate(row):
            # 将源单元格的值复制到目标单元格
            dest_sheet.cell(row=dest_start_row + i, column=dest_start_col + j).value = cell.value

            
# 代码块2:复制电子表格

# 函数:复制指定区域内容(保留公式)
def copy_range(src_sheet, src_range, dest_sheet, dest_start_cell):
    src_cells = src_sheet[src_range]
    dest_start_row = dest_start_cell.row
    dest_start_col = dest_start_cell.column
    for i, row in enumerate(src_cells):
        for j, cell in enumerate(row):
            dest_cell = dest_sheet.cell(row=dest_start_row + i, column=dest_start_col + j)
            if cell.has_style:
                dest_cell._style = cell._style
            if cell.data_type == openpyxl.cell.cell.TYPE_FORMULA:
                dest_cell.value = f"={cell.value[1:]}"
            else:
                try:
                    dest_cell.value = cell.value
                except AttributeError:
                    if isinstance(cell, openpyxl.cell.cell.MergedCell):
                        continue  # 跳过合并单元格的值复制
# 月份已在代码块1中获取
month = int(month)  # 将月份转换为整数
# 确定上个月和这个月的目录路径
previous_month = month
next_month = month + 1 if month < 12 else 1
# 构建上个月和这个月的目录路径
previous_directory = os.path.join(r'C:\Users\Administrator\Desktop', f'{previous_month}月')
current_directory = os.path.join(r'C:\Users\Administrator\Desktop', f'{next_month}月')
# 定义文件名
file_name = '电子表格.xlsx'
# 打开上个月和本月的表格文件
src_path = os.path.join(previous_directory, file_name)
dest_path = os.path.join(current_directory, file_name)
# 加载工作簿
src_wb = openpyxl.load_workbook(src_path, data_only=False)
dest_wb = openpyxl.load_workbook(dest_path, data_only=False)
# 定义要复制的工作表及其范围
sheets_ranges = {
    'Sheet1': ('A41:P70', 'A41'),
    'Sheet2': ('A31:F50', 'A31'),
    'Sheet3': ('A31:F50', 'A31'),
    'Sheet4': ('A31:F50', 'A31')
}
# 遍历每个工作表并复制指定区域
for sheet_name, (src_range, dest_start) in sheets_ranges.items():
    src_sheet = src_wb[sheet_name]
    dest_sheet = dest_wb[sheet_name]
    dest_start_cell = dest_sheet[dest_start]
    copy_range(src_sheet, src_range, dest_sheet, dest_start_cell)
# 保存本月的表格文件
dest_wb.save(dest_path)
print("公式已成功从上个月复制到本月。")

 中间的代码就是其他几个工作簿的复制,不再赘述

# 代码块8:替换所有 Excel 文件中的 @ 符号为空,并打印替换前后的内容以及替换统计

# 获取代码块1中已经生成的文件列表
excel_files = [file for file in file_list if file.endswith('.xlsx') and not file.startswith('~')]
# 初始化总计替换 @ 符号的计数器
total_at_count = 0
# 遍历每个 Excel 文件进行替换操作
for file_name in excel_files:
    file_path = os.path.join(current_directory, file_name)
    wb = openpyxl.load_workbook(file_path, data_only=False)
    for sheet in wb.worksheets:
        at_count = 0  # 用于统计每个表中替换的 @ 符号数量
        for row in sheet.iter_rows():
            for cell in row:
                if cell.value and isinstance(cell.value, str):
                    # 检查是否包含 @ 符号
                    if '@' in cell.value:
                        # 打印替换前的内容
                        print(f"替换前:工作表 {sheet.title} - 单元格 {cell.coordinate} - 内容 {cell.value}")
                        # 替换 @ 符号
                        new_value = cell.value.replace('@', '')
                        # 打印替换后的内容
                        print(f"替换后:工作表 {sheet.title} - 单元格 {cell.coordinate} - 内容 {new_value}")
                        # 更新单元格内容
                        cell.value = new_value
                        at_count += 1  # 增加计数
                        total_at_count += 1  # 增加总计计数
                    else:
                        # 打印无 @ 符号的单元格
                        print(f"无 @:工作表 {sheet.title} - 单元格 {cell.coordinate} - 内容 {cell.value}")
        # 打印每个表中替换的 @ 符号数量
        print(f"工作表 {sheet.title} 中替换了 {at_count} 个 @ 符号。")
    wb.save(file_path)
    print(f"已成功替换 {file_name} 中的 @ 符号。")
# 打印总计替换的 @ 符号数量
print(f"总计替换了 {total_at_count} 个 @ 符号。")
print("所有 Excel 文件中的 @ 符号已替换为空。")

 

输出结果是:

总计替换了 0 个 @ 符号。
所有 Excel 文件中的 @ 符号已替换为空。
指定单元格的公式已成功写入 12 月文件。

怎样才能去掉这个@呀,替换代码根本识别不到@,没有任何一个单元格识别到了@,求救c⌒っ゚Д゚)っ

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值