我有一些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⌒っ゚Д゚)っ