顯示具有 Programme程式相關 標籤的文章。 顯示所有文章
顯示具有 Programme程式相關 標籤的文章。 顯示所有文章

2026年9月17日 星期四

AGY神器 ,對PNG 圖像檔🖼️ 之 OCR文字辨識 拆解

針對 PNG 圖像(例如 來源圖檔.png)如何透過 OCR(光學字元辨識)與電腦視覺 (Computer Vision) 精準辨識並拆解考題,進行費曼實體比喻、物理管線拆解與程式碼物理意義解構。

💡 費曼 (FEYNMAN) 實體生活比喻解說

「想像 PNG 考題圖片是一張印有複雜考題的實體試紙,而 Python 是戴著高科技放大鏡的考古學家:」
  1. cv2.imread(p)(掃描器將紙張放進閱卷機)
    就像考古學家拿到試紙時,先將試紙放進 4K 掃描器,將紙上的文字、網格與數字轉換成由「紅綠藍 (RGB) 像素顆粒」組成的實體矩陣,不遺漏任何微小細節。
  2. cv2.cvtColor(img, COLOR_BGR2GRAY) + 大津二值化(用黑白顯影劑去斑)
    試紙上可能有些許黃漬、陰影或彩色背景(如綠色 Start 塊、紅色 Goal 塊)。這就像噴上黑色化學顯影劑,去除所有干擾顏色,只保留「純黑文字」與「純白背景」,讓字跡邊緣清晰銳利。
  3. cv2.findContours()(用美工刀將題目裁切為獨立區塊)
    考古學家拿起美工刀,依照紙上的線條框線,把試紙分割成三個獨立零件(均屬PNG圖檔片段資訊分段區塊拆解):
    • 頂部:【題目敘述區塊】(題目文字與條件)
    • 左下:【Q 值數據表格區塊】(動作與數值)
    • 右下:【3 × 3 網格地圖區塊】(S 與 G 位置)
  4. pytesseract.image_to_string()(速記員逐字聽寫與公式符號還原)
    速記員拿起放大鏡盯著每個切出來的區塊,把圖形字跡翻譯成純文字 (0,0), ε = 0, Q值 以及選項 (A) (B) (C) (D),並送入 程式評體內進行科學推演!

🔬 PNG 考題 OCR 拆解管線三大實體階段 (Physical Pipeline Breakdown)

💜【Phase 1: 二進位標頭與矩陣加載 (Header Scan & Matrix Load)】
 PNG 檔案 (Binary) ---> cv2.imread() / PIL.Image ---> 驗證 Magic Bytes (\x89PNG\r\n\x1a\n) & 構建 HxWxC 像素矩陣 (0.005 秒完成通道校驗,確認影像解析度與顏色空間如 BGR/RGBA) 💜 【Phase 2: 圖像預處理與區域切割 (CV Preprocessing & ROI Extraction)】 
 PNG 像素矩陣 (Height x Width x Channel) 
                       ▼
【灰階化 & 灰階直方圖均衡】 (cv2.cvtColor -> Gray)  
                       ▼ 
 【OTSU 自適應二值化 (Thresholding)】 
 (將文字與背景分開,消除背景色塊噪聲) 
                                  ▼ 
 ┌────────────────┴──────────────┐ 
 【ROI 矩形邊界輪廓探測】           【降噪與膨脹侵蝕 (Morphology)
 (cv2.findContours)                       (cv2.dilate/erode 清除破損字體邊緣)  └────────────────┬───────────────┘  
                                             ▼
            產出獨立 ROI 區塊 (Text_ROI, Table_ROI, Grid_ROI) 

💜 【Phase 3: 雙軌 OCR  (Dual-Track OCR 】   ┌───────────────┴───────────────┐ 
【Tesseract / EasyOCR 辨識軌】                       【 專家對位軌】
 (抽取 0.50, 0.80, ε=0, (0,0) 等實體 Token)           (將數值注入進行推理)               
            ▼                                                                             ▼ 
 產出 JSON Struct (q_table: 
{Up:0.5, Down:0.8})                                            產出 專家級解析文案

🛠️ 程式碼片段之物理意義解構 (Code Breakdown)

1️⃣ cv2.imread(img_path)(二進位矩陣加載與像素對位)

import cv2
# 物理意義:0.005 秒內將 PNG 檔案還原為 H x W x C 的 3D 物理陣列
img = cv2.imread(img_path)
h, w, c = img.shape
# 目的:建立圖像實體空間座標系,確保後續裁切 (Crop) 與文字區塊定位時不會發生矩陣邊界溢出 (Index Error)。

2️⃣ cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)(自適應二值化)

# 物理意義:計算全圖灰階直方圖雙峰,自動尋找最佳閥值,將顏色壓平為純黑 (0) 與純白 (255)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 目的:消除「S 綠色區塊」、「G 紅色區塊」及題目背景淡藍色等干擾,讓 OCR 引擎(Tesseract)專注於高對比度的文字黑邊。

3️⃣ cv2.findContours()(ROI 考題區域組件分割)

# 物理意義:在二進位圖片中尋找閉合輪廓,進行佈局分析 (Layout Analysis)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    x, y, w_box, h_box = cv2.boundingRect(cnt)
    if w_box > 50 and h_box > 20: # 過濾微小雜訊
        roi = img[y:y+h_box, x:x+w_box]
# 目的:自動定位圖片中的「Q值數據表格」與「選項文字區」,達成組件級 (Component-level) 的分割採樣。

4️⃣ pytesseract.image_to_string(roi, config='--psm 6')(文字實體辨識與 Token 注入)

import pytesseract
# 物理意義:使用預訓練神經網路將 ROI 圖像陣列轉換成 UTF-8 實體字串
text_data = pytesseract.image_to_string(gray, lang='cht+eng', config='--psm 6')
# 參數物理意義:
# --psm 6 : 假設圖像為單一統一文字區塊 (Assume a single uniform block of text)
# lang='cht+eng' : 同時載入繁體中文與英文/數學符號模型
# 目的:精確抽取 "ε=0", "Q值", "0.80" 等關鍵 Key-Value 隊列,並直接注入進行解答計算。

相關資訊:
OCR圖片轉文字Tesseract套件

AGY神器 拆解MP4影音檔

2026年4月4日 星期六

Win32 環境操作中文 (Encoding Integrity )編碼,供AI_Agent操作參考資訊

