精华内容
下载资源
问答
  • 除此以外,追求效率的我们还可以选择成熟的报表套件,这类套件往往具有一系列的图表模板+支持推拽且可视的配置页面,方便我们快速的构建出可视大屏。其实大部分套件的机理差异并不大,为了降低文章内容量,本文...

    本文从技术和工具的角度分享可视化大屏的开发!

    主要是对报表工具开发可视化大屏做测评!

     

    可视化大屏开发工具选择

    常规的数据可视化方式我们可以选择直接读取数据库,通过绘图软件/库进行绘制,最终构成自建的前端显示效果,比如使用 Apache ECharts (incubating) 等工具。

    除此以外,追求效率的我们还可以选择成熟的报表套件,这类套件往往具有一系列的图表模板+支持推拽且可视化的配置页面,方便我们快速的构建出可视化大屏。其实大部分套件的机理差异并不大,为了降低文章内容量,本文直接讲解某一种套件,

    当然报表套件又分为三类:

    • 桌面应用产品,生成的是桌面端程序,程序往往直接连接云端数据库,需要数据库开放公网 ip。也有部分会有服务端提供 crud api 来降低数据泄露风险
    • web 端直连数据库 / 自建后端产品,这种产品较少,毕竟已经做到 web 了再配个服务器岂不是更好,否则还是要数据库开放 ip
    • B-S 产品,服务端提供与多源数据库的连接、数据提取、前端页面生成,前端负责显示、用户交互与动态刷新等等

    本文选择第三类的一款套件作为讲解 -- 帆软的 FineReport,选择此产品原因:

    1、国产软件,中文文档、中文配置界面,对于国内用户友好度高

    2、国内基本最领先的报表工具,可视化大屏开发成熟

    (注:我尽量从可视化报表工具的角度出发描述,而不是针对某个具体的产品,只是为了形象且可查证会给出 FineReport 在下面各方面的实践方式 / 方案,不作任何额外评价)

    既然是个套件应该有很多完整成熟的功能,我们以这几个维度来聊聊:

    • 环境与基础设施:设计平台,安装环境,故障传递与追溯,数据安全,协作开发,功能扩展性
    • 视觉效果与用户交互:布局,配色,交互,可复用组件,组件自定义

     

    设计平台

    首先说说设计平台,一般分为两类类:

    • 传统的桌面应用的设计器,前者往往直接安装打开使用即可,对于 B/S 类的产品,往往设计器安装包会自带一个服务在启动后自动运行可用于调试的服务环境
    • 基于 Web 的设计器,这种设计器有些是支持同时设计与提供展示服务的,即一次搭建后根据登录账号的 role 进入不同的环境,有些是完全分离的两套环境。

    FineReport 属于前者,对于不同系统均由轻松安装的安装包,不需要复杂配置。

     

    安装环境

    对于 B/S 产品,和搭建后端类似,只是不需要复杂的配置了,直接根据教程安装一下就即可启动服务.

    对于后续要说的功能扩展性,可能会影响此步骤,如果产品具有功能扩展性,那么额外扩展的功能需要单独部署在服务上并配置相关连接,如果是基于插件化的扩展需要在服务端安装对应插件。此部分建议构建完整的环境搭建文档,如果产品可以通过脚本安装,建议直接将部署过程脚本化。

    FineReport 环境安装也是安装包直接搞定,其具有插件平台,若有补充插件需要通过 web 登录后添加对应插件。

     

    故障传递与追溯

    企业数据应用阶段,往往数据可视化以后就逐渐地产生了可视化大屏。可视化大屏往往单页面信息含量极其丰富、跨越的业务部门繁多、数据分析维度全面。所以从技术角度来讲,我们需要保证单一故障不会大面积的波及其他信息,比如:

    • 设计器出现故障是否会影响服务端?尤其是通过 role 区分环境的 web 设计器。
    • 个别指标的计算错误是否会导致同页面其他指标均无法显示?
    • 个别指标计算缓慢是否影响同页面其他指标均无法刷新?

    对于故障还有额外要做的是实时处理方式:

    • 关键指标计算错误是否也要报警?因为可视化大屏运行状态也许也是一个指标呢
    • 指标计算错误时显示 0 还是现实错误信息?尤其注意在指标具有其独特的存在性意义时,不建议随意的用同类型数据作为展示,避免错误统计
    • 虽然我们保证了故障波及的可控性,但我们还希望能够追溯到问题产生的原因,这就需要确定相关产品是否有足够的日志,尤其是需要在于数据库交互式的执行语句与执行响应。

    继续说 FineReport的情况:

    • 报表单一指标计算错误不会影响其他指标显示。
    • 单一指标计算速度慢不会影响整体打开速度,会逐步更新算的指标值,但初始打开时计算过程中未算得结果的在页面布局上有一定概率不正确,此问题会逐步计算后动态的调整布局,最终效果正确。
    • 设计调试阶段有完整执行日志,可查询执行的 sql 指令追溯计算错误问题,但对于复杂多层嵌套/页面联动等行为追溯相对复杂可考虑开发日志处理工具
    • 生产环境(服务器版)部署后的日志并未调研

     

    数据安全

    理想状态下,我们的数据库不应该使用公网 IP,这方面针对前面提到的三种类型:

    • 桌面应用程序:此类程序往往也支持不直接连接数据库,可以通过自建的后端或套件的后端来获取数据。
    • web 直连产品:此类产品只提供了基于 Web 的 UI 快速搭建,类似于后台框架等等,具体的数据读取方式可以选择 API or 直连数据库,需要自行维护数据安全。
    • B-S 产品:此类型产品完整的提供了前后端,后端负责和多源数据库的连接,前端只负责接受数据、传递指令,相对可以更好地保护数据库安全,只需要将服务端与数据库放到同一云供应商,避免开启公网 IP 即可。但同样的风险转嫁到了此类型产品的后端,无论是后端服务还是此产品提供的基于 Web 的后台。

    FineReport作为 B/S 产品,有完整的服务端,前后端交互在数据方面一般以 POST 请求。

    简单查看:请求参数是控件 id、控件内容、行为等,不会涉及到要执行的 sql。返回结果为控件信息及控件内数据。不确定是否有遗漏的情况,再加上使用 SSL 可进一步提高安全性。

     

    协作开发

    报表并不是一件简单的事情,无论是经过数仓的手段还是数据中台的手段,从业务角度来看,我们都是先打破了部门壁垒,然后让各部门数据相互碰撞,挖掘出更多的剩余价值,这就导致了我们报表业务的复杂性以及开发的工作量,我们不得不进行协作开发,尤其是可视化大屏。

    一个可视化大屏可能有几十个模块,每个模块有三五个甚至更多一些的分析指标,一个页面上轻松可以出现过百的指标,因此能够让开发过程可协作是极其重要的环节。

    首先对于协作我们需要考虑下面几个问题:

    • 协作过程数据库如何连接:由于数据库在云上,为了安全也不会开放对外接口,此时推荐三种方式:① 使用 QA 环境,如果 QA 环境已经积攒了足够多的虚假数据且对数据结构安全性并不敏感,可考虑此方案,但不太推荐。② 使用VPN,让我们能够在本地经过 VPN 连上数据库。③ 使用云服务器,通过云上开发来实现在内网访问数据库。
    • 单一页面分工开发方法:一个页面过百指标数量,根据业务内容进行一定分组安排任务,但同时要考虑如何此工具的记录文件是否能够自动 merge,如果不能自动 merge 如何进行人工 merge,merge 时能否正常的保留逻辑以及布局等信息……
    • 重复性样式是否可方便复用:当样式重复只是逻辑和标题/标签差异时,是否能复用,是否有模板的概念,复用后是否能保证只是逻辑改变其他具有完全一致性以保证风格统一

    ……

    FineReport支持通过更改工作目录为远端的工作目录的方式,直接开始协作开发,此方式只是将设计文件的存储位置放到了远端,真正操作执行等还是在本地,类似于一个设计文件版本管理器。

     

    功能扩展性

    产品是否提供了模块化 or 插件化平台,以通过公开流程关键节点的接口或其他方式来支持第三方插件、自定义组件的接入,来实现“无限可能”的未来。

    插件包括但不限于:

    • 更多地图表模板
    • 用户交互过程更多的动画效果
    • 花式提示框
    • 设计阶段布局工具
    • 运行阶段日志处理工具
    • 整体的配色方案(皮肤? 主题?)
    • 自定义计算模板/公式、领域专业公式集
    • 鉴权认证插件
    • 数据库驱动
    • ……

    FineReport有插件平台,包含多种分类分组,有官方插件及第三方插件,且有插件开发 API 文档

     

    布局与配色

    • 是否有整体的配色方案?便于在不追求高度定制的情况下快速成型,比如夜间模式……
    • 设计阶段是否能进行规范的布局:水平、垂直、栅格、流、填表专用(label+editbox)……
    • 图层、透明度、可见性、盒模型
    • 特效方面是否可控制事件流
    • 响应式布局

    FineReport布局上可以选择绝对布局(一切靠手拖拽),或者选择自适应布局,其可以配置双向单项(水平、垂直、栅格)同时可配置内边距与组件间边距。

     

    交互

    • 图自动刷新
    • 图表联动
    • 参数配置联动
    • 动画效果
    • 提示窗口

    可复用组件

    可复用性也直接或间接地影响到了协作开发的效率、最终展示效果一致性等多方面。

    FineReport提供了网页插件,可通过插入网页控件来引用其他的组件,以嵌套的方式组合多种显示块。

    还提供了模板插件,通过将选中的多个组件打包成一个模板,同时打包了组件间布局关系、数据操作逻辑,实现了逻辑、关系与控件的整体迁移复用,但其只能记忆布局关系,无法记忆布局最终尺寸,在多次复用后需要调整整体的尺寸问题。

     

    组件自定义

    此类型工具是通过将多种常用功能进行持久化的方式提高开发效率,但难免遇到特殊的需要,这时候就需要高度的自由行,比如提供插件平台、组件设计方式、API 接口、可编程……

    FineReport提供了对 JS 的支持,可以在很多空间里在点击等操作时触发对应的 JS 脚本,后面就看开发自己的了。

    同时有插件平台,可将重复使用的功能通过插件的方式持久化,有模板插件,可将重复的组件/组件集进行持久化。

     

    展开全文
  • 今天再次将Excel报表自动化程度推到了新高度。 主要实现的功能有: 1. 从指定的文件夹下复制各个数据集到模板文件(workfile)(open, copy, activate, select, close...) 2. 复制模板公式到数据区的第一个行...

    今天再次将Excel报表的自动化程度推到了新高度。

    主要实现的功能有:

    1. 从指定的文件夹下复制各个数据集到模板文件(workfile)(open, copy, activate, select, close...)

    2. 复制模板公式到数据区的第一个行对应的单元格,然后向下拖动复制单元格。(paste formula, auto fill ...)

    3. 整个操作耗时约10分钟,算是比较长的。所以,加入了debug.print功能和log功能。可以将执行过程的各个节点所用时间输出到控制台(Immediate Window)并记录到日志文件。

    看似简单的功能,实际编写、调试、测试(单元测试+系统测试)时间超过了6个小时,挺辛苦的。

    这样,该报表将具有以下四大自动化模块:

    1. 使用批处理自动生成5大数据集

    2. 自动复制、粘贴源数据(数据集)到模板文件

    3. 复制工作表(raw data_work)到raw data工作表,自动vlook查询、填充数据

    4. 自动校验 (validate)

    5. 自动移除辅助工作表

    该报表的人工干预时间(pure manual work)从1个半小时降到20分钟以内。只要3个月即可“收回成本”。以后,每年可节省24小时,按每小时300元计算,相当于每年节省人工费:24*300=7200元。10年7万2(20年14万!)。

    展开全文
  • python实现自动化报表2

    千次阅读 2019-03-03 00:14:56
    注意点:我们的自动化报表是先从公司网站上将数据下载下来之后,填充到excel(报表模板)中相应的sheet之中,然后运用excel的公式自动化处理数据并呈现成图,实现报表自动化,但是有一点需要注意,将从网站爬取得...

    自动化一个报表,用到的知识点和上一篇的知识点是一样的,但是有一个点需要注意:

    注意点:我们的自动化报表是先从公司网站上将数据下载下来之后,填充到excel(报表模板)中相应的sheet之中,然后运用excel的公式自动化处理数据并呈现成图,实现报表的自动化,但是有一点需要注意,将从网站爬取得数据(DataFrame)插入excel的某个sheet的过程中,excel模板中的将数据呈现为图的一块的公式会缺失,现在在网上找不到原因,DataFrame和excel连接的模块比较少,所以自动化报表最好是针对数据的自动化处理,不带图的显示。

    代码如下:

    # coding=gbk
    import json
    import os
    import shutil
    import time
    from datetime import datetime, date, timedelta
    import openpyxl
    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    from openpyxl import load_workbook  # openpyxl 版本必须是2.4.2,否则出错
    from openpyxl.utils.dataframe import dataframe_to_rows
    from sqlalchemy import create_engine
    import urllib3
    
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    from lxml import etree
    
    
    
    class day_report():
    	def __init__(self,today,yesterday):
    		self.headers = {
    		'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    	}
    		self.cookies = {'我有轻微焦虑症,有些快乐并痛苦的活着'}
    		self.today = today
    		self.yesterday = yesterday
    		self.con = create_engine('mysql+pymysql://xxx:bjsjb123@xxx:3306/001ribao')
    		self.today_model1 = 'C:\\Users\\lenovo\\Desktop\\运营中心日报模板\\{}\\'.format(today) + today + '.xlsx'
    		self.today_model2 = 'C:\\Users\\lenovo\\Desktop\\运营中心日报模板\\{}\\'.format(today) + today + '_总''.xlsx'
    		self.yesterday_model1 = 'C:\\Users\\lenovo\\Desktop\\运营中心日报模板\\{}\\'.format(yesterday) + yesterday + '.xlsx'
    		self.yesterday_model2 = 'C:\\Users\\lenovo\\Desktop\\运营中心日报模板\\{}\\'.format(yesterday) + yesterday + '_总''.xlsx'
    	
    	def copy_files(self):
    		# '''生成当日的excel日报的文件夹和文件'''
    		os.mkdir(r'C:\Users\lenovo\Desktop\运营中心日报模板\{}'.format(self.today)) #产生一个空的文件夹
    		shutil.copy(self.yesterday_model1, self.today_model1)
    		shutil.copy(self.yesterday_model2, self.today_model2)
    		#分别下载暂存、邮政、快递员和数据库中数据并存入到excel的特定的sheet
    		self.zancun()
    		self.youzheng_data()
    		self.kuaidiyuan()
    		self.sql_day_information()
    	
    	def kuaidiyuan(self):
    		'''下载快递员数据详情'''
    		# 第一步 先将快递员表格信息下载下来
    		target_url1 = 'https://bass.sudiyi.cn/api/v2/admin/auth_file/sign?name=%E8%AE%BE%E5%A4%87%E5%BF%AB%E9%80%92%E5%91%98%E6%95%B0%E6%8D%AE_{}.xlsx'.format(self.yesterday)
    		try:
    			req = requests.get(url=target_url1, headers=self.headers, cookies=self.cookies, verify=False)
    		except Exception as e:
    			print('%s出现问题:' % 'target_url1', e)
    		else:
    			html = req.text  # <class 'bytes'> 存放字节码 text存放 .content编码后的字符串
    			html = json.loads(html)
    			target_url2 = html['data']['name']
    			try:
    				req = requests.get(url=target_url2, headers=self.headers, cookies=self.cookies, verify=False)
    			except Exception as e:
    				print('%s出现问题:' % 'target_url1', e)
    			else:
    				# req.encoding = 'utf-8' #自动解码
    				html = req.content  # <class 'bytes'> 存放字节码 text存放 .content编码后的字符串
    				lujing = r'C:\Users\lenovo\Desktop\快递员数据\{}.xlsx'.format(self.yesterday)
    				if os.path.exists(lujing):  # 判断文件是否存在
    					os.remove(lujing)  # 如果存在文件则删除
    				with open(lujing, 'wb') as e:
    					e.write(html)
    				# 第二步将快递员信息处理之后放入excel指定的sheet中
    				a = pd.read_excel(lujing)
    				df = a.pivot_table(index='快递员电话', aggfunc={'投件量': 'sum'})
    				# 将数据放在已经存在的excel的某个sheet(第一种方法,但是会遗失画图的,所以现在把画图和数据拆开放了)
    				book = load_workbook(self.today_model1)
    				writer = pd.ExcelWriter(self.today_model1, engine='openpyxl')
    				writer.book = book
    				book.remove(book['投件快递员'])  # 删除已经存在的sheet
    				df.to_excel(excel_writer=writer, sheet_name="投件快递员")
    				writer.save()
    				writer.close()
    				print('快递员信息保存成功')
    				
    	def youzheng_data(self):
    		'''下载邮政数据详情'''
    		# 第一步 先将邮政数据信息下载下来
    		data = {'id': 124, 'time_type': 1, 'from_date': self.yesterday, 'to_date': self.yesterday}
    		r = requests.post('https://bass.sudiyi.cn/api/v2/data/warehouses/124/export', data, cookies=self.cookies, verify=False)
    		# 再找到参数
    		html = '数据准备中'  # 刚开始数据尚未准备好
    		while html != '已完成':
    			time.sleep(6)
    			try:
    				r1 = requests.get(url='https://bass.sudiyi.cn/api/v2/data/export/tasks?per=20&date_type=1',
    								  headers=self.headers, cookies=self.cookies, verify=False)
    			except Exception as e:
    				print('youzheng_data 刷新网页时出错:%s' % e)
    			else:
    				html = r1.text  # <class 'bytes'> 存放字节码 text存放 .content编码后的字符串
    				html1 = json.loads(html)['data']['list'][0]
    				html = html1['status']
    				print(html + '...')
    		canshu = html1['file'].split('_')[-1][:-5]
    		try:
    			target_url = 'https://bass.sudiyi.cn/api/v2/data/export/download?file=%E5%8D%95%E6%97%A5_%E9%82%AE%E6%94%BFEMS%E6%95%B0%E6%8D%AE_{0}_{1}_{2}.xlsx'.format(
    				self.yesterday, self.yesterday, int(canshu))
    			req = requests.get(url=target_url, headers=self.headers, cookies=self.cookies, verify=False)
    		except Exception as e:
    			print('youzheng_data 导出下载链接出现问题:', e)
    		else:
    			html = req.text  # <class 'bytes'> 存放字节码 text存放 .content编码后的字符串
    			html = json.loads(html)
    			target_url2 = html['data']['name']
    			try:
    				req = requests.get(url=target_url2, headers=self.headers, cookies=self.cookies, verify=False)
    			except Exception as e:
    				print('邮政下载数据出现问题', e)
    			else:
    				html = req.content  # <class 'bytes'> 存放字节码 text存放 .content编码后的字符串
    				daily_machine_data_lujin = r'C:\Users\lenovo\Desktop\邮政数据\%s_%s.xlsx' % (self.yesterday,self.yesterday)
    				with open(daily_machine_data_lujin, 'wb') as e:
    					e.write(html)
    					print('邮政数据下载成功')
    				#将邮政数据和自营城市进行匹配
    				df = pd.read_excel(daily_machine_data_lujin)
    				df1 = pd.read_excel(r'C:\Users\lenovo\Desktop\2018年中邮速递易年度数据分析报告\派件事业部-城市匹配表.xlsx')[['运营城市']].rename(
    					columns={'运营城市': '运营城市名'})
    				df2 = pd.merge(df, df1, on='运营城市名').set_index('设备ID')
    				#因为表中含有 字符"(",这种字符用DataFrame插入excel中会出现错误,所以先将出现这种字符行列的进行替换和删除
    				df2.columns = df2.columns.map(lambda x: x if len(x.split('-')) == 1 else '和'.join(x.split('-')))
    				df2.drop('网点名', axis=1, inplace=True)
    				df2.drop('日期', axis=1, inplace=True)
    				book = load_workbook(self.today_model1)
    				writer = pd.ExcelWriter(self.today_model1, engine='openpyxl')
    				writer.book = book
    				book.remove(book['邮政收入'])  # 删除已经存在的sheet
    				df2.to_excel(excel_writer=writer, sheet_name="邮政收入")
    				writer.save()
    				writer.close()
    				print('邮政数据保存成功')
    				
    	def sql_day_information(self):
    		yuju = "(select `时间`日期,'全部'设备类型,(sum(`收入总额(元)`)/10000)社会快递收入,(sum(`派件收入`)/10000)派件收入,(sum(`预约收入`)/10000)预约收入,(sum(`取件收入`)/10000)取件收入,count(`设备ID`)设备数,sum(`总投件量`)/sum(`箱格数`)投件率,(sum(`总投件量`)/10000)投件量,(sum(`值守占用箱格总数`)/10000)值守占用数,(sum(`故障箱格总数`)/10000)故障箱格数,sum((case `是否疑似断网` when '断网' then 1 else 0 end))断网断电设备数,sum((case `总投件率` when  0 then 1 else 0 end ))零投件设备数,sum((case when `总投件率`<=0.3 then 1 else 0 end ))低效设备数,(sum(if(`设备类型`!='蜜蜂箱-易邮柜',`滞留件数量`,0))/10000)滞留件数量,sum((case when DATE_FORMAT(`首次激活时间`,'%%Y-%%m-%%d')={} then 1 else 0 end))首次激活设备数,(sum(case `是否开通快递员派件收费` when '付费' then 1 else 0 end )/count(`是否开通快递员派件收费`))设备收费率,(sum(`有效箱格数`)/10000)有效箱格数,(sum(`箱格数`)/10000)总格口数 from `经分-设备大表` where `时间`= {} and `运营城市_系统` in ('北京市','广州市','上海市','深圳市','成都市','大连市','杭州市','南京市','宁波市','青岛市','厦门市','沈阳市','苏州市','天津市','无锡市','武汉市','西安市','长沙市','重庆市','常州市','东莞市','佛山市','福州市','贵阳市','哈尔滨市','海口市','合肥市','惠州市','济南市','嘉兴市','金华市','昆明市','南昌市','南宁市','南通市','泉州市','汕头市','石家庄市','潍坊市','温州市','徐州市','烟台市','扬州市','郑州市','蚌埠市','宝鸡市','德阳市','赣州市','桂林市','衡阳市','湖州市','兰州市','连云港市','临沂市','柳州市','绵阳市','南充市','绍兴市','台州市','威海市','芜湖市','盐城市','宜昌市','岳阳市','漳州市','株洲市','淄博市','达州市','江门市','九江市','十堰市','湘潭市','襄阳市','遂宁市','安阳市','廊坊市','乌鲁木齐市','渭南市','琼海市','眉山市','自贡市','攀枝花市','广安市','巴中市','宜宾市','资阳市','雅安市','铜川市','玉溪市','呼和浩特市','保定市','衡水市','秦皇岛市')) union (select `时间`,RIGHT(`设备类型`,3),(sum(`收入总额(元)`)/10000)收入,(sum(`派件收入`)/10000)派件收入,(sum(`预约收入`)/10000)预约收入,(sum(`取件收入`)/10000)取件收入,count(`设备ID`),sum(`总投件量`)/sum(`箱格数`),sum(`总投件量`)/10000,sum(`值守占用箱格总数`)/10000,(sum(`故障箱格总数`)/10000)故障箱格数,sum((case `是否疑似断网` when '断网' then 1 else 0 end)),sum((case `总投件率` when  0 then 1 else 0 end )),sum((case when `总投件率`<=0.3 then 1 else 0 end )),(sum(if(`设备类型`!='蜜蜂箱-易邮柜',`滞留件数量`,0)))/10000,sum((case when DATE_FORMAT(`首次激活时间`,'%%Y-%%m-%%d')={} then 1 else 0 end)),(sum(case `是否开通快递员派件收费` when '付费' then 1 else 0 end )/count(`是否开通快递员派件收费`))设备收费率,(sum(`有效箱格数`)/10000)有效箱格数,(sum(`箱格数`)/10000)总格口数 from `经分-设备大表` where `时间`={} and `运营城市_系统` in ('北京市','广州市','上海市','深圳市','成都市','大连市','杭州市','南京市','宁波市','青岛市','厦门市','沈阳市','苏州市','天津市','无锡市','武汉市','西安市','长沙市','重庆市','常州市','东莞市','佛山市','福州市','贵阳市','哈尔滨市','海口市','合肥市','惠州市','济南市','嘉兴市','金华市','昆明市','南昌市','南宁市','南通市','泉州市','汕头市','石家庄市','潍坊市','温州市','徐州市','烟台市','扬州市','郑州市','蚌埠市','宝鸡市','德阳市','赣州市','桂林市','衡阳市','湖州市','兰州市','连云港市','临沂市','柳州市','绵阳市','南充市','绍兴市','台州市','威海市','芜湖市','盐城市','宜昌市','岳阳市','漳州市','株洲市','淄博市','达州市','江门市','九江市','十堰市','湘潭市','襄阳市','遂宁市','安阳市','廊坊市','乌鲁木齐市','渭南市','琼海市','眉山市','自贡市','攀枝花市','广安市','巴中市','宜宾市','资阳市','雅安市','铜川市','玉溪市','呼和浩特市','保定市','衡水市','秦皇岛市') group by RIGHT(`设备类型`,3))".format(self.yesterday,self.yesterday,self.yesterday,self.yesterday)
    		data_sql2 = pd.read_sql_query(yuju, self.con)
    		wb = load_workbook(filename=self.today_model1)
    		ws = wb['过渡数据']
    		width = 19
    		heigth = 7
    		for i in range(0, heigth - 1):
    			for j in range(0, width):
    				a = i + 2
    				b = j + 1
    				ws.cell(row=a, column=b, value="{0}".format(data_sql2.iloc[i, j]))
    		
    		wb.save(filename=self.today_model1)
    		print('数据库数据保存成功')
    
    
    	def zancun(self):
    		data1, data2 = [], []
    		headers = {
    			'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    		}
    		cookies = {
    			'阳光雨露泽润大地'}
    		target_url1 = 'http://tderp.biyoshop.com/a/reserve/list?page.pageNo=1&page.pageSize=30&orderNo=&orderType=&orderStatus=&deviceCode=&reserveBeginTime={0}+00%3A00%3A00&reserveEndTime={1}+00%3A00%3A00&boxType=&mobile=&postBeginTime=&postEndTime=&pickBeginTime=&pickEndTime=&page.orderBy='.format(
    			self.yesterday, self.today)
    		try:
    			req = requests.get(url=target_url1, headers=headers, cookies=cookies, verify=False)
    		except Exception as e:
    			print('暂存数据爬取出现问题', e)
    		else:
    			html = req.text
    			sel = etree.HTML(html)
    			a = int([i.text for i in sel.xpath('//a[@href]')][-3])
    			print('a:', a)
    			print('暂存一共%d页' % a)
    		for i in range(1, a + 1):
    			print('i:', i)
    			target_url1 = 'http://tderp.biyoshop.com/a/reserve/list?page.pageNo={0}&page.pageSize=30&orderNo=&orderType=&orderStatus=&deviceCode=&reserveBeginTime={1}+00%3A00%3A00&reserveEndTime={2}+00%3A00%3A00&boxType=&mobile=&postBeginTime=&postEndTime=&pickBeginTime=&pickEndTime=&page.orderBy='.format(
    				i, self.yesterday, self.today)
    			try:
    				req = requests.get(url=target_url1, headers=headers, cookies=cookies, verify=False)
    			except Exception as e:
    				print('暂存数据爬取出现问题', e)
    			else:
    				html = req.text
    				sel = etree.HTML(html)
    				c = [sel.xpath('//*[@id="contentTable"]/tbody/tr[{}]/td[4]'.format(i))[0].text for i in range(1, 31) if
    					 sel.xpath('//*[@id="contentTable"]/tbody/tr[{}]/td[4]'.format(i)) != []]
    				d = [float(sel.xpath('//*[@id="contentTable"]/tbody/tr[{}]/td[13]'.format(i))[0].text) for i in range(1, 31)
    					 if sel.xpath('//*[@id="contentTable"]/tbody/tr[{}]/td[13]'.format(i)) != []]
    				data1 += c
    				data2 += d
    		lujing = r'C:\Users\lenovo\Desktop\暂存\{}.xlsx'.format('.'.join(self.yesterday.split('-')[1:]))
    		if os.path.exists(lujing):  # 判断文件是否存在
    			os.remove(lujing)  # 如果存在文件则删除
    		pd.DataFrame({'订单状态': data1, '支付金额': data2}).to_excel(lujing)
    		df = pd.DataFrame({'订单状态': data1, '支付金额': data2}).set_index('订单状态')
    		book = load_workbook(self.today_model1)
    		writer = pd.ExcelWriter(self.today_model1, engine='openpyxl')
    		writer.book = book
    		book.remove(book['暂存'])  # 删除已经存在的sheet
    		df.to_excel(excel_writer=writer, sheet_name="暂存")
    		writer.save()
    		writer.close()
    		print('暂存数据保存成功')
    
    
    if __name__ == '__main__':
    	yesterday = (date.today() + timedelta(days=-1)).strftime("%Y-%m-%d") #今日的日期
    	today = time.strftime('%Y-%m-%d', time.localtime(time.time()))		  #昨日的日期
    	today_report = day_report(today,yesterday)
    	today_report.copy_files()
    

    生成新的报表:

     

    展开全文
  • 生产报表自动化实现方案

    千次阅读 2017-09-11 14:49:39
    生产制造类企业为了监控项目进度和产品生产情况,大多都会...今天,小编就以FineReport报表工具为例,教大家如何制作自动化的生产报表,何为自动化的生产报表?意思就是这种报表只需制作一次,之后只需要对着既定的模板
    生产制造类企业为了监控项目进度和产品生产情况,大多都会要制作生产报表,但往往都存在一些问题,比如报表制作过于繁琐、报表间的数据无法联动等,因为这样的问题存在,所以生产报表这块工作一是浪费了大量的人力,二是没有体现出很好的价值。
     
    今天,小编就以FineReport报表工具为例,教大家如何制作自动化的生产报表,何为自动化的生产报表?意思就是这种报表只需制作一次,之后只需要对着既定的模板录入数据,然后就可以定时生成生产统计报表,如生产日报表,或生产周报表。
     
    生产统计报表因企业不同,格式各不一样,内容上也各有差异,但总体不外乎如下几个内容:产量(日产量、周产量、月产量)、品质(成品率、次品率)和批次,这里我就以最普遍的生产日报表为例,看看应该如何实现。
     
    第一步确认需求、梳理流程,需求是生产日报表,展示的信息有日期、订单号、产品、产量,到这里,报表的主体内容已经确定。下面来梳理流程,首先是每日下班时,由生产人员填写每日生产的具体情况,等所有生产人员填写完毕,就自动汇总生成车间总的生产日报表,这个流程中涉及到生产人员的填报表,自动生成的汇总表,还有一个判断所有员工都已填写的事件。
     
     
    生产报表
     
    第二步就是报表的具体实现,根据第一步,我们现在已经确定了流程和具体的报表样式,先搞定报表,一张供员工使用的填报表单,一张供主管浏览的汇总报表。制作填报表需要使用到FineReport的填报功能,首先在FineReport中新建表单,根据第一步的表格内容制作出相应的样式,这里操作跟excel类似,就不赘述了。
     
    报表样式出来,下面需要进行单元格和数据库的绑定,因为这个是填报表,需要把员工填写的具体数据存储在数据库,然后才能加以汇总展示。那么如何与数据库绑定?很简单,选中待绑定的单元格,设置字段属性,然后再智能添加字段就OK了,具体操作可以参考FineReport帮助文档
     
    第三步发布,FineReport报表是现代化的信息系统,区别与以往的EXCEL工作模式,这里的报表都是通过浏览器在线访问,所以要进行发布,整个发布流程也很简单,只需要通过FineReport的服务端发布即可,你可以选择发布在局域网中,这样同一个公司的其他人员都可以访问你制作好的生产报表了,也可以选择发布在互联网中,这样任何人都可以通过指定的地址来访问报表。
     
    到这里,整个自动化报表就算制作完成了,以后只需要让生产人员记得每天填报生产数据,然后就可以自动生成每日的生产日报表了,还可以指定时间,比如每天早上9点将报表发送到领导的邮箱,是不是很智能很方便呢。
     
    最后,一个普通的生产报表,使用FineReport来制作,大概是这样的:
    生产日报表
    展开全文
  • VBA 代码实现自动化 收集原始数据汇总计算和报表 联系人杨先生 电话 18053150391 电子邮箱 yjjp67@163.com 以房地产销售数据为例 两个销售中心以 Excel记录销售活动原始数据和直接使用公式形成的表格模板如下黄色 ...
  • 财务分析报表如何制作?162套可视动态分析模板,全自动生成...今天给大家带来了162套可视动态财务分析自动生成报表模板,内含公式,自动生成、汇总,图表结合,数据一目了然,清晰直观,可以直接套用,零基础...
  • 用python自动化吧,不会代码,不给自己找事了。 就拿财务报表来说,里面涉及到很多公式、维度,靠自己从头梳理并且做好真的不简单, 而且样式都千篇一律,这样的谁愿意看? 但是这样的就好像换了一个样了: ...
  • 本期课程,我们将借助服务端表格组件GcExcel 的模板语法来完成Excel报表的生成,通过使用简单的语法标记,可以在不借助任何第三方组件的情况下,结合数据源,自动化地生成Excel模板文件。目前,GcExcel...
  • 本期课程,我们将借助服务端表格组件GcExcel 的模板语法来完成Excel报表的生成,通过使用简单的语法标记,可以在不借助任何第三方组件的情况下,结合数据源,自动化地生成Excel模板文件。 目前,GcExcel可以生成的...
  • 所以特意为大家整理了509套Excel精品可视财务分析报表模板,内含公式,直接套用,报表自动生成!,希望在年终报告会上,能够惊艳老板!509套Excel精品可视财务分析报表,内含公式,自动生成产品月度销售财务分析...
  • 要问现代职场人,必备工作技能是什么?Excel技能当仁不让,数据分析、总结汇报、信息传达,统统离不开。但是在日常工作中,Excel也有着它的局限性,以月度数据...如何彻底解决此类繁琐工作,就不得不提自动化。其...
  • 学习Excel技术,关注微信公众号:excelperfect使用VBA自动从Excel中获取数据来创建Word报表文档,一般按照以下步骤:1.创建Word文档模板,用来作为数据分析结果发布平台。在模板中,在每个要插入数据的位置定义书签...
  • 说到Excel动态图表,很多人会觉得挺难做的。确实,Excel动态图表大...下面是其中的一部分图表模板,一起来看看~(领取方法在文末)销售业绩报表无论是自己看数据还是给老板看数据,直接给一堆数字肯定会让人觉得很枯...
  • 本期课程,我们将借助服务端表格组件GcExcel 的模板语法来完成Excel报表的生成,通过使用简单的语法标记,可以在不借助任何第三方组件的情况下,结合数据源,自动化地生成Excel模板文件。目前,GcExcel...
  • 本期课程,我们将借助服务端表格组件GcExcel 的模板语法来完成Excel报表的生成,通过使用简单的语法标记,可以在不借助任何第三方组件的情况下,结合数据源,自动化地生成Excel模板文件。目前,GcExcel...
  • 要问现代职场人,必备工作技能是什么?Excel技能当仁不让,数据分析、总结汇报、信息传达,统统离不开。但是在日常工作中,Excel也有着它的局限性,以月度数据...如何彻底解决此类繁琐工作,就不得不提自动化。其...
  • 实验室管理系统的报表一般采用第三方报表工具或自主研发的报表工具来设置一定格式的报告模板,自动获取检测结果数据和计算处理数据自动的组织和生成报告。报告的生成过程中不需要人工干预,从而可...
  • 今天,和大家分享48套财务季度报告表,录入数据自动进行分析,自动生成图表。一目了然,图表美观,可视效果好,领导更爱看!下面,我们一起来看~财务收入支出明细及盈利情况财务季度费用统计分析月份季度统计...
  • 数据分析对于各个行业都起到了非常重要的作用,那么应该如何进行数据分析呢?...对比excel来说,python能够处理更大的数据集,能够更容易实现自动化分析,比较容易建立复杂的机器学习模型。2、对比spss,...
  • ActiveReports 7中引入了一种新的报表模型——PageReport(页面布局报表),这种报表模型又细分了两...您只需定义好页面大小,然后以一种可视的方式添加需要的控件并设置数据填充方式,剩下的工作将由报表引擎自动...
  • HR常常自嘲“表哥”“表姐”每个月都要在表格上花费大量时间表格以“多”和“杂”领跑办公室所有员工减轻HR做表的压力今天小编的免费福利是《人事自动化管理Excel系统》自带函数,录入数据自动生成员工信息表、入...
  • php OA 源码 办公自动化源码

    热门讨论 2010-10-29 00:51:15
    可以根据要求,自动生成日报表,周报表,月报表,自动发送到相关人员的OA文档中,达到报表自动到桌面的理想的应用境界。 报表中心可以设定相应的权限,权限可以设定到部门,指定人员,人员组。 1.10 系统管理部分 ...
  • 数据分析对于各个行业都起到了非常重要的作用,那么应该如何进行数据分析呢?...对比excel来说,python能够处理更大的数据集,能够更容易实现自动化分析,比较容易建立复杂的机器学习模型。2、对比spss,...
  • 麻烦请教各位: 我现在想用 pdf模板 然后向里面写数据 自动生成 pdf 文件</strong>  就是根据pdf模板自动生成pdf文件    还有就是 <strong>pdf 模板用什么东东来做!</strong> 有点着急 ...
  • PPT并不好用, 但还是得用它, 这里借用豆瓣Top250的电影信息, 利用python-pptx (0.6.7)自动生成250张PPT, 希望通过实例, 给常年整理PPT报表的上班族, 一个解放生产力的...自动化制作PPT 的 一二三 先制作PPT模板 ...
  • 水晶报表的打印

    2019-04-27 17:35:15
    水晶报表的打印就是制作表单,但是它的制作也并不困难,它的数据可以连接数据库进行循环,然后自动列出数据。 水晶报表的六步曲:1、实例化数据集 2、将dt的数据放入数据集的数据表中 3、实例化报表模板 4、...
  • 自定义模块用户可以增加个性的模块,可以自行设计定义操作界面、数据表名、字段名和数值类型,每个自动生成功能的审批流程、查询条件、输出结果(即显示内容)也可以自定义。可以实现增加模块中各类信息的汇总统计...
  • 很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Excel模板文件里,这对于生成复杂格式的Excel报表文件非常有用,这个功能应用PageOffice的基本动态填充功能即可实现。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 427
精华内容 170
关键字:

数据报表自动化模板