问题遇到的现象和发生背景
python的xlwings模块报错:pywintypes.com_error: (-2147352567, '发生意外。', (0, None, None, None, 0, -2147024809), None)
问题相关代码,请勿粘贴截图
import pandas as pd
import xlwings as xw
app = xw.App(visible=False, add_book=False) # 启动excel程序
hlb = app.books.open('汇率表.xls') # 打开读取汇率簿
hlb_b = hlb.sheets[0] # 读取工作表
bz = hlb_b.range('A1').expand('down').value # 读取第一列币种形成列表
hl = hlb_b.range('B1').expand('down').value # 读取第二列汇率形成列表
hlb.close() # 关闭工作簿
print(f'第一阶段{bz, hl}') # 输出第一阶段监测点ok
bz_hl = dict(zip(bz, hl)) # 组成币种:汇率的字典
wb = app.books.open('fnd_gfm_930958.xls')
ws = wb.sheets[0]
sj = ws.range(1, 1).expand('right').value # 读取第一行字段列表
hs = ws.range(1, 1).expand('down').rows.count
print(f'第三阶段{sj, hs}') # 输出第三阶段监测点ok
hb = ['开证单位', '承付银行', '承付币种'] # 定义需要识别的两个字段
a = sj.index(hb[0])+1 # 了解对应字段在工作表的列数
b = sj.index(hb[1])+1 # 承付银行字段
c = sj.index(hb[2])+1 # 承付币种字段
print(f'第四阶段{a, b, c}') # 输出第四阶段监测点ok ** 这里会停顿一会儿**
lst = [] # 列空表
lst_bz = [] # 币种空列表
for i in range(1, hs): # 遍历两列字段做合并
sc1 = ws.range(i+1, a).value # 获取对应单元格值
sc2 = ws.range(i+1, b).value
sc3 = ws.range(i+1, c).value
sc = r'{}-{}'.format(sc1, sc2) # 合并字段:开证单位-承付银行
lst += [sc] # 组成列表【开证单位-承付银行】
lst_bz += [sc3] # 组成币种列表
print(f'第五阶段{lst}') # 输出第五阶段监测点ok
jg = list(set(lst)) # 筛选掉重复值,形成无重复列表
jg_bz = list(set(lst_bz))
jg_bz = sorted(jg_bz) # 将币种按照字母顺序排列
print(f'第六阶段{jg_bz}') # 输出第六阶段监测点ok
jg_gs = len(jg) # 列表个数
jg_bz_gs = len(jg_bz)
print(f'第七阶段{jg_gs}') # 输出第七阶段监测点ok
ws2 = wb.sheets.add(name='输出结果', after=ws)
ws2.range(2, 1).value = ['开证单位', '承付银行', '折合人民币金额'] # 编写正常文字
ws2.range(1, 2).value = '承付币种'
for j in range(jg_gs): # 遍历列表【开证单位-承付银行】
sr = jg[j].split('-') # 拆分列表字段:开征单位 承付银行 两个列表
print(f'第八阶段{sr}') # 输出第八阶段监测点ok 然后后面的就运行不了出现报错
ws2.range(j+3, 0).value = sr[0] # 工作表输入字段1
ws2.range(j+3, 1).value = sr[1]
for j in range(jg_bz_gs): # 遍历币种列表
ws2.range(1, j+4).value = jg_bz[j] # 输入字段
ws2.autofit('c') # 自动调整列宽
data = pd.read_excel('fnd_gfm_930958.xls') # 利用pandas模块读取excel数据
print(data['承付金额'].sum())
for x in jg_bz: # 遍历币种列表
shuzi = jg_bz.index(x) # 找到币种列表的位数
try:
dy_hl = bz_hl[x] # 在币种-汇率字典找到对应币种的汇率值
ws2.range(2, shuzi+4).value = dy_hl # 书写在第二行
except KeyError:
ws2.range(2, shuzi+4).value = ' ' #填写第二行币种
lst2 = []
for x in range(jg_gs): # 遍历列表【开证单位-承付银行】对应书写行数
for y in range(jg_bz_gs): # 遍历币种列表对应书写列数
d = jg[x].split('-')
e = data[(data['开证单位'] == d[0]) & (data['承付银行'] == d[1]) & (data['承付币种'] == jg_bz[y])
& (data['已拒付'] == 'N') & (data['财务备注'].str.contains('购汇'))] # 利用筛选条件筛选数据
f = e['承付金额'].sum() # 筛选数据简单求和
g = e['申请使用外汇金额'].sum() # 筛选出使用外汇金额
lst2 += [f-g]
# print(f)
ws2.range(x+3, y+40).value = f-g
wb.save("结果文件.xls") # 保存工作簿
wb.close()
app.quit()
运行结果及报错内容
我的解答思路和尝试过的方法
百度过,说是之前的文档还打开着才会出现这种报错,但是我这是在一个excel里操作,为啥也会