在工作场景中,经常需要将EXCEl导出并发送给其他人的需求,一个sheet中的内容可能关联了好几个EXCEl才得出的,如果直接发送EXCEL,里面会带有公式,不方便查看,并且可能触发了自动计算的话会导致内容都报错了。因此需要将EXCEL中的公式都去除后,导出为正常无公式的文件后,再发送。
这里用Python实现这个功能,并且可以确保数据的除了值没有公式,其他样式都和原来的表格一模一样。
思路:
用excel中的复制sheet功能,将sheet复制到新的EXCEl,并将原来EXCEl中的值再贴到新的EXCEL。这里不使用range的copy功能,会对剪切板有影响。
import datetime
import os
import xlwings as xw
class Export_excel:
def __init__(self,wb: xw.Book) -> None:
self.wb=wb
def export_excelfile(self,exprot_filepath=None):
with self.wb.app.books.add() as nwb:
for index,wb_sheet in enumerate(self.wb.sheets):
# 注意这里的sheet是一个对象,不是sheetname
wb_sheet:xw.Sheet
if index==0:
copy_sheet:xw.Sheet=wb_sheet.copy(after=nwb.sheets[-1])
# 新建的表格会有一个默认sheet,因为copy是放在第一个表格之后的,所以此处可以把第一个sheet删除
nwb.sheets[0].delete()
# 如果第一个copy的sheet和新建表格的默认sheet重名了,名称会变,带上(1/2)之类的,这里把名称做一次重新赋值。
copy_sheet.name=wb_sheet.name
else:
copy_sheet:xw.Sheet=wb_sheet.copy(after=nwb.sheets[-1])
copy_sheet.used_range.value=wb_sheet.used_range.value
exprot_filepath=self._get_exprot_filepath(exprot_filepath)
nwb.save(exprot_filepath)
def export_excelsheet(self,sheetname,exprot_filepath=None):
with self.wb.app.books.add() as nwb:
copy_sheet:xw.Sheet=self.wb.sheets(sheetname).copy(after=nwb.sheets[-1])
nwb.sheets[0].delete()
copy_sheet.name=sheetname
# start_address=self.wb.sheets(sheetname).used_range.address.split(':')[0]
copy_sheet.used_range.value=self.wb.sheets(sheetname).used_range.value
exprot_filepath=self._get_exprot_filepath(exprot_filepath)
nwb.save(path=exprot_filepath)
def _get_exprot_filepath(self,exprot_filepath=None):
if exprot_filepath is None:
root, ext=os.path.splitext(self.wb.fullname)
return f'{root}_{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}{ext}'
else:
return exprot_filepath
def main():
with xw.Book('./自动列表.xls') as wb:
Export_excel(wb).export_excelfile()
if __name__ == '__main__':
main()
1511

被折叠的 条评论
为什么被折叠?



