python-尝试将Excel文件保存为图片并加上水印
2018-02-01 14:57
351 查看
python-尝试将Excel文件保存为图片并加上水印
场景:并不是将 excel 的 chart 生成图片,而是将整个表格内容生成图片。
1. 准备工作
目前搜索不到已有的方法,只能自己尝试写一个,想法有两个:
-
通过 Python 的图片处理库
PIL
,将 Excel 内信息逐写到图片上; -
通过另存为 HTML 文件,利用
Phantomjs
的截图工具,截取到 HTML 。比较曲折的方法,但可能更容易上手。
我选择了后者,虽然每一步都不太熟练,但是先逐个击破吧!
2. Excel to HTML
2.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 Dispatch xl = Dispatch('Excel.Application') xl.Workbooks.Open('C:\Foo\Bar.xlsx') #xl.Visible = True -- optional xl.Application.Run("SaveHTML") xl.Workbooks.Close
使用上面的代码报错,信息如下:
com_error: (-2147352567, '发生意外。', (0, 'Microsoft Excel', '无法运行“SaveHTML”宏。可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用。', 'xlmain11.chm', 0, -2146827284), None)
我因为需要大量生成 Excel,觉得这个方法不太适合我,就跳过了。
2.2 使用 Python 编辑现成的 html 模板,再修改自己需要的信息。
需要用到
selenium3、
chromedriver和对应的 Chrome 版本。https://www.geek-share.com/detail/2683713443.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) #实例化浏览器 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 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) # 截取当前窗口,并指定截图图片的保存位置 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)
-
通过调整浏览器窗口来控制截图大小,效果还不错。目前已知缺陷是,还没协调好被调用时候的内存使用问题,可能直接生成一个
alpha
通道值为240的图片,更节省资源。 -
这么一搞,有时候保存个中文路径或者图片也做不到了。可能跟前面的编解码有关。
相关文章推荐
- 使用WPF将图片转变为灰度并加上水印并保存为文件
- 远程图片自动保存到本地并为图片加上水印
- 一般处理程序处理图片(动态给图片加上水印、保存缩略图、验证码)
- Android图片添加水印图片并把图片保存到文件存储的实现代码
- 给图片加上带版权的水印
- TypeError: cannot concatenate 'str' and 'list' objects和Python读取和保存图片
- 为freetextbox1.6.5上传图片加上水印
- Python中用PIL库批量给图片加上序号的教程
- Android Canvas 给图片加上水印
- python爬虫得图片并保存到文件夹里
- NO.2 Python读入图片并灰度显示并保存退出
- Python爬虫实战(1)——百度贴吧抓取帖子并保存内容和图片
- python 遍历某个路径下的所有图片并将图片路径保存到数组
- Asp.net(C#)给图片加上水印效果
- 给图片加上水印
- 不务正业--用python爬虫抓取Konachan的图片并保存到本地文件
- Python PIL 图片水印添加
- python3给图片添加水印
- python读取和保存图片5种方法对比