国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于 oracle 的 flask 項目(五)——報表下載

klinson / 1116人閱讀

摘要:將報表下載下來,然后能稍許進行修飾,這是必須的。項目描述將頁面原始呈現的數據及搜索后的數據以報表的形式下載下來。至此,你可以實驗一下,你的項目是否可以實現報表下載了。

在國企,很多領導是按部就班的晉升上來的,他們的年齡及經歷使他們至今還沒有掌握電腦的基礎知識,因此,紙質報表是他們掌握全局的依據,必備的工具。將報表下載下來,然后能稍許進行修飾,這是必須的。
項目描述

將頁面原始呈現的數據及搜索后的數據以 excel 報表的形式下載下來。

知識難點

單一的 url 頁面中會呈現出不同的數據,需要能夠把不同的數據下載下來,只需要用到 ajax 的知識,在同一個頁面中以 json 的形式傳遞數據。

實現頁面模板

不再贅述,僅僅是在頁面上加載一個下載按鈕,詳情看源碼。

實現下載功能的試圖函數

views.py 的內容如下:

...
...
import os
from collections import OrderedDict
from config import basedir
from pyexcel_xls import save_data, get_data
...
...



@show.route("/", methods=["GET", "POST"])
def download_xls(filename):
    data = OrderedDict()
    data_path = os.path.join(excel_path, filename)

    num = 0
    if "01.xls" in filename:
        header_data = ["序號", "部門", "角色", "員工", "電話", "客戶", "月份",
                       "本月資產余額    ", "上月資產余額", "新增余額"]
        body_data = [header_data]
        for t in json.loads(request.get_data()):
            num += 1
            body_data.append([num, t["department"], t["role"], t["staff_name"], t["phone"], t["guest_name"],
                              t["month"], t["balance"], t["last_balance"],
                              float("%.2f" % t["balance"]) - float("%.2f" % t["last_balance"])])
        data.update({"01報表": body_data})

    if "02.xls" in filename:
        header_data = ["序號", "部門", "角色", "員工", "電話", "月份", "管戶數"
                       "本月資產余額    ", "上月資產余額", "新增余額"]
        body_data = [header_data]
        for t in json.loads(request.get_data()):
            num += 1
            body_data.append([num, t["department"], t["role"], t["staff_name"], t["staff_phone"],
                              t["month"], t["balance"], t["last_balance"],
                              float("%.2f" % t["balance"]) - float("%.2f" % t["last_balance"])])
        data.update({"02報表": body_data})
    save_data(data_path, data)
    return jsonify({"data": "ok"})

很明顯,通過 return 返回的 jsonify 數據,大家應該知道,我這是要用 json 了。

而其中的兩個 filename 的判斷,我是因為要做兩個頁面的下載鏈接,所以對 filename 進行了一個判斷。

代碼中使用了 collections 的有序字典 OrderedDict, pyexcel_xls的相關模塊,同時也設置了要生成的 xls 文件的生成路徑及文件名——data_path = os.path.join(excel_path, filename)

實現 ajax 功能

既然是 ajax 那就是 javascript 咯,還得返回 html 模板。在 flask 項目中,模板的變量都是封裝在 jinja2 中,我們寫 javascript 的時候,不能多帶帶再建立一個 js 文件,導入到模板中,因為,無法獲得 Jinja2 變量。還得直接在 html 中寫 javasript。

01.html 中實現 ajax 下載
{% block js %}
    {{ super() }} 
    
{% endblock %}

詳情請看注釋。

02.html 中實現 ajax 下載

不在贅述,基本上是和 02.html 頁面一樣。

至此,你可以實驗一下,你的項目是否可以實現報表下載了。

很不幸,我們忘了一個重要的事情,那就是 js 中 database 是繼承自 jinja2 變量,它是否是你所想的那種 json 數據呢。答案是否定的。結果是這樣的:

那么我們需要繼續工作咯。

使 sqlalchemy 數據 json 化

models.py 中建立一個類:

class AlchemyJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        # 判斷是否是Query
        if isinstance(obj, Query):
            # 定義一個字典數組
            fields = []
            # 檢索結果集的行記錄
            for rec in obj:
                # 定義一個字典對象
                record = {}
                # 檢索記錄中的成員
                for field in [x for x in dir(rec) if
                              # 過濾屬性
                              not x.startswith("_")
                              # 過濾掉方法屬性
                              and hasattr(rec.__getattribute__(x), "__call__") == False
                              # 過濾掉不需要的屬性
                              and x != "metadata"]:
                    try:
                        record[field] = rec.__getattribute__(field)
                    except TypeError:
                        record[field] = None
                fields.append(record)
            # 返回字典數組
            return fields
        # 其他類型的數據按照默認的方式序列化成JSON
        return json.JSONEncoder.default(self, obj)

詳細功能請看注釋。

在 01 , 02 兩個 url 鏈接的試圖函數中,加入如下內容:

views.py 中增加

return render_template("show/01.html", data=data, searchForm=search_form, database=json.dumps(database, cls=AlchemyJsonEncoder))

此時,在查看我們要傳輸的 json 數據:

至此,你可以使用下載功能了,不管你的頁面中的數據如何變化,你下載的報表都會顯示你當前頁面的數據。

源碼下載

提示: 讓這么多的數據在頁面中使用明文傳輸,是一種極其不安全的行為,這是網絡爬蟲的肥沃礦場。當然,如果你使用的環境是我這樣的內部 web 環境,那就另當別論。不過如果你有更好的解決方法,那么可以告訴我,不勝感激。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41307.html

相關文章

  • 基于 oracle flask 項目(一)——配置項目

    摘要:一般印象,項目適合做一些短小精悍的項目,特別是與等數據庫結合很是般配。生成報表,不同的查詢結果生成不同的報表。配置從下載客戶端,然后解壓后放入自己指定的目錄。指定數據庫連接池的超時時間。 一般印象,flask 項目適合做一些短小精悍的項目,特別是與 sqlite、mysql 等數據庫結合很是般配。但是在一些大公司,特別是一些金融行業等國企公司,還是以 oracle 居多,那么,這個小辣...

    xialong 評論0 收藏0
  • 基于 oracle flask 項目(三)——生成報表

    摘要:本文主要講解如何生成不同需求的報表。項目描述第一個頁面,以和為關聯,查詢出本月職工的關聯客戶及客戶的資產余額。建立上個月的虛字段。,二是利用函數來對初始化數據進行賦值的操作。提示注意的語法。權限為的用戶只顯示本人的相關信息。 曾經,因為對 sqlalchemy 不熟悉,固執的拋棄之,直接引入原生的 cx_Oracle 來生成報表,但是經過一堆的上下文等錯誤后,我幡然悔悟,還是回到了 s...

    sixgo 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<