在多线程里面使用win32com调用com组件的时候,需要用pythoncom.CoInitialize初始化一下。
最后还需要用pythoncom.CoUninitialize释放资源。
python
import win32com.client as win32
import pythoncom
def copy_all_sheets_to_single_file(source_files, destination_file):
pythoncom.CoInitialize()
excel = win32.gencache.EnsureDispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
try:
destination_workbook = excel.Workbooks.Add()
destination_sheet = destination_workbook.Worksheets(1)
destination_sheet2 = destination_workbook.Worksheets(2)
row_offset = 0
for index, source_file in enumerate(source_files):
source_workbook = excel.Workbooks.Open(source_file)
source_sheet = source_workbook.Worksheets("Sheet1")
source_sheet2 = source_workbook.Worksheets("Sheet2")
source_range = source_sheet.UsedRange
source_range2 = source_sheet2.UsedRange
if index != 0:
add_number = 6
else:
add_number = 0
source_range.Copy(destination_sheet.Range("A" + str(row_offset + 1 + add_number)))
source_range2.Copy(destination_sheet2.Range("A" + str(row_offset + 1 + add_number)))
row_offset += source_range.Rows.Count
source_workbook.Close(SaveChanges=False) # 不保存更改,避免提示保存对话框
destination_workbook.SaveAs(destination_file)
except Exception as e:
print(f"Error occurred: {str(e)}")
finally:
destination_workbook.Close()
excel.Quit()
excel.Application.Quit()
win32.pythoncom.CoUninitialize()
# 使用示例
source_files = ["路径/到/源文件1.xlsx", "路径/到/源文件2.xlsx", ..., "路径/到/源文件10.xlsx"]
destination_file = "路径/到/目标文件.xlsx"
# 使用示例
soure_file = r"C:\Users\Administrator\Documents\Book1.xlsx"
soure_file2 = r"C:\Users\Administrator\Documents\Book2.xlsx"
source_files = [soure_file, soure_file2]
destination_file = r"C:\Users\Administrator\Documents\Book_new.xlsx"
copy_all_sheets_to_single_file(source_files, destination_file)
# 使用示例
soure_file = r"C:\Users\Administrator\Documents\Book1.xlsx"
soure_file2 = r"C:\Users\Administrator\Documents\Book2.xlsx"
source_files = [soure_file, soure_file]
destination_file = r"C:\Users\Administrator\Documents\Book_new.xlsx"
# copy_all_sheets_to_single_file(source_files, destination_file)