将excelsheet从一个作品sheet复制到Python中的另一个
Copy excel sheet from one worksheet to another in Python
我只想将 sheet 从 excel 工作簿复制到 Python 中的另一个 excel 工作簿。
我想保留所有格式(彩色单元格、表格等)
我有许多 excel 个文件,我想将所有文件中的第一个 sheet 复制到一个工作簿中。如果对任何单个工作簿进行了更改,我还希望能够更新主工作簿。
这是一个代码块,每隔几个小时 运行 并更新主传播sheet。
我试过 pandas,但它不保留格式和表格。
我试过 openpyxl 没用
我认为下面的 xlwings 代码可以工作:
import xlwings as xw
wb = xw.Book('individual_files\file1.xlsx')
sht = wb.sheets[0]
new_wb = xw.Book('Master Spreadsheet.xlsx')
new_wb.sheets["Sheet1"] = sht
但我只是得到错误:
----> 4 new_wb.sheets["Sheet1"] = sht
AttributeError: __setitem__
"file1.xlsx"上面是第一个excel文件的例子。
"Master Spreadsheet.xlsx" 是我的主要传播sheet 所有个人文件。
改编自 this solution,但请注意,在我的(有限)测试中(以及在其他问答中观察到的),这不支持 Copy
的 After
参数方法,只有 Before
。如果您尝试使用 After
,它会创建一个新的工作簿。
import xlwings as xw
wb = xw.Book('individual_files\file1.xlsx')
sht = wb.sheets[0]
new_wb = xw.Book('Master Spreadsheet.xlsx')
# copy this sheet into the new_wb *before* Sheet1:
sht.api.Copy(Before=new_wb.sheets['Sheet1'].api)
# now, remove Sheet1 from new_wb
new_wb.sheets['Sheet1'].delete()
最后我这样做了:
def copyExcelSheet(sheetName):
read_from = load_workbook(item)
#open(destination, 'wb').write(open(source, 'rb').read())
read_sheet = read_from.active
write_to = load_workbook("Master file.xlsx")
write_sheet = write_to[sheetName]
for row in read_sheet.rows:
for cell in row:
new_cell = write_sheet.cell(row=cell.row, column=cell.column,
value= cell.value)
write_sheet.column_dimensions[get_column_letter(cell.column)].width = read_sheet.column_dimensions[get_column_letter(cell.column)].width
if cell.has_style:
new_cell.font = copy(cell.font)
new_cell.border = copy(cell.border)
new_cell.fill = copy(cell.fill)
new_cell.number_format = copy(cell.number_format)
new_cell.protection = copy(cell.protection)
new_cell.alignment = copy(cell.alignment)
write_sheet.merge_cells('C8:G8')
write_sheet.merge_cells('K8:P8')
write_sheet.merge_cells('R8:S8')
write_sheet.add_table(newTable("table1","C10:G76","TableStyleLight8"))
write_sheet.add_table(newTable("table2","K10:P59","TableStyleLight9"))
write_to.save('Master file.xlsx')
read_from.close
用这个来检查 sheet 是否已经存在:
#checks if sheet already exists and updates sheet if it does.
def checkExists(sheetName):
book = load_workbook("Master file.xlsx") # open an Excel file and return a workbook
if sheetName in book.sheetnames:
print ("Removing sheet",sheetName)
del book[sheetName]
else:
print ("No sheet ",sheetName," found, will create sheet")
book.create_sheet(sheetName)
book.save('Master file.xlsx')
用这个创建新表:
def newTable(tableName,ref,styleName):
tableName = tableName + ''.join(random.choices(string.ascii_uppercase + string.digits + string.ascii_lowercase, k=15))
tab = Table(displayName=tableName, ref=ref)
# Add a default style with striped rows and banded columns
tab.tableStyleInfo = TableStyleInfo(name=styleName, showFirstColumn=False,showLastColumn=False, showRowStripes=True, showColumnStripes=True)
return tab
这可以使用pywin32 directly. The Before or After parameter needs to be provided (see the api docs)来完成,参数需要是工作表<对象>,不只是工作表名称或索引值。因此,例如,将其添加到现有工作簿的末尾:
def copy_sheet_within_excel_file(excel_filename, sheet_name_or_number_to_copy):
excel_app = win32com_client.gencache.EnsureDispatch('Excel.Application')
wb = excel_app.Workbooks.Open(excel_filename)
wb.Worksheets[sheet_name_or_number_to_copy].Copy(After=wb.Worksheets[wb.Worksheets.Count])
new_ws = wb.ActiveSheet
return new_ws
由于我的大部分代码都在最终用户机器上运行,所以我不想假设 Excel 是否打开,所以我的代码确定 Excel 是否已经打开(请参阅GetActiveObject),如:
try:
excel_app = win32com_client.GetActiveObject('Excel.Application')
except com_error:
excel_app = win32com_client.gencache.EnsureDispatch('Excel.Application')
然后我还检查工作簿是否已加载(参见 Workbook.FullName)。遍历 Application.Workbooks 测试 FullName 以查看文件是否已打开。如果是这样,请抓住那个 wb 作为你的 wb 句柄。
您可能会发现这有助于直接从 pywin32 挖掘可用的 Excel API:
def show_python_interface_modules():
os.startfile(os.path.dirname(win32com_client.gencache.GetModuleForProgID('Excel.Application').__file__))
我只想将 sheet 从 excel 工作簿复制到 Python 中的另一个 excel 工作簿。
我想保留所有格式(彩色单元格、表格等)
我有许多 excel 个文件,我想将所有文件中的第一个 sheet 复制到一个工作簿中。如果对任何单个工作簿进行了更改,我还希望能够更新主工作簿。
这是一个代码块,每隔几个小时 运行 并更新主传播sheet。
我试过 pandas,但它不保留格式和表格。
我试过 openpyxl 没用
我认为下面的 xlwings 代码可以工作:
import xlwings as xw
wb = xw.Book('individual_files\file1.xlsx')
sht = wb.sheets[0]
new_wb = xw.Book('Master Spreadsheet.xlsx')
new_wb.sheets["Sheet1"] = sht
但我只是得到错误:
----> 4 new_wb.sheets["Sheet1"] = sht
AttributeError: __setitem__
"file1.xlsx"上面是第一个excel文件的例子。
"Master Spreadsheet.xlsx" 是我的主要传播sheet 所有个人文件。
改编自 this solution,但请注意,在我的(有限)测试中(以及在其他问答中观察到的),这不支持 Copy
的 After
参数方法,只有 Before
。如果您尝试使用 After
,它会创建一个新的工作簿。
import xlwings as xw
wb = xw.Book('individual_files\file1.xlsx')
sht = wb.sheets[0]
new_wb = xw.Book('Master Spreadsheet.xlsx')
# copy this sheet into the new_wb *before* Sheet1:
sht.api.Copy(Before=new_wb.sheets['Sheet1'].api)
# now, remove Sheet1 from new_wb
new_wb.sheets['Sheet1'].delete()
最后我这样做了:
def copyExcelSheet(sheetName):
read_from = load_workbook(item)
#open(destination, 'wb').write(open(source, 'rb').read())
read_sheet = read_from.active
write_to = load_workbook("Master file.xlsx")
write_sheet = write_to[sheetName]
for row in read_sheet.rows:
for cell in row:
new_cell = write_sheet.cell(row=cell.row, column=cell.column,
value= cell.value)
write_sheet.column_dimensions[get_column_letter(cell.column)].width = read_sheet.column_dimensions[get_column_letter(cell.column)].width
if cell.has_style:
new_cell.font = copy(cell.font)
new_cell.border = copy(cell.border)
new_cell.fill = copy(cell.fill)
new_cell.number_format = copy(cell.number_format)
new_cell.protection = copy(cell.protection)
new_cell.alignment = copy(cell.alignment)
write_sheet.merge_cells('C8:G8')
write_sheet.merge_cells('K8:P8')
write_sheet.merge_cells('R8:S8')
write_sheet.add_table(newTable("table1","C10:G76","TableStyleLight8"))
write_sheet.add_table(newTable("table2","K10:P59","TableStyleLight9"))
write_to.save('Master file.xlsx')
read_from.close
用这个来检查 sheet 是否已经存在:
#checks if sheet already exists and updates sheet if it does.
def checkExists(sheetName):
book = load_workbook("Master file.xlsx") # open an Excel file and return a workbook
if sheetName in book.sheetnames:
print ("Removing sheet",sheetName)
del book[sheetName]
else:
print ("No sheet ",sheetName," found, will create sheet")
book.create_sheet(sheetName)
book.save('Master file.xlsx')
用这个创建新表:
def newTable(tableName,ref,styleName):
tableName = tableName + ''.join(random.choices(string.ascii_uppercase + string.digits + string.ascii_lowercase, k=15))
tab = Table(displayName=tableName, ref=ref)
# Add a default style with striped rows and banded columns
tab.tableStyleInfo = TableStyleInfo(name=styleName, showFirstColumn=False,showLastColumn=False, showRowStripes=True, showColumnStripes=True)
return tab
这可以使用pywin32 directly. The Before or After parameter needs to be provided (see the api docs)来完成,参数需要是工作表<对象>,不只是工作表名称或索引值。因此,例如,将其添加到现有工作簿的末尾:
def copy_sheet_within_excel_file(excel_filename, sheet_name_or_number_to_copy):
excel_app = win32com_client.gencache.EnsureDispatch('Excel.Application')
wb = excel_app.Workbooks.Open(excel_filename)
wb.Worksheets[sheet_name_or_number_to_copy].Copy(After=wb.Worksheets[wb.Worksheets.Count])
new_ws = wb.ActiveSheet
return new_ws
由于我的大部分代码都在最终用户机器上运行,所以我不想假设 Excel 是否打开,所以我的代码确定 Excel 是否已经打开(请参阅GetActiveObject),如:
try:
excel_app = win32com_client.GetActiveObject('Excel.Application')
except com_error:
excel_app = win32com_client.gencache.EnsureDispatch('Excel.Application')
然后我还检查工作簿是否已加载(参见 Workbook.FullName)。遍历 Application.Workbooks 测试 FullName 以查看文件是否已打开。如果是这样,请抓住那个 wb 作为你的 wb 句柄。
您可能会发现这有助于直接从 pywin32 挖掘可用的 Excel API:
def show_python_interface_modules():
os.startfile(os.path.dirname(win32com_client.gencache.GetModuleForProgID('Excel.Application').__file__))