博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python-尝试将Excel文件保存为图片并加上水印
阅读量:6086 次
发布时间:2019-06-20

本文共 3071 字,大约阅读时间需要 10 分钟。

python-尝试将Excel文件保存为图片并加上水印

场景:并不是将 excel 的 chart 生成图片,而是将整个表格内容生成图片。

1. 准备工作

目前搜索不到已有的方法,只能自己尝试写一个,想法有两个:

  1. 通过 Python 的图片处理库PIL,将 Excel 内信息逐写到图片上;

  2. 通过另存为 HTML 文件,利用Phantomjs的截图工具,截取到 HTML 。比较曲折的方法,但可能更容易上手。

我选择了后者,虽然每一步都不太熟练,但是先逐个击破吧!

2. Excel to HTML

2.1 尝试直接另存为 HTML 不成功

这一步参考 [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 版本。

一个简短的截图程序:

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. 这么一搞,有时候保存个中文路径或者图片也做不到了。可能跟前面的编解码有关。

转载于:https://www.cnblogs.com/aubucuo/p/html2png.html

你可能感兴趣的文章
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>