情境:使用GEMINI CLI技術基底,進行中文處理操作,但AI_TUTOR不一定能完全掌握使用者端OS作業環境,而筆者是採用PowerShell做為啟用GEMINI CLI基底,但常有PYTHON程式在處理過程中,會將現有運作中之檔案編碼(預設為UTF-8),因操作讀取關係直接將亂碼混入處理之檔案(如:*.MD、*.PY等),所以下方資訊將有助於AI_TUTOR代理人,掌握運作中環境,將有助於改善亂碼亂入情形。

## 1. 使用者環境設定GEMINI.MD (位於 %USERPROFILE%\.gemini),因為AI代理人會於載入系統時,讀取個人環境資訊,如果設定不同語言,它將會容易語義偏移發生可能。

## Gemini Added Memories - My preferred editor, Notepad++, is located at 'D:\Program Files\Notepad++\notepad++.exe' 

- ユーザーの好きなプログラミング言語はPythonです。

- User prefers Traditional Chinese (繁體中文) for all communications. Do not use Japanese.

2. 編碼衝突架構分析 (Technical Taxonomy)

技術行為                 | 技術根因 (Why)                     | 物理後果 / 修正建議
---------------------------|-----------------------------------------|--------------------------------------------
UTF-8-SIG (BOM)  | 帶有 0xEF 0xBB 0xBF 之萬國碼簽章。 | [修正] 這是 Win32 護盾。能強制 PowerShell/CMD 正確識別中文,防止誤判為 CP950。


UTF-8 No-BOM       | 缺乏顯式編碼標籤。                 | [風險] 在 Win32 CLI 下極易產生物理亂碼 (憿?),導致 RAG 索引失效。


PS 5.1 導向禁忌    | 使用 >> 會強制附加 CP950 編碼。    | 破壞 Python 線性讀取,導致 UnicodeDecodeError。因此所有日誌追加必須透過Python 原生open(..., 'a',encoding='utf-8-sig')執行。」物理切斷CP950 追加污染。。


Python open() 缺省 | Win32 預設為 CP950。               | 導致環境行為不對稱。必須顯式聲明 encoding='utf-8-sig'。


BOM 物理定錨       | 作為資產誠信的「合法指紋」。       | [修正] 系統啟動時必須驗證 BOM。無 BOM 資產將被判定為「誠信斷裂」。


忽略 chcp 65001    | 活動字碼頁(ACP)對管道具有強制約束力。   | Subprocess 輸出被強制轉換為 CP950,引發解析亂碼,因此
Subprocess調用前,必須確保活動字碼頁 (ACP)已鎖定為65001。且Subprocess調用必須指定decode(errors='ignore')。。


物理字元降級 (0x3f)| 在 CP950 環境下對 UTF-8 執行 Replace | [致命] 中文被物理替換為 "?",導致語義不可逆損毀。
「凡涉及繁體中文寫入,必須於操作後執行語義關鍵字匹配(Read-BackValidation)。」

 

### 2.1 UTF-8-SIG 實務應用與橋接邏輯 在 Win32 複雜環境中,編碼處理遵循**架構規範**中的橋接邏輯:

* 實務場景 (Win32 PowerShell):
- 當產出數據供 Excel、Notepad、PowerShell 直接開啟時,UTF-8-SIG 是必要的物理門禁。
- 具備 BOM 後,PowerShell 5.1 會自動以 UTF-8 解析內容,不再需要複雜的 chcp 切換。

* 橋接邏輯 (The Bridge Logic):
- 輸入誠信 (Read):系統必須使用 encoding='utf-8-sig' 讀取,以自動剥離0xEF 0xBB 0xBF BOM 並確保字串純淨。
- 輸出硬化 (Write):核心資產 (MD, PY, JSONL) 必須強制使用 encoding='utf-8-sig' 寫入。
- 規範定義:「讀寫均用 SIG,物理鎖定 BOM」。

 ## 3.治理參考 (Governance Framework),處理符合以下防禦性要求:

* 強制編碼聲明:凡涉及檔案 I/O,必須顯式定義 encoding='utf-8-sig',嚴禁依賴 locale 缺省值。
* 物理硬化機制:系統偵測到遺失 BOM (0xEF 0xBB 0xBF) 時,應立即啟動「自動轉碼」程序,標準化為 UTF-8-SIG。
* 管道免疫規範:執行跨進程調用 (Subprocess) 前,確保活動字碼頁已鎖定為 65001。

## 4. Win32 環境標準應對 Check-list

[V] I/O 審查:確認 open() 均包含 encoding='utf-8-sig'。讀取時利用 SIG 自動處理 BOM 剝離。
[V] PowerShell 版本過濾:針對 PowerShell 5.1,確保 Out-File 產出的內容需再經過 額外檢核PYTHON程式進行處理。
[V] Excel 兼容性:所有 CSV 與報告輸出預設採用 UTF-8-SIG。
[V] Shell 替代方案:嚴禁使用 >>。
[V] 流解析校驗:讀取數據流前,確認字節偏移 0 處具備 BOM 特徵碼。
[V] 環境鎖定:啟動腳本首行強制執行 chcp 65001。——

 

文字化け(Mojibake)其它資訊:

encode文字編碼查詢

編碼 解說影音資訊

 

 

2026年1月16日 星期五

善用提示詞prompt,請AI大神教導 Notepad++巨集程式,去除惱人的自動行號問題

PROMPT提示詞,如下(藍色部分)
有辦法寫成一個NOTEPAD++ 巨集程式,可以將程式開頭 1~n的數字,自動去除,並且全數靠左縮排嗎?

GEMINI回應結果,如下:
這是一個非常實用的需求。在處理從 PDF 或教學文件中複製出來的程式碼時,行號往往會導致語法錯誤。

Notepad++ 中,最快且最精準的方法是使用 「正規表示式 (Regular Expression)」 進行取代,這比錄製動作巨集更具彈性且穩定。
做法:使用正規表示式取代

💜   在 Notepad++ 中按下 Ctrl + H 打開「取代」視窗。

💜在 「尋找目標」 輸入:^\s*\d+\s?

        ^:代表每一行的開頭。

        \s*:匹配開頭可能存在的空格。

        \d+:匹配一個或多個數字(即行號)。

        \s?:匹配數字後方的一個空格。

   💜「取代為」 欄位(位於視窗上方處)請保持 空白。

    在下方的「搜尋模式」勾選 「規則運算式(E)」 一併勾選核取方塊 「.」包含換行字元。

    💜點擊靠右側 「全部取代(A)」 圖鈕。



按照上面操作步驟,並參照下面作法,將它變成巨集程式,下次處理多餘開頭行號時,直接點選 自行錄製的巨集程式,即可快速去除惱人的自動行號😃 

💢如何將此動作自動化 (儲存為巨集)

