python下xlsxwriter与pandas的办公自动化 v20191022

走过弯路,刚开始做的时候是用openpyxl,这几天才发现xlsxwriter功能比较强大。

写个脚本实现自动化办公,主要参看xlsxwriter文档

1.xlsxwriter

首先利用pandas整理数据(利用pandas进行数据分析第二版),原始表格如下
Sheet1
我们需要添加表格标题和添加图片,为重复利用脚本,写为函数。

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 30 11:07:03 2019

@author: hgh
"""
'''
data 数据
workbook 工作表
worksheetname 工作簿
Merged_Cells 表的title
title 图的title
y_axis y轴名称
x_axis x轴名称
'''

def bar(data, workbook, worksheetname, Merged_Cells=None, title=None, y_axis=None, x_axis=None):
    x, y = data.shape
#    获取数据的大小    
    end_col = chr(ord('A') + y -1)
#    获取最大的col边界
       
    worksheet1 = workbook.add_worksheet(worksheetname)
#    建立一个sheet 
    merge_range = 'A1:' + str(end_col) + '1'
#    标题的位置
    format = workbook.add_format({'align': 'center'})
#    格式
    worksheet1.merge_range(merge_range, Merged_Cells, format)
#    合并标题所在的单元格

    
    col_num = 0
    for col in data:  
        worksheet1.write(1, col_num, col)
        worksheet1.write_column(2, col_num, data[col])
        col_num += 1
#    读取DataFrame文件进入worksheet
        
    all_format = 'A:' + str(end_col)    
    worksheet1.set_column(all_format, None, format)
#    设定全文居中
    
    format1 = workbook.add_format({'num_format': '0.00%', 'align': 'center'})
#    pandas将14%转为小数,必须将数字格式化        
    worksheet1.set_column(str(end_col) + ':' + str(end_col), None, format1)
    
    worksheet1.set_row(x+1, None, format1)
            
    chart = workbook.add_chart({'type': 'column'}) 
         
    for col in range(1, y-2):
        point = chr(ord('A') + col)
        categories = '='+ worksheetname +'!' + '$A$3:$A$' + str(x)    
        values = '='+ worksheetname +'!' + '$' + point + '$3:$'+ point +'$' + str(x)
        name = '='+ worksheetname +'!$'+ point +'$2'
        chart.add_series({'categories': categories,
                          'values': values, 
                          'data_labels': {'value': True},
                          'name': name})
                  
    chart.set_size({'width': 1000, 'height': 500})#设置表的大小
    chart.set_title({'name': title})#设置表名称
    chart.set_y_axis({'name': y_axis})#设置y轴的小标题
    chart.set_x_axis({'name': x_axis})#设置x轴的小标题
        
    worksheet1.insert_chart('H20', chart)

写完分析函数,我们可以有

import pandas as pd
import xlsxwriter

data = pd.read_excel(r'\test.xlsx', sheet_name='Sheet1')

workbook = xlsxwriter.Workbook(r'test_.xlsx')

bar(data=data1, workbook=workbook, worksheetname='Sheet1', Merged_Cells = 'Merged_Cells', title=None, y_axis=None, x_axis=None)

workbook.close()

运行,就可以得到
sheet1
和图表
图片

2.GUI

这里我选择了PySimpleGUI ,因为看起来比较简单。
我就直接copy cookbook的例子进行进行修改,例子为

import PySimpleGUI as sg
import sys

if len(sys.argv) == 1:
    layout = [[sg.Text('Document to open')],
             [sg.In(), sg.FileBrowse()],
             [sg.Open(), sg.Cancel()]]

    window = sg.Window('My Script', layout)
    event, values = window.Read()
    window.Close()

    fname = values[0]
    print(event, values)
else:
    fname = sys.argv[1]

if not fname:
    sg.Popup("Cancel", "No filename supplied")
    raise SystemExit("Cancelling: no filename supplied")
else:
    sg.Popup('The filename you chose was', fname)

注意:sg.Popup('The filename you chose was', fname)要最后执行。

import PySimpleGUI as sg
import sys
import os
import pandas as pd
import xlsxwriter
#from untitled1 import bar, pie

if len(sys.argv) == 1:
    layout = [[sg.Text('Document to open')],
             [sg.In(), sg.FileBrowse()],
             [sg.Open(), sg.Cancel()]]

    window = sg.Window('My Script', layout)
    event, values = window.Read()
    window.Close()

    fname = values[0]
    print(event, values)
else:
    fname = sys.argv[1]

if not fname:
    sg.Popup("Cancel", "No filename supplied")
    raise SystemExit("Cancelling: no filename supplied")
else:
    
    path = fname 
      
    newfilepath = os.path.join(os.path.dirname(path), os.path.basename(path).split('.')[0]+'_.' + os.path.basename(path).split('.')[1])    
    
    data1 = pd.read_excel(fname, sheet_name='Sheet1')
    
    
    
    workbook = xlsxwriter.Workbook(newfilepath, {'strings_to_formulas': True})
    
    def bar(data, workbook, worksheetname, Merged_Cells=None, title=None, y_axis=None, x_axis=None):
        x, y = data.shape
    #    获取数据的大小    
        end_col = chr(ord('A') + y -1)
    #    获取最大的col边界
           
        worksheet1 = workbook.add_worksheet(worksheetname)
    #    建立一个sheet 
        merge_range = 'A1:' + str(end_col) + '1'
    #    标题的位置
        format = workbook.add_format({'align': 'center'})
        format.set_font_name('宋体')
    #    格式
        worksheet1.merge_range(merge_range, Merged_Cells, format)
    #    合并标题所在的单元格
    
        
        col_num = 0
        for col in data:  
            worksheet1.write(1, col_num, col)
            worksheet1.write_column(2, col_num, data[col])
            col_num += 1
    #    读取DataFrame文件进入worksheet
            
        all_format = 'A:' + str(end_col)    
        worksheet1.set_column(all_format, None, format)
    #    设定全文居中
        
        format1 = workbook.add_format({'num_format': '0.00%', 'align': 'center'})
        format1.set_font_name('宋体')
            
        worksheet1.set_column(str(end_col) + ':' + str(end_col), None, format1)
        
        worksheet1.set_row(x+1, None, format1)
                
        chart = workbook.add_chart({'type': 'column'}) 
             
        for col in range(1, y-2):
            point = chr(ord('A') + col)
            categories = '='+ worksheetname +'!' + '$A$3:$A$' + str(x)    
            values = '='+ worksheetname +'!' + '$' + point + '$3:$'+ point +'$' + str(x)
            name = '='+ worksheetname +'!$'+ point +'$2'
            chart.add_series({'categories': categories,
                              'values': values, 
                              'data_labels': {'value': True},
                              'name': name})
                      
        chart.set_size({'width': 1000, 'height': 500})#设置表的大小
        chart.set_title({'name': title})#设置表名称
        chart.set_y_axis({'name': y_axis})#设置y轴的小标题
        chart.set_x_axis({'name': x_axis})#设置x轴的小标题
        chart.set_table({'show_keys': True})
            
        worksheet1.insert_chart('H20', chart)
    
    
    
    
    bar(data=data1, workbook=workbook, worksheetname='Sheet1', Merged_Cells = 'Merged_Cells', title=None, y_axis=None, x_axis=None)
    
    workbook.close()
    sg.Popup('The filename you chose was', fname)

3.pyinstaller

安装最新版pyinstaller,管理员权限打开Anaconda Prompt,输入两次进入上层目录

cd ..

转到C盘根目录,再输入

D:

转到你的文件跟目录盘根目录,再输入

你的文件跟目录

输入

cd 你的文件路径相对路径

要是提示utf-8错误,在你打包的命令行中先输入chcp 65001,然后再输入打包命令。

pyinstaller -Fw xxx.py

慢慢等,会成功的。

在这里插入图片描述

4. 后续

运行速度较慢,文件较大,即使我已经新建了一个只有PySimpleGUIpandas xlsxwriter的python新环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值