分类档案: Postgres

将HTML表转换为Excel下载HTTP响应:慢速OLAP DB连接的黑客

总览

善科 (“Good fox”日本)是一个报告系统(在这里查看Github上的代码) 一世’是在过去两周内在Mozilla创建的。基本上,我的非技术同事对Tableau感到非常沮丧(“INNER JOIN和OUTER JOIN有什么区别?”),我决定为他们创建一个简单的仪表板界面。

它是一个简单的引导程序前端,它包含数据库的活动统计信息 赞助瓷砖. You can drill down to 每 tile or 客户/partner and pivot 通过 things like locale, 国家 and 日期.

善科’s堆栈(从高到低)

一项新功能

加载分析页面之一时,将显示一个表格。我的同事希望能够将数据下载到Excel。我想出了4种可能的方法来实现此目的:

  1. 只需重新运行查询,在后端将结果格式设置为csv,然后将其保存并在window.open()文件位置即可。
  2. 自动保存每个分析请求服务器请求中的数据,并定期清除旧文件。
  3. 使用像 ExcelBuilder
  4. Send the 数据 back to the server, 形成at it, and then back to the 客户 via an iframe

哪个是最佳解决方案?

  1. 这是有问题的,因为我们的重点是查询速度。 redshift数据库是一个 OLAP面向列的数据库和仅追加。这意味着添加数据的速度非常快,但是查询速度却很慢(通常超过6秒)。是的,它正在处理数十亿行这样令人难解的行,但是就等待这么长时间的用户体验而言并不是那么好。’如果他们已经有数据,则要再等待6秒钟重新运行分析。
  2. 听起来这可能最终会在客户端上存储大量数据,但是效果很好。在安全性方面,我’我不确定数据应该留在用户身上’不需要PC。
  3. 这没有’t work out so well –在Firefox中,文件命名错误。将来,我’d根据分析参数命名文件,例如<client>-<date>-<country>.xls
  4. 这是最怪异的解决方案,但是它有效! 烧瓶在本地运行,因此运行速度非常快。具有文件许可权的JQuery / 的JavaScript并不会带来很多麻烦,而且您可以在服务器上轻松地操纵数据这一事实也很不错。

解决方案4

该过程如下“Download 对于 Excel” button is clicked:

  1. 使用JavaScript引用HTML表并将其转换为数组数组
  2. 将iframe附加到DOM
  3. 将带有POST操作和隐藏字段的表单附加到iframe
  4. 将表内容插入隐藏字段’s value
  5. 提交表格
  6. 让Flask接收POST请求并将信息格式化为CSV
  7. 返回带有包含CSV的文件附件的HTTP响应

让’s implement it

在JQuery中,有多种方法可以使用 可重复的.()  但我遇到了麻烦,仅使用.children引用细胞就容易得多。

然后,(本地运行中的)Flask将在以下位置接收POST请求: /download_excel . 让’s set up the 路线:

现在,当用户单击按钮时:

下载Excel链接

他们立即得到:

下载弹出窗口

对不起,我可以’无法显示Excel中的数据,因为数据不是’目前还没有公开。所有代码均可用 在github上!

然而,一件奇怪的事情是表格没有’t出现在检查器中(在Chrome或Firefox中):

在检查器中不可见

不过,您可以使用一些相当长的吸气剂来访问它:

why.jpg

未来功能 

  • 这些文件的名称可能比data.csv更直观–可能是网址中出现的各种情况的组合’s query string
  • 可容纳超过6行的表格。使用不同的定界符(例如,“###”.
  • 如果有好处,请创建一个.xls文件而不是CSV文件