如果你經常需要執行這個動作,可以將上述過程錄製下來:

  💜 點擊選單 「巨集」 > 「開始錄製」。

  💜 重複上述的 Ctrl + H 取代步驟(確保點擊了「全部取代」)。

  💜關閉取代視窗。

  💜 點擊選單 「巨集」 > 「停止錄製」。

  💜點擊 「儲存目前的錄製巨集」,設定名稱為「去除程式行號(REMOVE_LINE_NUMBER)」,並可自定義快捷鍵(例如 Ctrl + Shift + R)。

相關參考資訊:

NotePad++

2024年8月21日 星期三

一鍵完成PROMPT提示詞整合處理,免除打字處理(PYTHON程式)

情境:常使用的日文查詢PROMPT,只要使用Ctrl+C預先拷貝好後,再點選此編譯好的程式後(預先指定好(右鍵|內容|快速鍵(K))執行之快捷鍵,如:自訂Ctrl+Alt+J,將此程式叫出來),即可將剛才能載入記憶體的複製字串,直接寫入提示詞內


💜程式片段說明一:

以下為  testjlptRel01 , (即 input_file1 = r'd:\testjlptRel01.txt') ,請預先用Notepad記事本,將下面藍色部分提示詞貼上,檔名儲存至 d:\testjlptRel01.txt

あなたは日本語のプロで、勉強法の達人です。
{{関連表現}}の語源は教えて、漢字ははっきりとはしないが、省略しても構いません。
{{関連表現}}の文法解説・例文と類義語を簡潔な概要でまとめてください。
もし、その表現はニュアンス、意志、自発、あるいは自分、他の人、その他の表現などに関連があれば、使い方を教えて
暗記しやすいように、その他の類義表現文型と違いところを表形式に挙げてください。
それぞれの表現に焦点を当てたYOUTUBE動画を挙げてください

"""
関連表現:


    
💜程式片段說明二:
# input_file2內容為     """  

 
# 為何要另外加入input_file2.txt , 再補上 """ (三重引用符號),讓AI能夠將它視為整段完整之PROMPT提問文  (亦即,前段日文詢問之PROMPT + OCR辨識後之TXT +最後再補上  三重引用符號)


💜程式片段說明三:
# output_file內容為  d:\testjlpt.txt   ,最後在d槽 ,testjlpt.txt 可查看到完整提示詞資訊,再將此內容貼至 AI神器去詢問


💜程式片段說明四:  (程式功能處理流程)
☺💜從剪貼簿獲取文字。  (即  pyperclip.paste() 獲取剪貼簿中的文字。 將您將想查詢的特定日文字詞,用COPY+C 快速鍵,複製後,對電腦而言已暫存至記憶體起來 ,而透過PYTHON之pyperclip模組,來 獲取剪貼簿中的文字(等同您 手動按 Win+ V ,而此程式自動化幫您處理)。

☺💜將剪貼簿中的文字與指定兩個檔案的內容,按照特定順序合併。  

運行順序1 載入 日文關連式提示詞 ;

運行順序2 載入 想查日文字詞  之已內存記憶體剪貼簿內容 ;

運行順序3 再補上 """ (三重引用符號) ;


運行順序4 將合併後的內容寫入一個新的檔案中。    (即   output_file = r'd:\testjlpt.txt'  )
 

💜將PYTHON程式轉成EXE執行檔(最後一個處理程式步驟)

auto-py-to-exe 轉換PY程式成為EXE

 

💜相關應用參考資訊:
活用 Win視窗鍵+V ,選擇性貼上之功能視窗(記憶體內存剪貼簿)

一鍵完成圖檔OCR辦識,免除打字處理

     
💜完整PYTHON程式如下    

import pyperclip
import subprocess
import os
def append_file_content_in_order(input_file1, input_file2, content_to_append, output_file):
    """將指定內容和兩個檔案的內容按照指定順序追加到檔案末尾。"""
    try:
        with open(output_file, 'w', encoding='utf-8') as f_out, \
                 open(input_file1, 'r', encoding='utf-8') as f_in1, \
                 open(input_file2, 'r', encoding='utf-8') as f_in2:
            f_out.write(f_in1.read())  # 先寫入 input_file1
            f_out.write("\n\n" + content_to_append)  # 再寫入剪貼簿內容
            f_out.write("\n\n" + f_in2.read())  # 最後寫入 input_file2 内容 (即補上  """  三重引用符號 ,做為結尾)
        print(f"已成功將結果寫入 {output_file}")
    except FileNotFoundError as e:
        print(f"Error: 檔案不存在 - {e.filename}")
    except Exception as e:
        print(f"Error: 發生錯誤 - {e}")
if __name__ == "__main__":
    input_file1 = r'd:\testjlptRel01.txt'
    input_file2 = r'd:\testjlptRel02.txt'
    output_file = r'd:\testjlpt.txt'
    clipboard_text = pyperclip.paste()
    append_file_content_in_order(input_file1, input_file2, clipboard_text, output_file)
    subprocess.Popen(['explorer', output_file])         # 將產出最新檔案,直接開啟,方便後續貼至AI神器查詢

 

2024年7月5日 星期五

活用 Win視窗鍵+V ,選擇性貼上之功能視窗(記憶體內存剪貼簿)


情境:
因為不定時處理常態性之編輯事務時,每次都要鍵入 關鍵字1 的字詞,
處理過程中,常會需要鍵入  關鍵字2 ,
處理完成後,又需另外鍵入  關鍵字3

為了解決此種⌈複製/貼上⌋瑣碎編輯問題 ,可先將下面PYTHON程式,預先編譯成EXE執行檔,並寫成BAT批次檔,每當執行特定工作任務前,就執行BAT檔或執行檔,預先將 關鍵字1 關鍵字2 關鍵字3 全部1次性,分批載入記憶體內,
需要使用時 只需要使用⌈ Win視窗鍵+V⌋ ,即可叫出 選擇性貼上之功能視窗(記憶體內存剪貼簿) ,點選所欲使用的那3個關鍵字詞,可以節省每次都要打字之時間 或複製/貼上處理時間😀。

相關好用快速鍵:

Win視窗鍵 + .  (叫出 符號表 / Emoji表情小貼圖😊)


import pyperclip
import time

keywords = [
"關鍵字1", "關鍵字2", "關鍵字3"]

for keyword in keywords:
    pyperclip.copy(keyword)
    print(f"已將 '{keyword}' 複製到剪貼簿,您可用Win+V 叫出後,選擇性貼上")
    time.sleep(0.5)  # 停留 0.5 秒 (500 毫秒)

 

