python通过接口导出数据到excel
  楠木大叔   3/14/23 10:36:36 PM
前两天有个女同事找我帮忙导一份她们部门所有人员2月份的在线时长。这着实让我犯了难。

导航

  • 引子
  • 棘手的需求
  • python request
  • 实战案例
  • 结语
  • 参考

引子

自从用了Python做报表导出,确实给我的工作带来了很多方便。

无论是将数据从excel/csv导入数据库,还是将数据从数据库导出到excel/csv,都能轻松搞定!

但是,前两天有个女同事找我帮忙导一份她们部门所有人员2月份的在线时长。这着实让我犯了难。

因为这些数据并不是直接从数据库导出,而是在内存中做了复杂计算得出的。我们提供这样的可视化查询界面,但是只能按照天过滤,如果要查看30天的数据,就要筛选三十次。



棘手的需求

面对这样的需求,我以前的那点python储备正式不够用了。是用python从数据库拉取数据,在内存计算,还是直接调用现有接口导出到数据库呢?

思来想去,最终选择了python通过请求现有接口,然后导出数据。

毕竟,这样成本最低。

python request

那么,Python如何请求接口呢?

我们知道Java程序可以通过http请求实现对RestfulApi的请求。在pthon的世界里,我们可以通过python request实现类似的逻辑。

比如,Get和post的示例如下:

r = requests.get('https://api.github.com/events')
r = requests.post('https://httpbin.org/post', data={'key''value'})

最通常的方法是通过r=request.get(url)构造一个向服务器请求资源的url对象。这个对象是Request库内部生成的。r返回的是一个包含服务器资源的Response对象,包含了从服务器返回的所有的相关资源。

关于requests,更多可以查看官方文档:https://docs.python-requests.org/en/latest/user/quickstart/

实战案例

废话不多说,我们现在就用代码来实现上面的需求吧!


import json
import requests

#导入pymysql的包
import  pymysql
import  pymysql.cursors

# 导入excel操作包
import xlwt
#from datetime import datetime
from datetime import datetime, timedelta

def write_csv(wbk,day,sheet):

    try:
          #请求url
          url = """http://localhost:8086/api/v1/xxx/on-duty-counselors?deptSourceType=DS&startTime={dtBegin}&endTime={dtEnd}&page=1&limit=50"""
          strpattern='%Y-%m-%d %H:%M:%S'
          dtBegin0=datetime.strptime('2023-02-01 00:00:00', strpattern) 
          dtEnd0=datetime.strptime('2023-02-28 23:59:59', strpattern) 
          dtBegin=(dtBegin0+timedelta(days=day)).strftime(strpattern)
          dtEnd=(dtEnd0+timedelta(days=day)).strftime(strpattern)

          info = {'dtBegin': dtBegin,'dtEnd':dtEnd}  # 参数是字典类型
          url = url.format(**info)

          #查询字符串
          print('url:'+url)
          res= requests.get(url)
          jsonRes=res.json() #转化
          #print(jsonRes)
          result=jsonRes['data']['items']
          
          # 实例化一个Workbook()对象(excel文件)
          #wbk = xlwt.Workbook()
          # 新建一个名为Sheet1excel sheet。此处的cell_overwrite_ok =True是为了能对同一个单元格重复操作。
          sheet = wbk.add_sheet(sheet, cell_overwrite_ok=True)
          #sheet = wbk.add_sheet('Sheet1', cell_overwrite_ok=True)

          # 表头
          header_row = ["真实姓名","登录时长()""在线时长()","挂起时长()"]

          # 获取当前日期,得到一个datetime对象如:(2016, 8, 9, 23, 12, 23, 424000)
          #today = datetime.today()
          # 将获取到的datetime对象仅取日期如:2016-8-9
          #today_date = datetime.date(today)
          # 遍历result中的没个元素。
          for i in range(len(result)):
              userid=result[i]['userId']
              print('userId:'+str(userid))
              data = [result[i]['realName'],result[i]['loginTime'],result[i]['onlineTime'],result[i]['hangUpTime']]
              if i==0:
                  for j in range(len(header_row)):
                      # 第一个参数代表行,第二个参数是列,第三个参数是内容,第四个参数是格式
                      sheet.write(i, j, header_row[j])
              #result的每个子元素作遍历,
              for k in range(len(data)):
                  sheet.write(i+1, k, data[k])
    except Exception as e:
          print('Error:',e)
    finally:
          print('执行完成')


# 如果该文件不是被import,则执行下面代码。
if __name__ == '__main__':
    # 实例化一个Workbook()对象(excel文件)
    wbk = xlwt.Workbook()
    for i in range(10):
      sheet="03-"+str(i+1)
      write_csv(wbk,i,sheet)
    wbk.save('on_duty_counselors_month2' + '.xls')  


代码中几乎每行都有注释,这里不再赘述。

至此,代码已经编写完成,我们保存为on-duty-counselors.py文件。

接下来,就是让代码run起来,导出到csv。

这里需要注意的是,我们需要提前搭建好python的运行环境。新手同学可以参考《Python安装和使用教程(windows)》

我这里使用的编辑器是VS Code,推荐您也使用。

上面的代码用VS Code 编辑器打开之后,执行

我们再次执行这个python语句,看看导出结果。

执行之后,生成了一个excel文件。



数据就已经导出成功了,完美!

结语

python对于数据处理具有天然优势,比如它的pandas,非常强大。有兴趣的同学可以进一步研究。

在实际使用过程中,一个文件就可以处理一个报表需求,管理也很方便。

在大数据时代,数据分析已经变得越来越受重视,如果您需要经常需要导出报表或者想成为一名数据分析工程师,那就赶快入手python吧!

参考

版权声明: 本文为智客工坊「楠木大叔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。