Table of Contents

功能需求描述

一 使用Datatables实现纯前端下载、拷贝

二 query db 实现下载(django)


功能需求描述

用户需要以网页为媒介,从DB里拉取一些数据。

分为两种情况:

  • data已经显示在页面上 (除了下载还需要拷贝其中某一列)
  • data没有显示在页面上,需要在trigger download的功能时,根据用户给定的条件,去后台query data,然后下载下来。

一 使用Datatables实现纯前端下载、拷贝

对于第一种情况,由于data是通过datatables插件展示的,且已经从DB拉到了页面上,也就没有必要为了下载它们再跑到查询一遍数据库了。

datatables已经给了我们封装好的插件:

  • copyHtml5 - Copy to clipboard
  • csvHtml5 - Save to CSV file
  • excelHtml5 - Save to XLSX file - requires JSZip
  • pdfHtml5 - Save to PDF file - requiresPDFMake

(link:https://datatables.net/extensions/buttons/examples/html5/simple.html  )

除了“XXHtml5”以外,还有  copyexcelcsvand pdf 四种。它们与XXHtml5之间的区别暂时还没有搞清楚。

我使用的是“csv”button,只是这样写就可以实现下载的功能:

 table = $('#psumsTable').DataTable( {//不能使用.dataTable。二者返回值不同。在这里我们需要使用datatable插件自带的api,因此必须使用DataTable。//...
"dom": '<"user_button"B>ptlTgi',//指定button到datatable的左上角。会自动生成一个user_button的div,将所有的button包裹起来"buttons": [ {extend: 'csv', //button的功能,包括csv,copy,excel等。这里不能自由发挥,只能使用datatables插件定好的值text:'export' //button上显示的文字}],

很简单,但接下来在实现copy指定的某一行时遇到了困难。因为默认情况下,该功能会将datatable中所有的行和列都导出/拷贝出来。但我只要其中一列呀,其他的必须去掉。

于是去研究copy的文档:

也就是说,datatable的button插件提供customize选项。该选项提供三个参数: 被拷贝的data(字符串类型),button 配置对象,以及Datatables的API实例,这个实例是当前button所属的那个datatable插件的,也就是说,就是我要从中拷贝数据的那个datatable实例。

而它返回的是什么呢? The value that the function returns is the value that will be used for the export.也就是会被拷贝的数据。

也就是说,我可以使用这个option给我的Datatables API实例(第三个参数),找到我想要下载的那一列,作为返回值返回即可。

最终的code大致如下:

"buttons": [  {extend: 'copy', text: 'Copy',customize: function(data, config, api){var copy_list = api.column('need_copy:name').data();//注意name的用法。这里通过这种方式来让api找到我想copy的那一列var copy_data = copy_list .join('\n');  //换行alert('Copied to ClipBoard!'); //一个提示,有没有都行。return copy_data;}},{extend: 'csv', text:'export'} //下载功能。前面提到了。],
//..."columns": [//...{ "data": "column_n", "name": 'need_copy' },

注意上例中的api.column('need_copy:name').data()。因为实现这个功能还有一个坎儿:如何找到我要的那一列。

这就要查Datatables的column-selector了: https://datatables.net/reference/type/column-selector

同样的,csv等button也有customize选项。也可以实现类似的定制化功能。

二 query db 实现下载(django)

以前是这样实现的:

step1:根据前台传回来的搜索条件,到db里头query data。

step2:使用FileResponse下载下来。

代码也很简单,网上一搜一大把:

from django.http import FileResponse
import pandas as pdconn = pymssql.connect(...)  # 连DB
df = pd.read_sql(sql, conn)  # query出来的data存在df中。df是dataframedf.to_csv(csv_file, encoding='utf_8_sig')  # csv_file是文件路径。# add data to response
file = open(csv_file, 'rb')
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="%s"' % output_file_name

前台js的话只需要location.href = XXX, 让上面这段代码可以执行就行了。

氮素!

这里头有一个隐形天坑!

注意到这句code了没有:

df.to_csv(csv_file, encoding='utf_8_sig')

它是将从db中拉出来的data先以csv格式保存在某个地方,然后再在后面打开使用FileResponse,将其传递给浏览器,让用户下载。

不是,我都要下载了,还找个地方存文件干嘛??脱裤子放屁???

但这一次万能的度娘没能直接告诉我答案。网络上能查找到的例子,多是将已经存在的文件下载下来。

我就不能直接把dataframe里头的data直接下载下来吗????(仰天长啸!)

于是浅浅地翻阅了一下django的官方文档:

https://docs.djangoproject.com/en/dev/ref/request-response/

HttpResponse 条目下:

嗯?因缺思厅。

那么这个“my_data”从哪里搞呢?

再去百度dataframe的to_csv()的文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html

也就是说,如果我不对to_csv指定输出文件名,它就会将csv data以字符串的形式返回出来。

这不就是我要的my_data么!

然后就很顺利了:

    output_file_name = ''  # 这个文件名给用户看的,会在浏览器中显示response = HttpResponse(df.to_csv(encoding='utf_8_sig'))response['Content-Type'] = 'application/octet-stream'# response['Content-Type'] = 'text/csv'response['Content-Disposition'] = 'attachment;filename="%s"' % output_file_name

齐活~

另外,有关content_type和content_description的资料:

http://tools.jb51.net/table/http_content_type/

https://www.jianshu.com/p/4c52cb691f54

【web】【django】datatable的button扩展实现纯前端下载和copy指定列内容,以及django的HTTPResponse实现下载功能相关推荐

  1. 新一代纯前端控件集 WijmoJS 2018V2发布,提供 Web 设计器,可动态设计页面并生成代码...

    概述 作为一款纯前端控件集,WijmoJS 秉承"快如闪电,触控优先"的设计理念,在提供优质服务和产品的同时,专注于企业应用开发,不断优化产品架构,与时俱进.除在全球率先支持 An ...

  2. 从 .NET 到 JavaScript —— 纯前端报表控件 ActiveReportsJS 焕新登场

    报表工具的发展史,最早可以追溯到微软报表SSRS(SQL Server Reporting Services)时期.最初,报表工具主要应用于报表的定制.呈现和输出.经过几十年的发展,随着各种业务系统功 ...

  3. Web纯前端“旭日图”实现元素周期表

    一.什么是旭日图 旭日图是在Excel 2016中新增的一种图表.有些类似饼图,饼图的优势是可以显示占比.但是饼图只能显示单级数据.旭日图用来表示多层级数据的占比.旭日图以一种分层方式显示,非常适合用 ...

  4. safari的java扩展_用 Web 技术为 Safari 编写扩展

    原标题:用 Web 技术为 Safari 编写扩展 作者:希德,iOS 开发者,前"有经验的前端开发工程师",就职于网易严选.正在写书<Thinkable SwiftUI&g ...

  5. 用html5做元素周期表,Web纯前端“旭日图”实现元素周期表

    一.什么是旭日图 旭日图是在Excel 2016中新增的一种图表.有些类似饼图,饼图的优势是可以显示占比.但是饼图只能显示单级数据.旭日图用来表示多层级数据的占比.旭日图以一种分层方式显示,非常适合用 ...

  6. 纯前端控件集 WijmoJS 2018V2发布,提供可视化设计器,在React、Vue和Angular中的更易用...

    作为一款纯前端控件集,WijmoJS 秉承"快如闪电,触控优先"的设计理念,在提供优质服务和产品的同时,专注于企业应用开发,不断优化产品架构,与时俱进.除在全球率先支持 Angul ...

  7. 纯前端文档预览,还要支持所有主流格式,有这一篇就足够了

    写在前面 纯前端的文档预览功能,是非常常见的需求,但就是这么简单的需求,难住了许多可爱的小伙伴们.别急,先访问一下解决方案,给你一个惊喜,再往下看: 文件在线预览DEMO 服务器文件预览DEMO 20 ...

  8. 「纯前端容器」打造无缝平滑的用户体验

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 前端性能现状 提到前端你最先想到什么?前端工程?web?JavaScript.CSS.HTM ...

  9. 解决页面间体验问题的纯前端容器Lath

    提到前端你最先想到什么?前端工程?web?JavaScript.CSS.HTML? 前端性能现状 如果站在用户的视角那是他们距离信息最近的地方,无论前端在生产技术上如何演变,最终服务于信息表达的根本不 ...

最新文章

  1. 浅谈Android系统开发中LOG的使用
  2. 加密、解密、摘要、签名、证书一文搞懂
  3. vue.js框架的生命周期:常用钩子函数
  4. python线程池模块第三方包_python线程池(threadpool)模块使用笔记详解
  5. SparkStreaming之mapWithState
  6. Abbott's Revenge UVA - 816 (输出bfs路径)
  7. python27换行_python 27 :用句点字符匹配换行
  8. php use后怎么引用函数,php后向引用怎么带入到函数参数
  9. 基于python下django框架 实现旅游景区景点售票系统详细设计
  10. 张一鸣在字节跳动7周年庆典上的演讲
  11. linux中rar文件包的解压方式
  12. 基于ATmega16单片机 程控滤波器程序源代码
  13. 驻云CEO教你0门槛搭建电商网站,精选产品组合限量神券 低价买
  14. 重装系统后开机启动项菜单如何删除
  15. 芯片测试的目的及原理介绍
  16. iOS 10版本适配
  17. 看看这模型!“桥梁建设国家队”是如何用CC来三维建模的?
  18. 内外边距问题(清除、合并、塌陷)
  19. LintCode 1173.反转字符串
  20. 判断web网站是否站库分离

热门文章

  1. mac系统-安装虚拟无人机px4及其简单操作教程
  2. 【java-Date】
  3. 康耐视VisionPro脚本BUG修改教程
  4. 实测 11 款远程视频会议软件,宅家工作也能如丝般顺滑
  5. 如何检测显卡类型和OpenGL版本?
  6. 国内平台游戏借苹果iOS爆发:游戏开发产值过亿
  7. 失眠脑子一直在想事情,试试这些高质量睡眠小妙招
  8. NCH PicoPDF Plus for Mac(PDF编辑器)
  9. BIGEMAPapp导入文件方式
  10. 前端基础入门之css像素与视口和媒体查询