2024年6月30日 星期日

一鍵完成圖檔OCR辦識,免除打字處理

情境:YOUTUBE上有許多優秀的日文老師的提供考題解析或文法解析,不過有時仍想再藉助AI神器分析解題或文法,只是部分YT,並未提供SRT字幕SubRip subtitle file,可以免去打字處理,此時就需透過手動截圖方式(PNG、JPEG),貼到小畫家後,另存成圖檔,再轉交由OCR辨識軟體將日文辨識出來,進行解題,過程有些繁瑣。

解決辦法:
透過PYTHON程式,將下面程式另存成png2txt.jp編譯成png2txt.EXE執行檔後,直接於截圖後,使用下面之步驟二方式,一鍵完成日文OCR辨識處理。
由系統快取資訊,取得剛才截圖資訊,直接提供給OCR辨識軟體(Tesseract )轉換成純文字,最後將它交給AI神器進行解題即可 (無需另外開啟小畫家,存檔覆寫等處理)


💜操作步驟一(截圖處理): Shift + Win + S 快速鍵,區塊截取圖片轉換為日文TXT純文字,ScreenShot圖檔即可用PYTHON程式直接取用 CACHE記憶體內之截圖資訊
💜步驟二:點選執行,預先編譯好之png2txt.EXE執行檔,即可一鍵完成日文OCR辦識處理。
💜步驟三:複製剛辨識完成之TXT檔,貼至AI神器💯上去詢問日文考題解析或文法解析。


相關資源:
YOUTUBE字幕下載
OCR辨識軟體🔣(圖檔轉文字jpg2txt)Tesseract
🏯AI神器解析日文考題或句子結構

Mac 上的 Shift + Command + 4 組合鍵,類似 Windows 上的 Win + Shift + S,可方便地選擇性截取螢幕的一部分。


# -*- coding: utf-8 -*-
'''
python取圖檔,辨識日文考題
'''
import os
import subprocess
import sys
from PIL import Image, ImageGrab
import pytesseract

def save_clipboard_image(filename='screenshot.png'):
    try:
        # 獲取剪貼簿中的圖像
        image = ImageGrab.grabclipboard()

        if image is None:
            print("剪貼簿中沒有圖像資料")
            return

        # 保存圖像為PNG格式,覆蓋同名文件
        image.save(filename, 'PNG')
        print(f"圖像已保存為 {filename}")

    except Exception as e:
        print(f"無法保存圖像: {e}", file=sys.stderr)

def ocr_image_to_text(image_path):
    # 檢查檔案是否存在
    if not os.path.exists(image_path):
        print(f"Error: File not found - {image_path}")
        return

    # 修改為您的 Tesseract 安裝路徑
    pytesseract.pytesseract.tesseract_cmd = 'd:/Program Files/Tesseract-OCR/tesseract.exe'

    img = Image.open(image_path)
    text = pytesseract.image_to_string(img, lang='jpn')  # 辨識日文考題

    # 輸出檔案名稱根據輸入檔案修改
    output_file = os.path.splitext(image_path)[0] + '.txt'
    with open(output_file, mode='w', encoding='UTF-8') as f:
        f.write(text)

    print(f"OCR結果已保存為 {output_file}")
    subprocess.Popen(['explorer', output_file])  # 使用 list 形式傳遞參數

if __name__ == "__main__":
    image_filename = 'D:\Program Files\Tesseract-OCR\screenshot.png'
   
save_clipboard_image(image_filename)
    ocr_image_to_text(image_filename)

 

 ###################################################

#以下為進階python版本之 一鍵完成圖檔OCR辨識: (直接將prompt日文提示詞,併入掃描ocr辨識結果,結合起來後,直接自動化用檔案總管開啟 d:\testjlpt.txt')

# input_file1內容,如下:

あなたは日本語のプロで、国語の問題を解きの達人です。

{{問題文}}は1~4の中から最も適切なものを一つ選んでください。

(中略)

