python-嘗試將Excel檔案儲存為圖片並加上浮水印

來源:互聯網
上載者:User

標籤:修改   roo   new   mem   bbs   noi   excel   otl   ams   

python-嘗試將Excel檔案儲存為圖片並加上浮水印

情境:並不是將 excel 的 chart 產生圖片,而是將整個表格內容產生圖片。

1. 準備工作

目前搜尋不到已有的方法,只能自己嘗試寫一個,想法有兩個:

  1. 通過 Python 的圖片處理庫PIL,將 Excel 內資訊逐寫到圖片上;

  2. 通過另存新檔 HTML 檔案,利用Phantomjs的工具,截取到 HTML 。比較曲折的方法,但可能更容易上手。

我選擇了後者,雖然每一步都不太熟練,但是先逐個擊破吧!

2. Excel to HTML2.1 嘗試直接另存新檔 HTML 不成功

這一步參考 [How do I save Excel Sheet as HTML in Python?
]https://stackoverflow.com/questions/19631511/how-do-i-save-excel-sheet-as-html-in-python ,
需要先在 excel 裡編輯好一個,再運行如下代碼:

from win32com.client import Dispatchxl = Dispatch(‘Excel.Application‘)xl.Workbooks.Open(‘C:\Foo\Bar.xlsx‘)#xl.Visible = True -- optionalxl.Application.Run("SaveHTML")xl.Workbooks.Close

使用上面的代碼報錯,資訊如下:

com_error: (-2147352567, ‘發生意外。‘, (0, ‘Microsoft Excel‘, ‘無法運行“SaveHTML”宏。可能是因為該宏在此活頁簿中不可用,或者所有的宏都被禁用。‘, ‘xlmain11.chm‘, 0, -2146827284), None)

我因為需要大量產生 Excel,覺得這個方法不太適合我,就跳過了。

2.2 使用 Python 編輯現成的 html 模板,再修改自己需要的資訊。

需要用到selenium3chromedriver和對應的 Chrome 版本。https://www.cnblogs.com/technologylife/p/5829944.html
一個簡短的程式:

from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_options = Options()chrome_options.add_argument(‘--headless‘) #無介面chrome_options.add_argument(‘--disable-gpu‘)br = webdriver.Chrome(chrome_options=chrome_options) #執行個體化瀏覽器br.set_window_size(1024,700) #設定視窗大小br.get(‘F:/file.htm‘)br.get_screenshot_as_file("F:\\file.png")br.quit() #退出很重要
3. 修改 HTML 檔案

這裡需要本地開啟一個html檔案,修改後再用瀏覽器開啟。

3.1 遇到編碼轉碼問題

我的HTML檔案編碼是’gb2312’,這是Excel2010匯出的預設編碼。我用Python開啟這個檔案一直報錯!

UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe5 in position 4: ordinal not in range

前後折騰了10個小時!一直在decode encode!其實根本不是這個問題!問題只是:
千萬不要有中文檔案名稱和路徑!
都被自己的愚蠢驚到了。只要做到這樣,再配合這句:

#開啟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修改網頁

棄療,即使有修改網頁字串的方式,我也發現太難找到我需要修改的元素,因為它不支援xpath定位。因此我直接用字串的replace方式。

4. 控制Google瀏覽器

code:

# -*- coding: utf-8 -*-"""Created on Tue Jan 30 21:00:45 2018@author: xglc"""from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom PIL import Imagechrome_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)    # 截取當前視窗,並指定圖片的儲存位置    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)
  1. 通過調整瀏覽器視窗來控制大小,效果還不錯。目前已知缺陷是,還沒協調好被調用時候的記憶體使用量問題,可能直接產生一個alpha通道值為240的圖片,更節省資源。

  2. 這麼一搞,有時候儲存個中文路徑或者圖片也做不到了。可能跟前面的編解碼有關。

?

python-嘗試將Excel檔案儲存為圖片並加上浮水印

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.