工程招標文件線上套印作法

前言

公部門工程案要上網招標之前都會需要製作招標文件及投標表單,其內容包含:

招標文件

  • 工程採購契約
  • 投標須知

投標表單

  • 標單
  • 標封
  • 投標文件審查表
  • 退還押標金申請單
  • 押標金查詢同意書
  • 使用印章授權書
  • 投標廠商聲明書
  • 投標切結書
  • 身分揭露表

既有作法是利用WordVBA搭配Excel內容套印,但若招標文件有版本更迭時,需要將每個同仁的檔案進行更換才能進行正確的內容輸出,這對於版本控管有相當大的難度。

為了減少版本更迭的問題,目前設計直接將最新的內容推送到伺服器位置,前端則利用網頁進行資料填寫,自此就能夠及時輸出最正確的資料,希望透過這樣的設計能夠減少招標文件產製的版本疏漏。

概略作法

  1. 儲存預計要取代的文字內容及標籤名稱。
  2. 將範本word複製一份出來進行修改。
  3. 檢查word中是否有標籤名稱。
  4. 如果有找到,將標籤名稱進行取代後輸出。
  5. 輸出內容打包成ZIP,讓使用者下載使用。

必要知識點

  • Streamlit
  • python-docx

操作網頁

🔗 工程招標文件V1.2.3

標籤

目前的實作用 %% 當作標籤的偵測點,演算過程會針對整個段落進行,偵測到後才會將標籤名稱進行文字取代。

Fig1. 標籤範例

多執行緒

以前是使用 Word VBA 進行檔案的處理,礙於VBA為單執行緒的處理,即便CPU有很多顆,但他一次只能夠處理一份文件,沒有辦法發揮多顆CPU的效果,導致文件在生成過程都會需要排隊,消耗不少時間。

Python可以藉由多執行緒的演算法來同時併發檔案的處理,讓整體產製招標文件過程時間下降,甚至瞬間就完成,對於時間相當寶貴的現代來說相當有幫助!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import concurrent.futures
import time

# 模擬任務: 假設處理時間為隨機數值的延遲
def task(task_id):
print(f"任務 {task_id} 開始處理...")
time.sleep(2) # 模擬處理延遲
print(f"任務 {task_id} 處理完成!")
return f"結果: 任務 {task_id}"

def main():
# 使用 ThreadPoolExecutor 來並行處理多個任務
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
# 提交任務給執行緒池
tasks = [executor.submit(task, i) for i in range(5)]

# 等待所有任務完成並獲取結果
for future in concurrent.futures.as_completed(tasks):
result = future.result()
print(result)

if __name__ == "__main__":
main()
  • 本篇為採用Streamlit,仍然屬於單執行緒的並不原生支持多執行緒,上方範例程式碼僅說明python有支持多執行緒的撰寫方式,於DOS指令上可以發揮其效果。

後續發展

目前的介面仍賴於使用者進行資料填寫後點選按鈕輸出,然而身為一名程式設計師,要填寫的資料越少越好,因此讓填寫資料這件事情給送審預算書的同事進行,針對預算書審查的內容進行填報。

預算書審查

資料盡可能重複利用,讓了解詳情的人員進行填寫最有效率,Streamlit好處是他可以自動適應各種裝置,所以手機部分也可以進行填寫,版型上也不至於太難看,在此可以將部屬的網頁做成QRCODE貼在辦公室主機旁,讓送審人員直接掃描填寫。

Fig2. 預算書審查畫面

工程案件總覽

目前發展剛起步,未來可以做儀表板控制目前進度及預算分配情形。

Fig3. 工程案件總覽畫面

載入招標文件

選擇已送審預算書內容,將其所填寫的資料依序導入到投標文件的欄位中,此處需要填寫的只有押標金金額及履約保證金。

Fig4. 載入招標文件畫面

後記

礙於公部門有資料外洩的疑慮,在此僅能提供招標文件產製網頁供使用,未來如有需要建立資料庫可再引用原始碼至貴單位進行使用,資料庫的建置又是另外一個課題了,本篇不再贅述。