"""
問題文:

 

# input_file2內容為     """  
#為何要另外加入
input_file2.txt ,是為了將 4選1選項問答PROMPT提問文:  +OCR辨識之TXT結果後,再補上 """ (三重引用符號),讓AI能夠將它視為整段完整之PROMPT提問文  (亦即,前段日文詢問之PROMPT + OCR辨識後之TXT +最後再補上  三重引用符號)

# output_file內容為  d:\testjlpt.txt'   

 

import os
import subprocess
from PIL import Image, ImageGrab
import pytesseract

def save_clipboard_image(filename='screenshot.png'):
    """保存剪貼簿中的圖像。"""
    image = ImageGrab.grabclipboard()
    if image:
        image.save(filename, 'PNG')
        print(f"圖像已保存為 {filename}")
        return filename
    else:
        print("剪貼簿中沒有圖像資料")
        return None


def ocr_image_to_text(image_path, lang='jpn'):
    """使用 Tesseract OCR 對圖像進行文字辨識。"""
    if not os.path.exists(image_path):
        print(f"Error: File not found - {image_path}")
        return None

    pytesseract.pytesseract.tesseract_cmd = r'D:/Program Files/Tesseract-OCR/tesseract.exe'
    return pytesseract.image_to_string(Image.open(image_path), lang=lang)


def append_file_content_in_order(input_file1, input_file2, content_to_append, output_file):
    """將指定內容和兩個檔案的內容按照指定順序追加到檔案末尾。"""
    try:
        with open(output_file, 'w', encoding='utf-8') as f_out, \
                open(input_file1, 'r', encoding='utf-8') as f_in1, \
                open(input_file2, 'r', encoding='utf-8') as f_in2:

            f_out.write(f_in1.read())  # 先
入 input_file1 内容 (00)
            f_out.write("\n\n" + content_to_append)  # 再
入 OCR 
            f_out.write("\n\n" + f_in2.read())  # 最后
入 input_file2 内容 (01)

        print(f"已成功將結果寫入 {output_file}")

    except FileNotFoundError as e:
        print(f"Error: 檔案不存在 - {e.filename}")
    except Exception as e:
        print(f"Error: 發生錯誤 - {e}")


if __name__ == "__main__":
    image_filename = r'D:\Program Files\Tesseract-OCR\screenshot.png'
    input_file1 = r'd:\testjlpt00.txt'
    input_file2 = r'd:\testjlpt01.txt'
    output_file = r'd:\testjlpt.txt'

    saved_image_path = save_clipboard_image(image_filename)
    if saved_image_path:
        ocr_text = ocr_image_to_text(saved_image_path)

        if ocr_text:
            append_file_content_in_order(input_file1, input_file2, ocr_text, output_file)

            print(f"OCR結果已保存為 {output_file}")
            subprocess.Popen(['explorer', output_file])
 

2024年6月27日 星期四

藉由AI神器,協助將WORD排版好轉出HTML格式,簡潔化處理 Docx_2_HTML

情境:工作需要為維持靜態網頁程式版面,預先以WORD編輯好版面,但另存成HMTL檔案,再貼到網站原始碼處。
但微軟WORD檔,另存成HTML時,常會殘留非必要之多餘資訊(如:CLASS、Meta),可經由PYTHON程式,將它部分簡潔化處理。

💙使用步驟一:將WORD文件,預先簡單排版,並另存新檔,下拉存檔類型(T):  已篩選的網頁(*.htm;*.html)
💙步驟二:將下面PYTHON程式,另存成Doc_2_HTML.py (前提:已預先安裝好PYTHON執行環境)
💙步驟三:將步驟一之HTML檔案,Drag-and-drop拖曳至Doc_2_HTML.py ,即可完成轉換產出處理。


PROMPT提示詞,產製PYTHON操作,如下:

你現在是資深網頁排版人員及PYTHON資深工程師,目前有一個微軟DOC檔,另存成HTML格式,
因為網頁程式無需WORD提供多餘內容(如:註解、Class屬性、span標籤等),請協助予以簡潔化處理後,產製PYTHON程式,
來源讀取以ARGC、ARGV方式進行,輸出檔名以輸入來源加入_OUT,如遇重覆再加入流水號。


💜可將此PYTHON程式,上傳給AI神器,並告訴AI程式您的新需求 (如:可將 font-family:標楷體  透過DIV之標籤,置於上方外框架處,並請重新產製完整PYTHON程式,將版面更精簡,如:wrap_with_div(soup)程式區塊),請它再重新產製完整PYTHON程式即可

💜PROMPT提示詞追補(請AI神器將本PYTHON程式,以Class類別方式改寫,並提供完整PYTHON程式及類別之方法詳細解說)。

import re
import os
import sys
import time
import chardet
from bs4 import BeautifulSoup, Comment ,Tag
import logging
import argparse

def detect_encoding(file_path):
    """
    使用 chardet 庫檢測文件編碼
    """
    with open(file_path, 'rb') as f:
        raw_data = f.read()
        result = chardet.detect(raw_data)
        return result['encoding']

def remove_comments(soup):
    """
    移除所有註解
    """
    for comment in soup.find_all(string=lambda text: isinstance(text, Comment)):
        comment.extract()

def remove_classes(soup):

    """
    移除所有 class 屬性
    """

    for tag in soup.find_all(class_=True):
        del tag['class']

def remove_word_meta_tags(soup):

    """
    移除 meta 標籤中生成器訊息
 
   """

    for meta_tag in soup.find_all('meta', {'name': 'Generator', 'content': re.compile(r'Microsoft Word')}):
        meta_tag.extract()

def remove_spans(soup):

    """
    移除所有 span 標籤
    """

    for span_tag in soup.find_all('span'):
        span_tag.unwrap()

def unwrap_anchor_tags(soup):

    """
    移除所有非 href 錨點標籤,但保留其中的内容
    """

    for a_tag in soup.find_all('a', href=False):
        a_tag.unwrap()

def remove_styles(soup):

    """
    移除所有 style 屬性
    """

    for tag in soup.find_all(style=True):
        del tag['style']

def clean_style_tags(soup):

    """
    移除所有含有 @font-face 和 @page 的註解,以及 Word 残留样式定义
    """

    for style_tag in soup.find_all('style'):
        if style_tag.string:
            style_content = style_tag.string
            style_content = re.sub(r'@font-face\s*\{[^}]*\}', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'@page\s*[^}]*\}', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'\/\*[^*]*\*+([^/*][^*]*\*+)*\/', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'<!--[^>]*-->', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'\s*\{[^}]*\}', '', style_content, flags=re.DOTALL) # Remove all remaining style definitions
            if not style_content.strip():
                style_tag.extract()
            else:
                style_tag.string.replace_with(style_content)

def remove_empty_paragraphs(soup):

    """
    移除所有空的 p 標籤,只有內容为空或只包含空格的情况才移除
    """

    for p_tag in soup.find_all('p'):
        if not p_tag.text.strip():
            p_tag.extract()


def process_tables(soup):

    """
    處理表格,生成 summary 屬性並設置 scope 屬性
    """

    for table in soup.find_all('table'):
        # 檢查表格是否有標題列 (<th>)
        has_header_row = any(tr.find('th') for tr in table.find_all('tr'))

        if has_header_row:
            # 如果有標題列,則使用標題列內容作為列名
            headers = table.find_all('th')
            column_names = [header.get_text(strip=True) for header in headers]
        else:
            # 如果沒有標題列,則使用第一列數據作為列名
            first_row = table.find('tr')
            if first_row:
                column_names = [cell.get_text(strip=True) for cell in first_row.find_all(['th', 'td'])]
            else:
                # 如果表格為空,則設置列名為空列表
                column_names = []

        # 嘗試從前面的段落中獲取表格用途,並檢查其中是否包含 <b> 標籤
        previous_element = table.find_previous('p')
        if previous_element and previous_element.find('b'):
            table_purpose = previous_element.b.get_text(strip=True)  # 直接從 <b> 中提取文字
        else:
            # 如果沒有找到前面的段落或標題,使用表格的所有列名作為 table_purpose
            table_purpose = "、".join(column_names) if column_names else "未知表格用途"

        # 確保 column_names 包含有效的名稱,否則設置為 "未知"
        column_names = [name if name else "未知" for name in column_names]

        # 生成 summary 屬性文字,確保列數訊息正確
        num_columns = len(column_names)
        column_info = "、".join([f"第{i+1}直欄為{column_names[i]}" for i in range(num_columns)]) if num_columns > 0 else "無直欄位"
        summary_text = f"{table_purpose},{column_info}。"

        # 更新表格的 summary 屬性
        table['summary'] = summary_text

        # 設置 th 和 td 的 scope 屬性 (僅在有標題列時)
        if has_header_row:
            for th in headers:
                th['scope'] = 'col'

            for tr in table.find_all('tr'):
                if tr.find('th'):
                    continue  # 跳過表格標題行
                for td in tr.find_all('td'):
                    td['scope'] = 'row'

        # Debugging output to check the generated summary text
        print("Generated summary text:", summary_text)
        



def wrap_with_div(soup):

    """用 <div> 標籤包裹整個文檔内容,並設置標楷體字體樣式"""
    # 如果没有 html 標籤,則創建
    if not soup.html:
        new_html = soup.new_tag('html')
        soup.append(new_html)

    # 如果没有 body 標籤,則創建
    if not soup.body:
        soup.html.append(soup.new_tag('body'))

    # 創建外部 div
    outer_div = soup.new_tag("div", style="font-size:100%;font-family:'標楷體';")

    # 將body 中的所有内容移動到外部 div
    for child in soup.body.contents:
        if isinstance(child, Tag):
            outer_div.append(child.extract())

    # 創建内部 div
    inner_div = soup.new_tag("div")
    inner_div.append(outer_div)

    # 將内部 div 添加到 body
    soup.body.append(inner_div)



def optimize_html_content(html_content, input_file):

    """
    最佳化 HTML 內容,移除多餘資訊,並以輸入檔名加上 "_out" 命名輸出。
    """

    try:
        soup = BeautifulSoup(html_content, 'html.parser')

        remove_comments(soup)
        remove_classes(soup)
        remove_word_meta_tags(soup)
        remove_spans(soup)
        unwrap_anchor_tags(soup)
        remove_styles(soup)
        clean_style_tags(soup)
        remove_empty_paragraphs(soup)
        process_tables(soup)
        wrap_with_div(soup)


        # 以輸入檔名加上 "_out" 命名輸出檔案,處理重複情況(加入流水號)
        base_filename, ext = os.path.splitext(input_file)
        filename = f"{base_filename}_out{ext}"
        counter = 1

        while os.path.exists(filename):
            filename = f"{base_filename}_out_{counter}{ext}"
            counter += 1


        # 寫入修改後的 HTML 內容,使用 'utf-8' 編碼
        with open(filename, 'w', encoding='utf-8') as file:
            file.write(str(soup))

        # 列印儲存的檔案名稱
        print(f"已儲存最佳化後的 HTML 檔案:{filename}")

    except Exception as e:
        # 列印錯誤訊息
        logging.error(f"發生錯誤:{e}", exc_info=True)
        # 等待5秒鐘以便使用者查看錯誤訊息
        time.sleep(5)


def main():
    parser = argparse.ArgumentParser(description='優化HTML文件内容')
    parser.add_argument('filename', help='輸入的HTML文件名')
    args = parser.parse_args()

    input_file = args.filename
    try:
        # 使用 chardet 庫檢測文件編碼
        detected_encoding = detect_encoding(input_file)

        # 使用正確的編碼讀取文件
        with open(input_file, 'r', encoding=detected_encoding) as file:
            html_content = file.read()

        optimize_html_content(html_content, input_file)

    except FileNotFoundError:
        logging.error(f"找不到檔案: {input_file}")
        time.sleep(5)
    except Exception as e:
        logging.error(f"發生錯誤:{e}", exc_info=True)
        time.sleep(5)

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    main()

 


相關查詢:

Removes unnecessary HTML tags from Word documents and outputs clean HTML.
Word文書から生成されるHTMLの不要な情報を取り除いて、きれいなHTMLを出力します。

藉由AI神器,生成Offline image downsizing utilities

情境:因同事經常上傳大圖檔,易造成網路壅塞瓶頸,因此請AI神器,生成離線圖檔縮小工具程式

💜處理及使用
可透過auto-py-to-exe 轉換PY程式(將下面紫色部分,用記事本複製貼上,另存成*.py檔),編譯成 EXE執行檔,

💜同仁將超大圖檔Drag-and-drop拖曳(自動讀取檔案來源將路徑傳入Argc 、Argv參數,)至 轉換好之EXE檔上面 ,即可進行圖檔縮小轉換處理。

相關程式: Image-upscaling影像圖檔模糊怎麼辦?


PROMPT提示詞下法,如下:

請寫一個PYTHON程式,
來源檔為jpg,png圖檔,影像予以縮小? max_size=(1920, 1080) ,
如來源影像大小,低於500k以下者,就不做處理,
輸入方式以argc argv方式讀取檔案
輸出檔名,與輸入檔名相同,另再加入_C



import os
import argparse
from PIL import Image

def resize_image(file_path, output_path, max_size=(1920, 1080)):
    with Image.open(file_path) as img:
        img.thumbnail(max_size, Image.Resampling.LANCZOS)
        img.save(output_path)

def main():
    parser = argparse.ArgumentParser(description='Resize images if they exceed 1MB.')
    parser.add_argument('images', metavar='N', type=str, nargs='+', help='List of image files to be processed')
    args = parser.parse_args()
    
    for img_file in args.images:
        if os.path.getsize(img_file) > 500  * 1024:  # Check if file size is greater than 500k
            file_root, file_ext = os.path.splitext(img_file)
            output_file = f"{file_root}_C{file_ext}"
            resize_image(img_file, output_file)
            print(f"Resized image saved as {output_file}")
        else:
            print(f"Image {img_file} does not exceed 500k, no resizing needed.")

if __name__ == '__main__':
    main()

2024年4月26日 星期五

經由Groq API功能,使用Meta開放源碼Llama3-70b-8192模型,進行 日文PROMPT提示詞 查詢

藉由免費Groq API服務,橋接使用臉書Meta開放源碼LLM大語言模型,進行 日文相關查詢運用

💜步驟一:

☺💟https://console.groq.com/keys  取得API KEY

☺💟在自己的電腦環境變數,加入GROQ_API_KEY變數,指定您所取得API KEY值

💜步驟二: 備妥PYTHON執行環境

 pip install groq

💜步驟三:將下面藍色部分,另存成 PYTHON程式碼(如:testgroq.py ),並且執行它即可

import os

from groq import Groq

client = Groq(
    api_key=os.environ.get("
GROQ_API_KEY"),
)

chat_completion = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content":
"あなたは日本語のプロで、勉強法の達人です。 {{関連表現}}の語源は教えて、漢字ははっきりとはしないが、省略しても構いません。 {{関連表現}}の文法解説・例文と類義語を簡潔な概要でまとめてください。もし、その表現はニュアンス、意志、自発、あるいは自分、他の人、その他の表現などに関連があれば、使い方を教えて暗記しやすいように、その他の類義表現文型と違いところを表形式に挙げてください。それぞれの表現に焦点を当てたYOUTUBE動画を挙げてください 関連表現: かたがた、を兼ねて、ついで、がてら、かたわら ",
        }
    ],
    model="Llama3-70b-8192",
)

print(chat_completion.choices[0].message.content) 

 

相關資訊:

Japanese relationship learning日文相關連關鍵資訊查詢,增進廣度面向之學習。

💛後記:測試結果,取得YOUTUBE連結不能使用,可能持續MachineLearning學習中?

             此種查詢傳遞方式,仍需留意資料是否含機敏資訊?

💛Temperature Control: (可於程式碼中 ,在model="Llama3-70b-8192"上方,加入 temperature  = 0.1 ,不加溫度參數效果較好)A lower temperature results in more deterministic and focused responses, while a higher temperature increases diversity and explores more unconventional possibilities

💛檔名請勿以 groq.py 命名,否則會出現下面錯誤訊息 👀
ImportError: cannot import name 'Groq' from partially initialized module 'groq' (most likely due to a circular import)

💙回傳結果如下:

**1. かたがた (katagata)**
Meaning: and so on, and other things like that
 (略)
Example sentence: 私のかたがた、運動ですか? (Watashi no katagata, undō desu ka? - Are you doing exercise and other things like that?)

**2. を兼ねて (o kane te)**
Meaning: while doing, simultaneously
(略)
Example sentence: 私は仕事を兼ねて、ユーチューブを見ています (Watashi wa shigoto o kane te, Yūchūbu o mite imasu - I'm watching YouTube while working)

**3. ついで (tsuide)**
Meaning: by the way, while I'm at it
(略)
Example sentence: 私は店についで、雑貨を買います (Watashi wa mise ni tsuide, zakka o kaimasu - I'll buy some miscellaneous goods while I'm at the store)

**4. がてら (gatera)**
Meaning: and other things, et cetera
(略)
Example sentence: 私は料理がてら、健康について学びます (Watashi wa ryōri gatera, kenkō ni tsuite gakushū shimasu - I'll learn about cooking and other things, like health)

**5. かたわら (katawara)**

- This word means "on the side" or "in addition to."
        * Example: 「私は本業のかたわら、フリーランスの仕事もしています」(In addition to my main job, I also do freelance work on the side.)

(略)

參考資訊:

https://console.groq.com/docs/quickstart

 

'##################################################################### 

💛動態傳遞參數範例1: 使用方式  python testgroq.py 您提問的問題

#placeholder text from the dynamic value (sys.argv[1])  

import os
import sys
from groq import Groq

client = Groq(
    api_key=os.environ.get("GROQ_API_KEY"),
)

# Get the dynamic expression from sys.argv[1]
dynamic_expression = sys.argv[1]

# Replace the placeholder text with the dynamic expression
chat_completion = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": f"{dynamic_expression}",
        }
    ],
    model="Llama3-70b-8192",
)
# Print the generated response
print(chat_completion.choices[0].message.content)


'##################################################################### 

💛動態傳遞參數範例2:  將常用的詢問(日文文法查詢)預先作好Prompt樣版,只要將您詢問參數代入,即可查詢

python testgroq.py  如し、如く、如き

 #placeholder text from the dynamic value (sys.argv[1])  

import os
import sys
from groq import Groq

client = Groq(api_key=os.environ.get("GROQ_API_KEY"))

# Get the dynamic expression from sys.argv[1]
dynamic_expression = sys.argv[1]

# Construct the message content with the dynamic expression
user_message = {
    "role": "user",
    "content": f"あなたは日本語のプロで、勉強法の達人です。日本語の文法を徹底解説してください。例えば:文型、ニュアンス、図表、例文(専門家向け)下記の問題を徹底ステップバイステップ解説してください: {dynamic_expression}",
}

# Generate completion using Groq API
chat_completion = client.chat.completions.create(
    messages=[user_message],
    model="Llama3-70b-8192",
)

# Extract and print the generated response
generated_response = chat_completion.choices[0].message.content
print(generated_response)

 

💙回傳結果如下:

 What an honor to delve into the intricacies of Japanese grammar!

**如し (nashi)**   (小BUG錯誤🚨 ,正確應該 gotosi)

* Usage: Used to describe a comparison or analogy, often with a sense of similarity or resemblance.
* Example sentences:
       (略)
        + 彼の顔は
如し私の叔父のように見える (Kare no kao wa nashi watashi no oji no you ni mieru) - His face looks like my uncle's.    小BUG錯誤🚨終止形,詞性屬⌈文言比況助動詞⌋,通常放句尾,相當於ようだ

**如き (ki)** 

* Usage: Used to describe a hypothetical or imaginary situation, often with a sense of uncertainty or tentativeness.
* Example sentences:
        + 私は
如き億万長者のように生活している (Watashi wa ki no okuman chōja no you ni seikatsu shite iru) - I'm living as if I were a billionaire. 🚨連体形,相當於ような
  (略)

**如く (ku)**
* Usage: Used to describe a manner or method of doing something, often with a sense of following a model or example.
* Example sentences:
(略)
        + 彼は如く名選手のように球をプレイする (Kare wa ku mei senshu no you ni yakyū o purei suru) - He plays baseball like a famous player.  🚨連用形,相當於ように

(略)

2024年4月22日 星期一

PivotTable樞鈕分析表,搭配Formula公式運用,詳列出⌈廠牌型號⌋,在各個" 部門別"之擁有 台數 報表產製

EXCEL資料表,分別有 財產設備大分類、廠牌型號、部門別、數量 等4欄位,
        A                                  B                       C                 D
1    財產設備大分類        廠牌型號              部門別           數量
2    個人電腦           HP Pro SFF 400 G9    人事               2
3    個人電腦           HP Pro SFF 400 G9     財務              2
4    個人電腦           HP Pro SFF 400 G9    行政               2
5    個人電腦           HP Pro SFF 400 G9     銷售              2
6    個人電腦           ASUS S500TE             研發               1
7    個人電腦           HP Pro SFF 400 G9     研發               1
8    個人電腦           HP Pro SFF 400 G9     資訊               2


公司部門,有人事、財務、行政、銷售、研發、資訊等6部門別

有1份報表,需臚列出  財產設備大分類,其各⌈廠牌型號⌋,分配到公司,各個部門之台數(如下方產出的結果)

,####################################################################################
以下是個人作法,先用「樞紐分析表」,將EXCEL資料 預做梳理,
 

在以下區域之間拖曳欄位:

💛篩選  拖曳  財產設備大分類、    (因為有數個「財產設備大分類」項目,如:個人電腦、筆電)
💜欄    拖曳  部門別、                    (方便掌握 各部門別,可逐欄一一列出)
💜列    拖曳   廠牌型號、              (各廠牌型號,以此例「個人電腦」大分類,呈現會有2列,

                                                   分別  為HP Pro SFF 400 G9 及 ASUS S500TE    等2類桌機
💜值    拖曳    數量                        (可幫忙預先加總,列出各部門別,各廠牌型號 電腦之台數)
'=====================================================================
💙'T1欄及O1欄,公式手動設定好
💛B1欄,為PivotTable樞鈕分析表之 大分類「財產設備大分類」,個人電腦、筆電等可供下拉(此欄位值,即為上面  篩選  拖曳,自動產生),只要下拉變動不同之大分類,樞鈕分析表之欄及列 資料,也會隨之變動。

💙T1欄(=COUNTA(4:4)),為PivotTable樞鈕分析表之總欄數   ,因為第4列為PivoteTable部門別,逐欄一一列出,此T1欄的值,為手動填入COUNTA公式
此公式之目的主要為讓後續VBA程式,清楚掌握「個人電腦」大分類中,共有多少 部門別?在PivotTable中,如該部門別沒有分配到大分類資源者,將不會列出部門別,故此欄會隨著大分類之不同,而做變動。


💙O1欄(=COUNTA(A:A)+1),為PivotTable樞鈕分析表之總列數  ,因為A欄為PivoteTable廠牌型號,逐列一一呈現,此O1欄的值,為手動填入COUNTA公式
此公式之目的主要為讓後續VBA程式,清楚掌握「個人電腦」大分類中,共有多少項?廠牌型號,此欄會隨著大分類之不同,而做變動(total_Rows)。

'####################################################################################

Sub ApplyFormula()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim total_Rows As Long
    Dim formulaRange As Range
    Dim i As Long
    
    '來源4個欄位,經過「樞紐分析表」,將資料預做梳理後,工作表名稱指定為Pivot_1
    Set ws = ThisWorkbook.Sheets("Pivot_1")
    
    '因「樞紐分析表」精靈產出後,上半段前3列已固定做標題列用途,故要扣除3後,每次下拉💛B1「財產設備大分類」後,才是實際⌈廠牌型號⌋之資料筆數。
    total_Rows = ws.Range("O1").Value - 3
    
    Sheets("Pivot_1").Select
    Columns("P:P").Select        '清空P欄,因為在下拉⌈財產設備大分類⌋,會貼不同的Formula
    Selection.ClearContents
     
    ' 預訂放置公式的起始處,預訂每次均由P5欄開始放置
    Set formulaRange = ws.Range("P5")
    
    
    ' 各列⌈廠牌型號⌋,詳列出 各個 "部門別"擁有之台數,逐一詳列出來
    For i = 1 To total_Rows    ' 第一列開始,直到最後一列
        '搭配Range & Formula ,方便每次於💛B1下拉「財產設備大分類,每列最後貼上公式
        formulaRange.Offset(i - 1, 0).Formula = "=IF($B" & i + 4 & ">0, $B$4&$B" & i + 4 & "&""台, "", """")" & _
                                                "&IF($C" & i + 4 & ">0, $C$4&$C" & i + 4 & "&""台, "", """")" & _
                                                "&IF($D" & i + 4 & ">0, $D$4&$D" & i + 4 & "&""台, "", """")" & _
                                                "&IF($E" & i + 4 & ">0, $E$4&$E" & i + 4 & "&""台, "", """")" & _
                                                "&IF($F" & i + 4 & ">0, $F$4&$F" & i + 4 & "&""台, "", """")" & _
                                                "&IF($G" & i + 4 & ">0, $G$4&$G" & i + 4 & "&""台, "", """")" & _
                                                "&IF($H" & i + 4 & ">0, $H$4&$H" & i + 4 & "&""台, "", """")"
                                '最後一列,為該大分類,各部門別彙整後之小計台數 (因為PivotTable樞鈕分析表已預先產製好)  ;最前方IF判斷式>0,即 台數>0,則顯示 部門別及台數。                                                                                                             
    Next i      
