使用Python导出Excel图表以及导出为图片的方法


Posted in Python onNovember 07, 2015

本篇讲下如何使用纯python代码将excel 中的图表导出为图片。这里需要使用的模块有win32com、pythoncom模块。

网上经查询有人已经写好的模块pyxlchart,具体代码如下:

from win32com.client import Dispatch
import os
import pythoncom
class Pyxlchart(object):
 """
 This class exports charts in an Excel Spreadsheet to the FileSystem
 win32com libraries are required.
 """
 def __init__(self):
  pythoncom.CoInitialize()
  self.WorkbookDirectory = ''
  self.WorkbookFilename = ''
  self.GetAllWorkbooks = False
  self.SheetName = ''
  self.ChartName = ''
  self.GetAllWorkbookCharts = False
  self.GetAllWorksheetCharts = False
  self.ExportPath = ''
  self.ImageFilename = ''
  self.ReplaceWhiteSpaceChar = '_'
  self.ImageType = 'jpg'
 def __del__(self):
  pass
 def start_export(self):
  if self.WorkbookDirectory == '':
   return "WorkbookDirectory not set"
  else:
   self._export()
 def _export(self):
  """
  Exports Charts as determined by the settings in class variabels.
  """
  excel = Dispatch("excel.application")
  excel.Visible = False
  wb = excel.Workbooks.Open(os.path.join(self.WorkbookDirectory ,self.WorkbookFilename))
  self._get_Charts_In_Worksheet(wb,self.SheetName,self.ChartName)
  wb.Close(False)
  excel.Quit()
 def _get_Charts_In_Worksheet(self,wb,worksheet = "", chartname = ""):
  if worksheet != "" and chartname != "":
   sht = self._change_sheet(wb,worksheet)
   cht = sht.ChartObjects(chartname)
   self._save_chart(cht)
   return
  if worksheet == "":
   for sht in wb.Worksheets:
    for cht in sht.ChartObjects():
     if chartname == "":
      self._save_chart(cht)
     else:
      if chartname == cht.Name:
       self._save_chart(cht)
  else:
   sht = wb.Worksheets(worksheet)
   for cht in sht.ChartObjects():
    if chartname == "":
     self._save_chart(cht)
    else:
     if chartname == cht.Name:
      self._save_chart(cht)
 def _change_sheet(self,wb,worksheet):
  try:
   return wb.Worksheets(worksheet)
  except:
   raise NameError('Unable to Select Sheet: ' + worksheet + ' in Workbook: ' + wb.Name)
 def _save_chart(self,chartObject):
  imagename = self._get_filename(chartObject.Name)
  savepath = os.path.join(self.ExportPath,imagename)
  print savepath
  chartObject.Chart.Export(savepath,self.ImageType)
 def _get_filename(self,chartname):
  """
  Replaces white space in self.WorkbookFileName with the value given in self.ReplaceWhiteSpaceChar
  If self.ReplaceWhiteSpaceChar is an empty string then self.WorkBookFileName is left as is
  """
  if self.ImageFilename == '':
   self.ImageFilename == chartname
  if self.ReplaceWhiteSpaceChar != '':
   chartname.replace(' ',self.ReplaceWhiteSpaceChar)
  if self.ImageFilename != "":
   return self.ImageFilename + "_" + chartname + "." + self.ImageType
  else:
   return chartname + '.' + self.ImageType
if __name__ == "__main__":
 xl = Pyxlchart()
 xl.WorkbookDirectory = "\\\\maawtns01\\discipline\\procurement\\MATERIEL\\Raw Material\\Data Management\\Hawk"
 xl.WorkbookFilename = "Hawk Workability KPI.xlsm"
 xl.SheetName = ""
 xl.ImageFilename = "MyChart1"
 xl.ExportPath = "d:\\pycharts"
 xl.ChartName = ""
 xl.start_export()
 print "This file does not currently allow direct access"
 print "Please import PyXLChart and run start_export()"

   
这里还使用Excel vba将chart另存为图片篇中创建的chart_column.xlsx表,使用上面的模块的方法如下:

from pyxlchart import Pyxlchart
xl = Pyxlchart()
xl.WorkbookDirectory = "D:\\"
xl.WorkbookFilename = "chart_column.xlsx"
xl.SheetName = ""
#xl.ImageFilename = "MyChart1"
xl.ExportPath = "d:\\"
xl.ChartName = ""
xl.start_export()

由于有该表里有多张图表,所以上面未指定xl.ImageFilename ,使用示例如下:

使用Python导出Excel图表以及导出为图片的方法

