最近業(yè)務(wù)上有給客戶自動生成結(jié)算表格表格的需求,結(jié)果生成之后或舞,客戶老是反饋在微信打開表格之后淹办,里面的公式的值全都是0,使用其他專業(yè)表格軟件打開又顯示正常了
定位問題
- 微信文檔查看器低葫、表格查看器,只能對表格的值進(jìn)行查看仍律,不能對公式進(jìn)行計(jì)算嘿悬。
- xlsxwriter對表格寫入公式的時(shí)候,如果不指定公式的值水泉,xlsxwriter是不會去計(jì)算公式的值而是
以默認(rèn)值0填充
善涨。文檔:https://xlsxwriter.readthedocs.io/working_with_formulas.html
- xlsxwriter對表格寫入公式的時(shí)候,如果不指定公式的值水泉,xlsxwriter是不會去計(jì)算公式的值而是
原文:XlsxWriter doesn’t calculate the result of a formula and instead stores the value 0 as the formula result. It then sets a global flag in the XLSX file to say that all formulas and functions should be recalculated when the file is opened.
This is the method recommended in the Excel documentation and in general it works fine with spreadsheet applications. However, applications that don’t have a facility to calculate formulas will only display the 0 results. Examples of such applications are Excel Viewer, PDF Converters, and some mobile device applications.
If required, it is also possible to specify the calculated result of the formula using the optionalvalue
parameter for [write_formula()
]:
worksheet.write_formula('A1', '=2+2', num_format, 4)
(https://xlsxwriter.readthedocs.io/worksheet.html#write_formula "write_formula")
問題解析&解決方案
這是由于公式的保存的值為默認(rèn)值導(dǎo)致的問題
解決方案也比較簡單:
-
客戶使用正經(jīng)的表格軟件打開
就可以解決問題(因?yàn)榇藭r(shí)表格打開后會立即重新計(jì)算一遍公式,客戶看到的時(shí)候草则,0已經(jīng)被重新計(jì)算后覆蓋了钢拧。表格當(dāng)時(shí)就正常了)
-
考慮到客戶可能會覺得你技術(shù)不太行,為啥別人給他的表微信都正常炕横,就你給的表不行源内?
下面是技術(shù)性解決方案:
-
寫入公式的時(shí)候使用write_formula()
函數(shù),將表格公式的值一起寫進(jìn)去份殿。
-
這個(gè)解決方案看起來好像有點(diǎn)道理膜钓,實(shí)際上有個(gè)問題:我為什么要使用公式寫入到表格里面?那就是因?yàn)槲也幌雽懘a計(jì)算這些公式的值呀卿嘲!
- 終極解決方案颂斜,
打開了表格再重新保存
!除了人工手段拾枣,還可以用技術(shù)操作沃疮。Windows有com接口可以調(diào)用表格軟件(Excel盒让、WPS Office)打開表格然后保存。在打開表格的時(shí)候公式就已經(jīng)計(jì)算完畢忿磅。
- 終極解決方案颂斜,
from win32com.client import DispatchEx, Dispatch # pip install pywin32
# 讓公式有值
try:
# Excel.Application是微軟的Excel軟件糯彬,WPS是KET.Application
xl_app = DispatchEx('KET.Application') # 加了Ex可以使用獨(dú)立進(jìn)程打開,不干擾當(dāng)前已打開文件
xl_app.Visible = False # 不可見
xl_book = xl_app.Workbooks.Open(filename) # 打開表格文件
xl_book.Save() # 保存
xl_book.Close() # 關(guān)閉表格
xl_app.Quit() # 退出WPS/EXCEL
except Exception as e:
print(f'轉(zhuǎn)寫文件失敶兴:{e}')
使用第三種方案撩扒,每次打開關(guān)閉表格大概會耗時(shí)2-3秒,好處就是表格的公式正常了吨些,也不用自己計(jì)算了搓谆,客戶也滿意了;缺點(diǎn)就是如果是Linux就會比較麻煩豪墅,打開關(guān)閉表格的時(shí)候屏幕會出現(xiàn)一個(gè)小窗口一閃而過泉手。