批量将excel另存为pdf时报错。
将报错文件提取出来后运行原路径无误,单独运行报错文件仍然不行。
此时可以将问题定位到文件。
这是一个模糊的报错信息,网上众说纷纭,或说权限问题,或说文件已被打开,或说服务器未正确启动,一一排除后发现是文件存在隐藏表,读取第一个sheet时读取到了隐藏表导致报错。
将隐藏表取消隐藏,或者获取当前活跃表,解决问题。
import os
import win32process,win32api,win32con
import win32com.client
class abc():
def __init__(self,path):
self.path_excels = path
self.excels = []
self.name=[]
self.pdf_small = os.path.join(path, 'pdf')
if not os.path.exists(self.pdf_small):
os.makedirs(self.pdf_small)
def getexcels(self):
a=0
for i in os.listdir(self.path_excels):
if i.split('.')[-1] in ['xlsx', 'xls']:
a+=1
this_excel = os.path.join(self.path_excels, i)
self.excels.append(this_excel)
target_name = os.path.join(self.pdf_small, str(a) + '.pdf')
self.name.append(target_name)
def openexcel(self):
self.excel = win32com.client.dispatchex('excel.application')
self.excel.visible = false # 是否可视化
self.excel.displayalerts = false
for i in range(len(self.excels)):
self.exceltopdf(i)
self.close_excel_by_force()
def exceltopdf(self, i):
wb = self.excel.workbooks.open(self.excels[i], readonly=false)
ws = wb.worksheets(1)
ws.show(true)
# target_name=os.path.join(self.pdf_small,self.name[i])
ws.pagesetup.zoom = false
ws.pagesetup.fittopagestall = 1
ws.pagesetup.fittopageswide = 1
print(self.excels[i], self.name[i])
ws.exportasfixedformat(0, self.name[i][:-4]) # 不需带文件后缀
wb.close()
def run(self):
try:
self.getexcels()
if not self.name: raise typeerror('没有excel文件')
self.openexcel()
# shutil.rmtree(self.pdf_small)
except:
if self.excel:
self.close_excel_by_force()
import traceback
print(traceback.format_exc())
# wx.messagebox(traceback.format_exc())
def close_excel_by_force(self): # 关闭进程
# get the window's process id's
hwnd = self.excel.hwnd
t, p = win32process.getwindowthreadprocessid(hwnd)
# ask window nicely to close
try:
handle = win32api.openprocess(win32con.process_terminate, 0, p)
if handle:
win32api.terminateprocess(handle, 0)
win32api.closehandle(handle)
except:
pass
if __name__=='__main__':
path = r"c:\users\gzyz\desktop\dd\b1"
abc(path).run()
发表评论