import os from openpyxl import load_workbook import docx # 合并docx文件 def merge_docx(file_list, merged_file_name): # 如果合并后的文件已存在,则直接返回 if os.path.exists(merged_file_name): return # 创建合并后的文档对象 merged_doc = docx.Document() # 合并文件内容 for file_name in file_list: doc = docx.Document(file_name) for para in doc.paragraphs: merged_doc.add_paragraph(para.text) for table in doc.tables: merged_doc.add_table(table.rows, table.columns) # 保存合并后的文档 merged_doc.save(merged_file_name) # 读取Excel文件 workbook = load_workbook(filename=r'D:\好记薪\工商资料生成\表格.xlsx') sheet = workbook['需调用文档'] # 判断C列是否为空 if sheet['C2'].value: # 合并A、B文档 merge_docx([r'D:\好记薪\工商资料生成\A公司登记申请书.docx', r'D:\好记薪\工商资料生成\B股东会决议.docx'], 'AB.docx') if sheet['C3'].value or sheet['C4'].value or sheet['C5'].value or sheet['C6'].value: # 合并A、B、C文档 merge_docx([r'D:\好记薪\工商资料生成\A公司登记申请书.docx', r'D:\好记薪\工商资料生成\B股东会决议.docx', r'D:\好记薪\工商资料生成\C章程.docx'], 'ABC.docx') if sheet['C7'].value: # 合并A、B、C、D文档 merge_docx([r'D:\好记薪\工商资料生成\A公司登记申请书.docx', r'D:\好记薪\工商资料生成\B股东会决议.docx', r'D:\好记薪\工商资料生成\C章程.docx', r'D:\好记薪\工商资料生成\D股权转让协议.docx'], 'ABCD.docx') if sheet['C8'].value: # 合并A、B、C、E文档 merge_docx([r'D:\好记薪\工商资料生成\A公司登记申请书.docx', r'D:\好记薪\工商资料生成\B股东会决议.docx', r'D:\好记薪\工商资料生成\C章程.docx', r'D:\好记薪\工商资料生成\E有关债务清偿及担保情况说明.docx'], 'ABCE.docx')
时间: 2024-04-02 14:32:40 浏览: 165
这段代码看起来没有明显的问题,但是需要注意的是,在使用openpyxl库时,如果你的Excel文件是旧版本的(比如.xls格式的),则需要使用xlrd库进行读取,openpyxl只支持新版本(比如.xlsx格式的)Excel文件。另外,如果你的代码中使用了其他库或者函数,请检查它们是否存在问题。如果以上方法都不能解决问题,请提供更多的错误信息和相关代码,方便我更好地帮助你。
相关问题
import os from openpyxl import load_workbook import docx # 读取Excel文件 workbook = load_workbook(filename=r'D:\好记薪\工商资料生成\表格.xlsx') sheet = workbook['需调用文档'] # 判断C列是否为空 if sheet['C2'].value: # 合并A、B文档 merge_docx(['A.docx', 'B.docx'], 'AB.docx') if sheet['C3'].value or sheet['C4'].value or sheet['C5'].value or sheet['C6'].value: # 合并A、B、C文档 merge_docx(['A.docx', 'B.docx', 'C.docx'], 'ABC.docx') if sheet['C7'].value: # 合并A、B、C、D文档 merge_docx(['A.docx', 'B.docx', 'C.docx', 'D.docx'], 'ABCD.docx') if sheet['C8'].value: # 合并A、B、C、E文档 merge_docx(['A.docx', 'B.docx', 'C.docx', 'E.docx'], 'ABCE.docx') # 合并docx文件 def merge_docx(file_list, merged_file_name): # 如果合并后的文件已存在,则直接返回 if os.path.exists(merged_file_name): return # 创建合并后的文档对象 merged_doc = docx.Document() # 合并文件内容 for file_name in file_list: doc = docx.Document(file_name) for para in doc.paragraphs: merged_doc.add_paragraph(para.text) for table in doc.tables: merged_doc.add_table(table.rows, table.columns) # 保存合并后的文档 merged_doc.save(merged_file_name),报错:NameError: name 'merge_docx' is not defined
你的代码中调用了`merge_docx`函数,但是在调用之前并没有定义该函数,因此导致了`NameError: name 'merge_docx' is not defined`错误。
为了解决这个问题,你应该把`merge_docx`函数定义提到调用的前面,或者把它定义在另一个文件中并且在当前文件中导入。如下所示:
```
import os
from openpyxl import load_workbook
import docx
# 合并docx文件
def merge_docx(file_list, merged_file_name):
# 如果合并后的文件已存在,则直接返回
if os.path.exists(merged_file_name):
return
# 创建合并后的文档对象
merged_doc = docx.Document()
# 合并文件内容
for file_name in file_list:
doc = docx.Document(file_name)
for para in doc.paragraphs:
merged_doc.add_paragraph(para.text)
for table in doc.tables:
merged_doc.add_table(table.rows, table.columns)
# 保存合并后的文档
merged_doc.save(merged_file_name)
# 读取Excel文件
workbook = load_workbook(filename=r'D:\好记薪\工商资料生成\表格.xlsx')
sheet = workbook['需调用文档']
# 判断C列是否为空
if sheet['C2'].value:
# 合并A、B文档
merge_docx(['A.docx', 'B.docx'], 'AB.docx')
if sheet['C3'].value or sheet['C4'].value or sheet['C5'].value or sheet['C6'].value:
# 合并A、B、C文档
merge_docx(['A.docx', 'B.docx', 'C.docx'], 'ABC.docx')
if sheet['C7'].value:
# 合并A、B、C、D文档
merge_docx(['A.docx', 'B.docx', 'C.docx', 'D.docx'], 'ABCD.docx')
if sheet['C8'].value:
# 合并A、B、C、E文档
merge_docx(['A.docx', 'B.docx', 'C.docx', 'E.docx'], 'ABCE.docx')
```
这样就可以避免`NameError: name 'merge_docx' is not defined`错误。
import os import pandas as pd from openpyxl import load_workbook from openpyxl.utils.dataframe import dataframe_to_rows # 指定要合并的文件夹路径 folder_path = r"E:\aaaa\aaaa" fields_to_write = ['aaaa', 'aaaa'] # 获取文件夹中所有的 xlsx 文件路径 xlsx_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')] # 创建一个空的 DataFrame 用于存储合并后的数据 merged_data = pd.DataFrame() # 循环读取每个 xlsx 文件,将它们合并到 merged_data 中 for xlsx_file in xlsx_files: # 使用 pandas 读取 xlsx 文件,并清理无效字符引用 wb = load_workbook(filename=xlsx_file, read_only=False, data_only=True, keep_vba=False, keep_links=False, keep_protection=False) for sheet_name in wb.sheetnames: ws = wb[sheet_name] for row in ws.rows: for cell in row: cell.value = cell.value if cell.value is None else str(cell.value).strip() df = pd.read_excel(wb) # 将读取到的数据追加到 merged_data 中 merged_data = merged_data.append(df, ignore_index=True) # 在 merged_data 中添加新的一列数据 merged_data['new_column'] = 'new_value' # 创建一个新的工作簿 wb_new = load_workbook(write_only=True) ws_new = wb_new.create_sheet('merged_data') # 将 DataFrame 中的数据逐行写入到新的工作簿中 rows = dataframe_to_rows(merged_data[fields_to_write + ['new_column']], index=False) for row in rows: ws_new.append(row) # 保存合并后的数据到新的 xlsx 文件中 wb_new.save(r"E:\aaaa\aaaa\merged_file.xlsx")使用此代码会出现ValueError: Invalid file path or buffer object type: <class 'openpyxl.workbook.workbook.Workbook'>的报错,请优化下
根据报错信息,我猜测可能是在 `pd.read_excel(wb)` 这一行代码中出现了问题。`pd.read_excel()` 方法中的参数应该是文件路径或文件对象,而不是工作簿对象。因此,你可以先将工作簿保存为文件,然后再使用 `pd.read_excel()` 方法读取文件中的内容。修改后的代码如下:
```python
import os
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
# 指定要合并的文件夹路径
folder_path = r"E:\aaaa\aaaa"
fields_to_write = ['aaaa', 'aaaa']
# 获取文件夹中所有的 xlsx 文件路径
xlsx_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith('.xlsx')]
# 创建一个空的 DataFrame 用于存储合并后的数据
merged_data = pd.DataFrame()
# 循环读取每个 xlsx 文件,将它们合并到 merged_data 中
for xlsx_file in xlsx_files:
# 使用 pandas 读取 xlsx 文件,并清理无效字符引用
wb = load_workbook(filename=xlsx_file, read_only=False, data_only=True, keep_vba=False, keep_links=False, keep_protection=False)
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for row in ws.rows:
for cell in row:
cell.value = cell.value if cell.value is None else str(cell.value).strip()
# 将工作簿保存为临时文件
temp_file = f"{os.path.splitext(xlsx_file)[0]}_temp.xlsx"
wb.save(temp_file)
# 读取临时文件中的数据
df = pd.read_excel(temp_file)
# 删除临时文件
os.remove(temp_file)
# 将读取到的数据追加到 merged_data 中
merged_data = merged_data.append(df, ignore_index=True)
# 在 merged_data 中添加新的一列数据
merged_data['new_column'] = 'new_value'
# 创建一个新的工作簿
wb_new = load_workbook(write_only=True)
ws_new = wb_new.create_sheet('merged_data')
# 将 DataFrame 中的数据逐行写入到新的工作簿中
rows = dataframe_to_rows(merged_data[fields_to_write + ['new_column']], index=False)
for row in rows:
ws_new.append(row)
# 保存合并后的数据到新的 xlsx 文件中
wb_new.save(r"E:\aaaa\aaaa\merged_file.xlsx")
```
这样修改后,你应该就可以成功合并文件并保存为新的 xlsx 文件了。
阅读全文