Excel vba将chart另存为图片
python下使用xlswriter模块,可以轻松在excel 中创建图片,不过想实现将生成的chart图表导出为图片,在email 中导入图片的目标 。经网上查询未找到通过python代码将excel 中已经生成的图片导出为图片的方法,不过通过变通方法,使用excel 内的vba 宏却可以轻松将图片导出。

1、导出单张图片

python 创建chart图片代码:

#coding: utf-8
import xlsxwriter
import random
def get_num():
 return random.randrange(0, 201, 2)
workbook = xlsxwriter.Workbook('analyse_spider.xlsx') #创建一个Excel文件
worksheet = workbook.add_worksheet() #创建一个工作表对象
chart = workbook.add_chart({'type': 'column'}) #创建一个图表对象
#定义数据表头列表
title = [u'业务名称',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平均流量']
buname= [u'运维之路',u'就要IT',u'baidu.com',u'361way.com',u'91it.org'] #定义频道名称
#定义5频道一周7天流量数据列表
data = []
for i in range(5):
 tmp = []
 for j in range(7):
  tmp.append(get_num())
 data.append(tmp)
format=workbook.add_format() #定义format格式对象
format.set_border(1) #定义format对象单元格边框加粗(1像素)的格式
format_title=workbook.add_format() #定义format_title格式对象
format_title.set_border(1) #定义format_title对象单元格边框加粗(1像素)的格式
format_title.set_bg_color('#cccccc') #定义format_title对象单元格背景颜色为
          #'#cccccc'的格式
format_title.set_align('center') #定义format_title对象单元格居中对齐的格式
format_title.set_bold() #定义format_title对象单元格内容加粗的格式
format_ave=workbook.add_format() #定义format_ave格式对象
format_ave.set_border(1) #定义format_ave对象单元格边框加粗(1像素)的格式
format_ave.set_num_format('0.00') #定义format_ave对象单元格数字类别显示格式
#下面分别以行或列写入方式将标题、业务名称、流量数据写入起初单元格,同时引用不同格式对象
worksheet.write_row('A1',title,format_title)
worksheet.write_column('A2', buname,format)
worksheet.write_row('B2', data[0],format)
worksheet.write_row('B3', data[1],format)
worksheet.write_row('B4', data[2],format)
worksheet.write_row('B5', data[3],format)
worksheet.write_row('B6', data[4],format)
#定义图表数据系列函数
def chart_series(cur_row):
 worksheet.write_formula('I'+cur_row, \
  '=AVERAGE(B'+cur_row+':H'+cur_row+')',format_ave) #计算(AVERAGE函数)频
               #道周平均流量
 chart.add_series({
  'categories': '=Sheet1!$B$1:$H$1', #将“星期一至星期日”作为图表数据标签(X轴)
  'values':  '=Sheet1!$B$'+cur_row+':$H$'+cur_row, #频道一周所有数据作
                #为数据区域
  'line':  {'color': 'black'}, #线条颜色定义为black(黑色)
  'name': '=Sheet1!$A$'+cur_row, #引用业务名称为图例项
 })
for row in range(2, 7): #数据域以第2~6行进行图表数据系列函数调用
 chart_series(str(row))
chart.set_size({'width': 577, 'height': 287}) #设置图表大小
chart.set_title ({'name': u'爬虫分析'}) #设置图表(上方)大标题
chart.set_y_axis({'name': 'count'}) #设置y轴(左侧)小标题
worksheet.insert_chart('A8', chart) #在A8单元格插入图表
workbook.close() #关闭Excel文档

使用Python导出Excel图表以及导出为图片的方法

由于这里只有一张图片,通过vba 代码很容易生成图片 。方法为,打开该excel 图表,通过alt + F11 快捷键打开宏编辑界面;打开VB编辑器的立即窗口:”视图“-”立即窗口“,或者使用快捷键"Ctrl + G" ,接着输入如下代码

activesheet.ChartObjects(1).Chart.Export "C:\chart.png"

按 " Enter " 键后,会在C盘生成上面的生成的chart图表。

二、导出多张图表

python代码如下:

#coding: utf-8
import xlsxwriter
workbook = xlsxwriter.Workbook('chart_column.xlsx')
worksheet = workbook.add_worksheet()
bold = workbook.add_format({'bold': 1})
# 这是个数据table的列
headings = ['Number', 'Batch 1', 'Batch 2']
data = [
 [2, 3, 4, 5, 6, 7],
 [10, 40, 50, 20, 10, 50],
 [30, 60, 70, 50, 40, 30],
]
worksheet.write_row('A1', headings, bold)
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])
############################################
#创建一个图表,类型是column
chart1 = workbook.add_chart({'type': 'column'})
# 配置series,这个和前面wordsheet是有关系的。
chart1.add_series({
 'name':  '=Sheet1!$B$1',
 'categories': '=Sheet1!$A$2:$A$7',
 'values':  '=Sheet1!$B$2:$B$7',
})
# Configure a second series. Note use of alternative syntax to define ranges.
chart1.add_series({
 'name':  ['Sheet1', 0, 2],
 'categories': ['Sheet1', 1, 0, 6, 0],
 'values':  ['Sheet1', 1, 2, 6, 2],
})
# Add a chart title and some axis labels.
chart1.set_title ({'name': 'Results of sample analysis'})
chart1.set_x_axis({'name': 'Test number'})
chart1.set_y_axis({'name': 'Sample length (mm)'})
# Set an Excel chart style.
chart1.set_style(11)
# Insert the chart into the worksheet (with an offset).
worksheet.insert_chart('D2', chart1, {'x_offset': 25, 'y_offset': 10})
#######################################################################
#
# Create a stacked chart sub-type.
#
chart2 = workbook.add_chart({'type': 'column', 'subtype': 'stacked'})
# Configure the first series.
chart2.add_series({
 'name':  '=Sheet1!$B$1',
 'categories': '=Sheet1!$A$2:$A$7',
 'values':  '=Sheet1!$B$2:$B$7',
})
# Configure second series.
chart2.add_series({
 'name':  '=Sheet1!$C$1',
 'categories': '=Sheet1!$A$2:$A$7',
 'values':  '=Sheet1!$C$2:$C$7',
})
# Add a chart title and some axis labels.
chart2.set_title ({'name': 'Stacked Chart'})
chart2.set_x_axis({'name': 'Test number'})
chart2.set_y_axis({'name': 'Sample length (mm)'})
# Set an Excel chart style.
chart2.set_style(12)
# Insert the chart into the worksheet (with an offset).
worksheet.insert_chart('D18', chart2, {'x_offset': 25, 'y_offset': 10})
#######################################################################
#
# Create a percentage stacked chart sub-type.
#
chart3 = workbook.add_chart({'type': 'column', 'subtype': 'percent_stacked'})
# Configure the first series.
chart3.add_series({
 'name':  '=Sheet1!$B$1',
 'categories': '=Sheet1!$A$2:$A$7',
 'values':  '=Sheet1!$B$2:$B$7',
})
# Configure second series.
chart3.add_series({
 'name':  '=Sheet1!$C$1',
 'categories': '=Sheet1!$A$2:$A$7',
 'values':  '=Sheet1!$C$2:$C$7',
})
# Add a chart title and some axis labels.
chart3.set_title ({'name': 'Percent Stacked Chart'})
chart3.set_x_axis({'name': 'Test number'})
chart3.set_y_axis({'name': 'Sample length (mm)'})
# Set an Excel chart style.
chart3.set_style(13)
# Insert the chart into the worksheet (with an offset).
worksheet.insert_chart('D34', chart3, {'x_offset': 25, 'y_offset': 10})
workbook.close()

