python将excel转换成图片_python-尝试将Excel文件保存为图片并加上水印
python-嘗試將Excel文件保存為圖片并加上水印
場景:并不是將 excel 的 chart 生成圖片,而是將整個(gè)表格內(nèi)容生成圖片。
1. 準(zhǔn)備工作
目前搜索不到已有的方法,只能自己嘗試寫一個(gè),想法有兩個(gè):
通過 Python 的圖片處理庫PIL,將 Excel 內(nèi)信息逐寫到圖片上;
通過另存為 HTML 文件,利用Phantomjs的截圖工具,截取到 HTML 。比較曲折的方法,但可能更容易上手。
我選擇了后者,雖然每一步都不太熟練,但是先逐個(gè)擊破吧!
2. Excel to HTML
2.1 嘗試直接另存為 HTML 不成功
from win32com.client import Dispatch
xl = Dispatch('Excel.Application')
xl.Workbooks.Open('C:\Foo\Bar.xlsx')
#xl.Visible = True -- optional
xl.Application.Run("SaveHTML")
xl.Workbooks.Close
使用上面的代碼報(bào)錯(cuò),信息如下:
com_error: (-2147352567, '發(fā)生意外。', (0, 'Microsoft Excel', '無法運(yùn)行“SaveHTML”宏。可能是因?yàn)樵摵暝诖斯ぷ鞑局胁豢捎?#xff0c;或者所有的宏都被禁用。', 'xlmain11.chm', 0, -2146827284), None)
我因?yàn)樾枰罅可?Excel,覺得這個(gè)方法不太適合我,就跳過了。
2.2 使用 Python 編輯現(xiàn)成的 html 模板,再修改自己需要的信息。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless') #無界面
chrome_options.add_argument('--disable-gpu')
br = webdriver.Chrome(chrome_options=chrome_options) #實(shí)例化瀏覽器
br.set_window_size(1024,700) #設(shè)置窗口大小
br.get('F:/file.htm')
br.get_screenshot_as_file("F:\\file.png")
br.quit() #退出很重要
3. 修改 HTML 文件
這里需要本地打開一個(gè)html文件,修改后再用瀏覽器打開。
3.1 遇到編碼轉(zhuǎn)碼問題
我的HTML文件編碼是’gb2312’,這是Excel2010導(dǎo)出的默認(rèn)編碼。我用Python打開這個(gè)文件一直報(bào)錯(cuò)!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 4: ordinal not in range
前后折騰了10個(gè)小時(shí)!一直在decode encode!其實(shí)根本不是這個(gè)問題!問題只是:
千萬不要有中文文件名和路徑!
都被自己的愚蠢驚到了。只要做到這樣,再配合這句:
#打開
data = open("F://ktd.htm","r").read().decode("gb2312","ignore")
#保存
f = open('F:/data.htm','w')
f.write(data.encode("gb2312","ignore"))
f.close()
基本就搞定了。
3.2 使用beautifulsoup修改網(wǎng)頁
棄療,即使有修改網(wǎng)頁字符串的方式,我也發(fā)現(xiàn)太難找到我需要修改的元素,因?yàn)樗恢С謝path定位。因此我直接用字符串的replace方式。
4. 控制Google瀏覽器截圖
code:
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 30 21:00:45 2018
@author: xglc
"""
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
chrome_options = Options()
#chrome_options.add_argument('--headless') #無頭
#chrome_options.add_argument('--disable-gpu')
br = webdriver.Chrome(chrome_options=chrome_options)
br.set_window_size(950,830)
def _pic(name):
br.get('F:/zqht/%s.htm'%name)
# 截取當(dāng)前窗口,并指定截圖圖片的保存位置
path = 'F:/ktd/new/%s.png'%(name)
br.get_screenshot_as_file(path)
_sy(path)
# br.quit()
def _sy(path):
lp = Image.open(path)
tp = Image.open('F:/work/zq/zqz.gif') #水印
# rgba_image = lp.convert('RGBA')
# rgba_watermark = tp.convert('RGBA')
img = tp.convert('RGBA')
r, g, b, alpha = img.split()
alpha = alpha.point(lambda i: i>0 and 240)
img.putalpha(alpha)
image_x, image_y = lp.size
watermark_x, watermark_y = tp.size
# 水印位置 mask是通道值,240+ 是透明效果
lp.paste(img, (image_x - watermark_x, image_y - watermark_y),mask = alpha)
print ('保存圖片')
lp.save('F:/lala.png',"PNG")
if __name__ == '__main__':
name = 'bgs'
_pic(name)
通過調(diào)整瀏覽器窗口來控制截圖大小,效果還不錯(cuò)。目前已知缺陷是,還沒協(xié)調(diào)好被調(diào)用時(shí)候的內(nèi)存使用問題,可能直接生成一個(gè)alpha通道值為240的圖片,更節(jié)省資源。
這么一搞,有時(shí)候保存?zhèn)€中文路徑或者圖片也做不到了。可能跟前面的編解碼有關(guān)。
?
總結(jié)
以上是生活随笔為你收集整理的python将excel转换成图片_python-尝试将Excel文件保存为图片并加上水印的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP协议实现文件传输
- 下一篇: websocket python爬虫_p