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

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年6月6日 星期四

讀取EXCEL檔案計算後儲存到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
from openpyxl import load_workbook
import win32com.client as win32
import os

# 載入現有的 Workbook
wb = load_workbook('AquaticTransData.xlsx')
ws = wb.active

# 計算總交易量和總交易額
TotalTradingVolume = 0  # 總交易量
TotalTransactionVolume = 0  # 總交易額
row = 2
while (ws['E' + str(row)].value != None):
    TotalTradingVolume += ws['E' + str(row)].value
    TotalTransactionVolume += ws['E' + str(row)].value * ws['F' + str(row)].value
    row+=1
ws['D'+str(row)] = '總交易量'
ws['D'+str(row+1)] = '總平均價'
ws['E'+str(row)] = TotalTradingVolume
ws['E'+str(row+1)] = TotalTransactionVolume / TotalTradingVolume
ws['E'+str(row+2)] = '王甲乙'

# 儲存到 Excel 檔案
wb.save('AquaticTransData.xlsx')
print("資料已儲存到 AquaticTransData.xlsx")

# 使用 win32com 將 Excel 轉換為 PDF
excel = win32.Dispatch('Excel.Application')
excel.Visible = False

# 打開 Excel 文件
workbook = excel.Workbooks.Open(os.getcwd()+'/'+'AquaticTransData.xlsx')

# 獲取第一個工作表
sheet = workbook.Sheets(1)

# 設置列印網格線
sheet.PageSetup.PrintGridlines = True

# 將工作表轉換為 PDF
pdf_path = os.getcwd()+'/'+'AquaticTransData.pdf'
workbook.ExportAsFixedFormat(0, pdf_path)

# 關閉 Excel 應用
workbook.Close(False)
excel.Quit()

print("PDF 檔案已儲存為 AquaticTransData.pdf")

執行結果:
資料已儲存到 AquaticTransData.xlsx
PDF 檔案已儲存為 AquaticTransData.pdf




2024年5月20日 星期一

將Excel檔案存成PDF檔,並加上格線



延續文章:利用Python來操作Excel計算總交易量和總平均

程式碼:

 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
from openpyxl import load_workbook
import win32com.client as win32
import os

# 載入現有的 Workbook
wb = load_workbook('AquaticTransData.xlsx')
ws = wb.active

# 計算總交易量和總交易額
TotalTradingVolume = 0  # 總交易量
TotalTransactionVolume = 0  # 總交易額
ws['G10001'] = '總交易量'
ws['G10002'] = '總平均價'
for row in range(2, 10001):
    TotalTradingVolume += ws['H' + str(row)].value
    TotalTransactionVolume += ws['H' + str(row)].value * ws['I' + str(row)].value
ws['H10001'] = TotalTradingVolume
ws['H10002'] = TotalTransactionVolume / TotalTradingVolume

# 儲存到 Excel 檔案
wb.save('AquaticTransData.xlsx')
print("資料已儲存到 AquaticTransData.xlsx")

# 使用 win32com 將 Excel 轉換為 PDF
excel = win32.Dispatch('Excel.Application')
excel.Visible = False

# 打開 Excel 文件
workbook = excel.Workbooks.Open(os.getcwd()+'/'+'AquaticTransData.xlsx')

# 獲取第一個工作表
sheet = workbook.Sheets(1)

# 設置列印網格線
sheet.PageSetup.PrintGridlines = True

# 將工作表轉換為 PDF
pdf_path = os.getcwd()+'/'+'AquaticTransData.pdf'
workbook.ExportAsFixedFormat(0, pdf_path)

# 關閉 Excel 應用
workbook.Close(False)
excel.Quit()

print("PDF 檔案已儲存為 AquaticTransData.pdf")