顯示具有 Word 標籤的文章。 顯示所有文章
顯示具有 Word 標籤的文章。 顯示所有文章

2025年6月4日 星期三

利用JinJa2模版語言設計漁產品交易行情Word模版

 


1. template.doc


2.python程式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests
import json
from docxtpl import DocxTemplate

# 取得JSON資料
r = requests.get('https://data.moa.gov.tw/Service/OpenData/FromM/AquaticTransData.aspx')
json_data = json.loads(r.text)

# 整理資料(轉換為適合模板的格式)
data = []
for item in json_data:
    data.append({
        '交易日期': item.get('交易日期'),
        '品種代碼': item.get('品種代碼'),
        '魚貨名稱': item.get('魚貨名稱'),
        '市場名稱': item.get('市場名稱'),
        '上價': str(item.get('上價')),
        '中價': str(item.get('中價')),
        '下價': str(item.get('下價')),
        '交易量': str(item.get('交易量')),
        '平均價': str(item.get('平均價'))
    })

# 套用模板
tpl = DocxTemplate("template.docx")
context = { 'data': data }
tpl.render(context)
tpl.save("AquaticTransData.docx")

print("資料已套用模板並儲存為 AquaticTransData.docx")

執行結果:
如最上面的圖片

2024年6月9日 星期日

用Python把最近漁產品交易行情資料並儲存成Word檔案

範例一、取得最近漁產品交易行情資料並儲存成Word檔案
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import requests
import json
from docx import Document

# 從URL取得JSON資料
r = requests.get('https://data.moa.gov.tw/Service/OpenData/FromM/AquaticTransData.aspx')
json_data = json.loads(r.text)

# 建立一個新的Word文件
doc = Document()
doc.add_heading('漁產品交易行情', level=1)

# 寫入標題行
headers = ['交易日期', '品種代碼', '魚貨名稱', '市場名稱', '上價', '中價', '下價', '交易量', '平均價']
table = doc.add_table(rows=1, cols=len(headers))
hdr_cells = table.rows[0].cells
for idx, header in enumerate(headers):
    hdr_cells[idx].text = header

# 寫入資料
for item in json_data:
    row = [
        item.get('交易日期'),
        item.get('品種代碼'),
        item.get('魚貨名稱'),
        item.get('市場名稱'),
        str(item.get('上價')),
        str(item.get('中價')),
        str(item.get('下價')),
        str(item.get('交易量')),
        str(item.get('平均價'))
    ]
    row_cells = table.add_row().cells
    for idx, cell_value in enumerate(row):
        row_cells[idx].text = str(cell_value)

# 儲存到Word檔案
doc.save('AquaticTransData.docx')

print("資料已儲存到 AquaticTransData.docx")

執行結果:
資料已儲存到 AquaticTransData.docx

開啟AquaticTransData.docx的畫面如下:


範例二、加上格線

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import requests
import json
from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

# 從URL取得JSON資料
r = requests.get('https://data.moa.gov.tw/Service/OpenData/FromM/AquaticTransData.aspx')
json_data = json.loads(r.text)

# 建立一個新的Word文件
doc = Document()
doc.add_heading('漁產品交易行情', level=1)

# 寫入標題行
headers = ['交易日期', '品種代碼', '魚貨名稱', '市場名稱', '上價', '中價', '下價', '交易量', '平均價']
table = doc.add_table(rows=1, cols=len(headers))
hdr_cells = table.rows[0].cells
for idx, header in enumerate(headers):
    hdr_cells[idx].text = header

# 寫入資料
for item in json_data:
    row = [
        item.get('交易日期'),
        item.get('品種代碼'),
        item.get('魚貨名稱'),
        item.get('市場名稱'),
        str(item.get('上價')),
        str(item.get('中價')),
        str(item.get('下價')),
        str(item.get('交易量')),
        str(item.get('平均價'))
    ]
    row_cells = table.add_row().cells
    for idx, cell_value in enumerate(row):
        row_cells[idx].text = str(cell_value)

