pywintypes.com_error: (-2147352567, ‘发生意外。‘, (0, None, None, None, 0, -2147024809), None)

 批量将excel另存为pdf时报错。

  File "<COMObject <unknown>>", line 6, in ExportAsFixedFormat
pywintypes.com_error: (-2147352567, '发生意外。', (0, None, None, None, 0, -2147024809), None)

 将报错文件提取出来后运行原路径无误,单独运行报错文件仍然不行。

此时可以将问题定位到文件。

这是一个模糊的报错信息,网上众说纷纭,或说权限问题,或说文件已被打开,或说服务器未正确启动,一一排除后发现是文件存在隐藏表,读取第一个sheet时读取到了隐藏表导致报错。

将隐藏表取消隐藏,或者获取当前活跃表,解决问题。

ws.Visible= False

a=1
while not wb.Worksheets(a).Visible:
    a+=1
ws = wb.Worksheets(a)
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()

### 回答1: 这是一个Python错误信息,具体含义为:pywintypes.com_error: (-2147352567, '发生意外。', (, none, none, none, , -2147352565), none)。其中,-2147352567是错误代码,'发生意外。'是错误信息,(, none, none, none, , -2147352565)是错误详细信息,none表示没有值。 ### 回答2: 这个错误信息是给出的一段程序异常的提示。在Python编程中,异常指的是程序在执行时遇到了问题,无法正常执行下去的情况。而这里的异常信息有多个部分组成。 首先,我们可以看到错误信息的第一行,“pywintypes.com_error:” ,这是指发生的异常类型是“pywintypes.com_error”。这种异常通常由win32com组件在运行时发生。 其次,错误信息中给出了异常的错误代码“(-2147352567)”,这个错误代码是一个16进制的数值,通常我们无法通过这个数值直接判断出问题的具体原因。 然后,在错误信息中,我们看到了“发生意外”,这是一个非常模糊的错误描述,它并不能告诉我们实际发生了什么错误。 接着,我们可以看到一些增加了上下文的错误信息,如“(0, none, none, none, 0, -2147352565), none”等,这些信息给出了一些更具体的错误信息。其中的数字代表了错误的具体位置以及错误码,但是我们需要根据具体的程序内容来进行调试和定位错误。 总的来说,这个错误信息并没有完全指明程序中到底哪个部分出现了异常。但是通过查看错误信息中提供的一些上下文信息,以及对Python程序整体的代码和执行过程的分析,我们或许能够找到问题的根本所在,并采取相应的措施来解决它。 ### 回答3: 这个错误提示是Windows系统中常见的一种错误,是由pywintypes库提供的错误信息。首先,错误代码中-2147352567代表COM组件错误,也就是调用COMComponent Object Model)组件时发生了一些错误。其次,后面的"发生意外"是错误的简述,没有给出具体的原因。因此,我们需要分析其他参数来确定发生了什么事情。 在其他参数中,第一项0代表是系统错误,而非应用程序错误。第二项none代表错误源,第三项none代表详细错误信息,第四项none代表帮助文件,第五项0代表帮助上下文ID,最后一项-2147352565是一个HRESULT错误代码,代表权限不足。 结合以上分析,我们可以推断出这个错误可能是源于缺少足够的权限,比如用户没有管理员权限,用于操作的对象也没有足够的访问权限。因此,解决这个问题的方法也比较明显,我们需要以管理员身份重新运行程序,或者为该用户分配足够的权限。当然,也有可能是其他原因导致的错误,所以我们还需根据实际情况进行进一步的分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值