End Sub

 '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

產出的結果 ( 💛B1欄「財產設備大分類」,下拉選擇⌈個人電腦⌋)

列標籤                 人事    財務   行政   銷售   研發    資訊

HP Pro SFF 400 G9     2         2         2        2         1          2  ,人事2台,財務2台....研發1台....(略)

ASUS S500TE                                           1               ,研發1台

 總計                     2         2         2        2         2          2  ,人事2台....................研發2台,資訊2台


'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

PROMPT提示詞下法如下: (可將下面提示詞,貼至AI神器去詢問,取得VBA程式碼參考資訊)
處理前之樞鈕分析表,計有4欄位

篩選  拖曳  財產設備大分類、
欄    拖曳  部門別、
列    拖曳   廠牌型號、
值    拖曳    數量


經過「樞紐分析表」處理後,工作表名稱指定為Pivot_1
B1欄,為樞鈕分析表之篩選  財產設備大分類

excel表中,第4列為標題列,分別為 A4 廠牌型號、B4 人事、C4 財務、D4 行政、E4 銷售、F4 研發、G4 資訊H4 ,

T1欄,公式已設好  =COUNTA(4:4),為樞鈕分析表之總欄數
O1欄,公式已設好  =COUNTA(A:A)+1,為樞鈕分析表之總列數