# 設置表格邊框
def set_table_border(table):
    tbl = table._element
    tbl_pr = tbl.tblPr
    tbl_borders = OxmlElement('w:tblBorders')
    for border_name in ['top', 'left', 'bottom', 'right', 'insideH', 'insideV']:
        border = OxmlElement(f'w:{border_name}')
        border.set(qn('w:val'), 'single')
        border.set(qn('w:sz'), '4')
        border.set(qn('w:space'), '0')
        border.set(qn('w:color'), 'auto')
        tbl_borders.append(border)
    tbl_pr.append(tbl_borders)

# 加上格線
set_table_border(table)

# 儲存到Word檔案
doc.save('AquaticTransData.docx')

print("資料已儲存到 AquaticTransData.docx")

執行結果:
資料已儲存到 AquaticTransData.docx

開啟AquaticTransData.docx的畫面如下:

範例三、轉成PDF

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import requests
import json
from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx2pdf import convert

# 從URL取得JSON資料
r = requests.get('https://data.moa.gov.tw/Service/OpenData/FromM/AquaticTransData.aspx')
json_data = json.loads(r.text)

# 建立一個新的Word文件
doc = Document()
doc.add_heading('漁產品交易行情', level=1)

# 寫入標題行
headers = ['交易日期', '品種代碼', '魚貨名稱', '市場名稱', '上價', '中價', '下價', '交易量', '平均價']
table = doc.add_table(rows=1, cols=len(headers))
hdr_cells = table.rows[0].cells
for idx, header in enumerate(headers):
    hdr_cells[idx].text = header

# 寫入資料
for item in json_data:
    row = [
        item.get('交易日期'),
        item.get('品種代碼'),
        item.get('魚貨名稱'),
        item.get('市場名稱'),
        str(item.get('上價')),
        str(item.get('中價')),
        str(item.get('下價')),
        str(item.get('交易量')),
        str(item.get('平均價'))
    ]
    row_cells = table.add_row().cells
    for idx, cell_value in enumerate(row):
        row_cells[idx].text = str(cell_value)

# 設置表格邊框
def set_table_border(table):
    tbl = table._element
    tbl_pr = tbl.tblPr
    tbl_borders = OxmlElement('w:tblBorders')
    for border_name in ['top', 'left', 'bottom', 'right', 'insideH', 'insideV']:
        border = OxmlElement(f'w:{border_name}')
        border.set(qn('w:val'), 'single')
        border.set(qn('w:sz'), '4')
        border.set(qn('w:space'), '0')
        border.set(qn('w:color'), 'auto')
        tbl_borders.append(border)
    tbl_pr.append(tbl_borders)

# 加上格線
set_table_border(table)

# 儲存到Word檔案
word_filename = 'AquaticTransData.docx'
pdf_filename = 'AquaticTransData.pdf'
doc.save(word_filename)

# 轉換為PDF
convert(word_filename, pdf_filename)

print(f"資料已儲存到 {pdf_filename}")

執行結果:

  0%|          | 0/1 [00:00<?, ?it/s]
100%|██████████| 1/1 [00:45<00:00, 45.97s/it]
100%|██████████| 1/1 [00:46<00:00, 46.15s/it]
資料已儲存到 AquaticTransData.pdf

開啟AquaticTransData.pdf的畫面如下:



2024年5月28日 星期二

用Python讀取漁產品交易行情資料儲存在JinJa2模板Word中

上一篇文章:設計具備JinJa2模板的漁產品交易Word和Python簡易程式

模版:



程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from docxtpl import DocxTemplate
import requests
import json
r = requests.get('https://data.moa.gov.tw/Service/OpenData/FromM/AquaticTransData.aspx')
text = json.loads(r.text)
table=[]
for row in text:
    fishtran={}
    fishtran['date']=row['交易日期']
    fishtran['id']=row['品種代碼']
    fishtran['fish']=row['魚貨名稱']
    fishtran['market']=row['市場名稱']
    fishtran['upper']=row['上價']
    fishtran['middle']=row['中價']
    fishtran['lower']=row['下價']
    fishtran['volume']=row['交易量']
    fishtran['average']=row['平均價']
    table+=[fishtran]