同一数据源上面创建了三种类型的图 ,由于有三张图,上面的导出一张图的方法肯定是不行了,这里打开宏,创建如下宏内容:

Sub exportimg()
Dim XlsChart As ChartObject
For Each XlsChart In Worksheets("Sheet1").ChartObjects
 XlsChart.Chart.Export Filename:="C:\" & XlsChart.Name & ".jpg", FilterName:="JPG"
Next
End Sub

该示例这里就不再截图,具体可以自行运行。

Python 相关文章推荐
python利用elaphe制作二维条形码实现代码
May 25 Python
详解Python中的循环语句的用法
Apr 09 Python
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
python中print的不换行即时输出的快速解决方法
Jul 20 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
Pycharm以root权限运行脚本的方法
Jan 19 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
pytorch 查看cuda 版本方式
Jun 23 Python
Python基础之Socket通信原理
Apr 22 Python
Windows下为Python安装Matplotlib模块
Nov 06 #Python
python 的列表遍历删除实现代码
Apr 12 #Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 #Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 #Python
python实现将内容分行输出
Nov 05 #Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 #Python
Python实现周期性抓取网页内容的方法
Nov 04 #Python
You might like
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
PHP递归创建多级目录
2015/11/05 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现树形打印目录结构
2018/03/29 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
python-opencv颜色提取分割方法
2018/12/08 Python
Python制作exe文件简单流程
2019/01/24 Python
NumPy排序的实现
2020/01/21 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
汽车专业毕业生推荐信
2013/11/12 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
微信搭讪开场白
2015/05/28 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书