XML Publisher 報表輸出 Excel 時:
1.23E+10)。00123 變 123)。客戶需保持原始字串格式,不可被 Excel 自動轉換。
在欄位對應的窗體域 (Form Field) 中註入:
<fo:bidi-override direction="ltr" unicode-bidi="bidi-override"><?AMOUNT?></fo:bidi-override>
原理:將數值視為雙向覆寫文字,Excel 視為字串不轉換。副作用:首尾各多一個空白字符,若需純淨值可搭配 TRIM。
單元格公式寫法:
=T("<?AMOUNT?>")
輸出為文字格式,Excel 不轉換。適用於固定版面報表。
SELECT '''' || '0000' FROM dual; -- 輸出 '0000
-- 或
SELECT '''' || TO_CHAR(amount_col, 'FM999,999.00') FROM ...
單引號前綴為 Excel 「儲存格格式為文字」標記,最通用、無模板依賴。
<style>
.context td {
mso-number-format: "\@"; /* 強制文字格式 */
white-space: nowrap;
}
</style>
<TD nowrap align="left" x:str>...</TD>
需將 <TD> 加上 x:str 屬性配合生效。
引導使用者開啟 Excel → 選欄位 → 資料 → 分欄 → 完成,或預設儲存格格式為文字。不適合自動化批量輸出場景。
| 方案 | 保真度 | Excel 可計算 | 備註 |
|---|---|---|---|
| fo:bidi-override | ✅ 高 | ❌ 視為文字 | 首尾有空白字符 |
| T() 函數 | ✅ 高 | ❌ 視為文字 | 模板耦合 |
| SQL 單引號前綴 | ✅ 高 | ❌ 視為文字 | 最通用、無模板依賴 |
| CSS mso-number-format | ✅ 高 | ❌ 視為文字 | 僅 HTML/Excel 輸出有效 |
| 原始數值輸出 | ❌ 會轉換 | ✅ 可計算 | 確定數值量級小可用 |
FUNCTION Get_Amount_Format(p_amount IN NUMBER) RETURN VARCHAR2 IS
l_amt VARCHAR2(9999);
BEGIN
IF p_amount <> 0 THEN
SELECT TRIM(TO_CHAR(p_amount, '999,999,999,999,999,999.99'))
INTO l_amt FROM dual;
RETURN l_amt;
ELSE
RETURN '0.00';
END IF;
EXCEPTION WHEN OTHERS THEN
Log_Msg('Format error: ' || p_amount || ' ' || SQLERRM);
RETURN NULL;
END;
輸出範例:1,034,332,32.00、230.00、1.00,千分位+固定兩位小數,適合直接在 SQL 或模板呼叫。
XML Publisher Excel 輸出數字格式失真,**首選後端 SQL 加單引號前綴**(最穩健、無模板依賴),次選 RTF fo:bidi-override。若報表需保留 Excel 計算能力,請在資料量級可控前提下直接輸出數值,勿強制轉文字。