context = {'table':table}
tpl = DocxTemplate("AquaticTransTemplate.docx")
tpl.render(context)
tpl.save("AquaticTransPapers.docx")

執行結果:


2024年5月27日 星期一

設計具備JinJa2模板的漁產品交易Word和Python簡易程式

 模板:



程式"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from docxtpl import DocxTemplate, RichText

tpl = DocxTemplate("AquaticTransTemplate.docx")

context = { 
       "table":[
                { "date" : "1130527",
                  "id" : 1011,
                  "fish" : RichText("吳郭魚", color='00FF00',
                                      italic=True, size=20),
                  "market" : RichText("斗南", color='0000FF',
                                      italic=False, size=20),
                  "upper" : 82,
                  "middle" : 71.6,
                  "lower" : 56.2,
                  "volume" : 1720.3,
                  "average" : 70.6,
                }, 
                { "date" : "1130527",
                  "id" : 1019,
                  "fish" : RichText("其他吳郭魚", color='00FF00',
                                      italic=True, size=20),
                  "market" : RichText("台中", color='0000FF',
                                      italic=False, size=20),
                  "upper" : 108,
                  "middle" : 100,
                  "lower" : 50,
                  "volume" : 317.6,
                  "average" : 99.6,
                }, 
               ]
          }

tpl.render(context)
tpl.save("AquaticTransPapers.docx")

執行結果:

用JinJa2設計試題Word模板再用Python產生個人試題紙

上一篇文章:用Python設計JinJa2樣版的Word文件

Word試題模板



程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from docxtpl import DocxTemplate

tpl = DocxTemplate("ExamTemplate.docx")

context = {
            "schoolyear" : "112",
            "semester" : "二",
            "subject" : "電腦軟體應用",
            "class" : "五資一甲",
            "studentID" : "123456789",
            "name" : "王老五"
          }

tpl.render(context)
tpl.save("ExaminationPapers.docx")

執行結果:








用Python設計JinJa2樣版的Word文件

依照維基百科的解釋,Jinja2 是為 Python 提供的一個功能齊全的模板引擎。若是您對Django有熟悉,應該瞭解MTV框架,就是模型(Model)、模板(Template)、視圖(View),而模板就是採用Jinja2來設計。本文將以某人歡迎光臨某地來做為說明。

範例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import docx
from docxtpl import DocxTemplate


doc = docx.Document()
doc.add_heading("【{{ name }}】歡迎光臨【{{ town }}】", level=1)
doc.save("建立歡迎光臨文件樣版.docx")

tpl = DocxTemplate("建立歡迎光臨文件樣版.docx")

context = {
            "name" : "王老五",
            "town" : "虎尾鎮"
          }

tpl.render(context)
tpl.save("建立歡迎光臨文件.docx")

執行結果:
建立歡迎光臨文件樣版.docx


建立歡迎光臨文件.docx


2018年10月6日 星期六

Python從網路爬文到Word存檔

從網路可以取得許多資料,接下來若能把這些資料轉成Word檔,那就更完美了,記得要先安裝pip3 install python-docx。

import requests
from bs4 import BeautifulSoup
from docx import Document
from docx.shared import Inches

url = "http://www.nkut.edu.tw" 
re = requests.get(url) 
re.encoding='utf8'

soup = BeautifulSoup(re.text, 'html.parser')
html_inforamtion = soup.find('p')
print(html_inforamtion)

document = Document()
document.add_heading('南開科技大學', 0)
p = document.add_paragraph(html_inforamtion)
document.save('nkut.docx')

以下是print(html_inforamtion)的結果

Word的存檔路徑

查看輸出的Word檔