我整天都在寻找解决这个问题的方法,但似乎找不到任何解决方法。我最初的目标是找到一种通过python库使用excel自动填充的方法,但这似乎是不可能的。
到目前为止,我已经尝试过xlwings和openpyxl来执行以下操作:在工作表中编写一个非常简单的excel公式。我知道我可以做与python内部公式相同的操作,但是我希望打开excel的人可以看到该公式,所以我不希望它消失。
=IF(AB41<>"";CONCATENATE(AB41;".";AC41);"")
使用openpyxl
总是损坏文件,并且excel通过删除公式来对其进行修复。
使用xlwings
时遇到一个特殊错误(请参见下文)。
我不明白为什么这必须这么困难。这些库只需要将公式打印到单元格上,然后让excel进行解释即可。
Traceback (most recent call last):
File "C:/Users/David/Google Drive/Jobs/1.Efe/Transporte/0.MODEL/rungams7.py", line 109, in <module>
FLOWNREL("AD48","AD109",ws10)
File "C:/Users/David/Google Drive/Jobs/1.Efe/Transporte/0.MODEL/rungams7.py", line 65, in FLOWNREL
ws.range((i,col)).value = '=IF('+cell2.get_address(False, False) + '<>"";0;"")'
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\main.py", line 1495, in value
conversion.write(data, self, self._options)
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\conversion\__init__.py", line 35, in write
pipeline(ctx)
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\conversion\framework.py", line 66, in __call__
stage(*args, **kwargs)
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\conversion\standard.py", line 91, in __call__
self._write_value(ctx.range, ctx.value, scalar)
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\conversion\standard.py", line 71, in _write_value
rng.raw_value = value
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\main.py", line 1116, in raw_value
self.impl.raw_value = data
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\_xlwindows.py", line 709, in raw_value
self.xl.Value = data
File "C:\Users\David\Anaconda3\lib\site-packages\xlwings\_xlwindows.py", line 98, in __setattr__
return setattr(self._inner, key, value)
File "C:\Users\David\Anaconda3\lib\site-packages\win32com\client\dynamic.py", line 565, in __setattr__
self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value)
pywintypes.com_error: (-2147352567, 'Ocurrió una excepción.', (0, None, None, None, 0, -2146827284), None)
XLWINGS
中的代码:
def FLOWNREL(startcell,endcell,ws):
startrow = coordinate_from_string(startcell)[1]
endrow=coordinate_from_string(endcell)[1]
col = column_index_from_string(coordinate_from_string(startcell)[0])
for i in range(startrow, endrow + 1, 1):
cell2 = ws.range(i,col-2)
cell3 = ws.range(i,col-1)
print(i,col,cell2.get_address(False,False),cell3.get_address(False,False))
# ws.range((i,col)).value='=IF('+cell2.get_address(False,False)+'<>"";CONCATENATE('+cell2.get_address(False,False)+';".";'+cell3.get_address(False,False)+');"")'
ws.range((i,col)).value = '=IF('+cell2.get_address(False, False) + '<>"";0;"")'
print(ws.range(i,col).value)
wb = xw.Book(dir_path+"\\Input EfE.xlsx")
ws10=wb.sheets["_FlowsNRel"]
FLOWNREL("AD48","AD109",ws10)
wb.save()
答案 0 :(得分:0)
好的,根据PEH的提示,我设法找到了错误。 欧洲excel使用“;”而美国人使用“,”来分隔公式的不同部分。 即使在excel中,我也使用“;”在python中,似乎我应该使用“,”使其在openpyxl中工作。
因此,对于将来的读者:请注意,欧洲版本和美国版本之间在excel公式之间的差异!
谢谢!