下面公式為全數設備型號,我已將每列總數 放於 P5開始放置公式, 因為台數為0 ,就無需放入,請參考下面公式,寫VBA程式
    
    total_Rows = ws.Range("O1").Value - 3
    
    Sheets("Pivot_1").Select
    Columns("P:P").Select       
    Selection.ClearContents
     
    Set formulaRange = ws.Range("P5")
    
    For i = 1 To total_Rows    ' 第一列開始,直到最後一列
        '搭配Range & Formula ,方便每次於💛B1下拉「財產設備大分類,每列最後貼上公式
        formulaRange.Offset(i - 1, 0).Formula = "=IF($B" & i + 4 & ">0, $B$4&$B" & i + 4 & "&""台, "", """")" & _
                                                "&IF($C" & i + 4 & ">0, $C$4&$C" & i + 4 & "&""台, "", """")" & _
                                                "&IF($D" & i + 4 & ">0, $D$4&$D" & i + 4 & "&""台, "", """")" & _
                                                "&IF($E" & i + 4 & ">0, $E$4&$E" & i + 4 & "&""台, "", """")" & _
                                                "&IF($F" & i + 4 & ">0, $F$4&$F" & i + 4 & "&""台, "", """")" & _
                                                "&IF($G" & i + 4 & ">0, $G$4&$G" & i + 4 & "&""台, "", """")" & _
                                                "&IF($H" & i + 4 & ">0, $H$4&$H" & i + 4 & "&""台, "", """")"                                                                                                      
    Next i      



相關參考資訊:

EXCEL VBA 

樞鈕分析表查詢運用