在使用 Frappe 內建的匯出下載報表時,若為數值(Number)或幣值(Currency)資料,在 Excel 中便會自動靠右,不過因客戶需求的關係,我們需要將某些數字格式化 XX,XXX NTS 這種格式,此時資料型態已經是 String,在 Excel 中便不會靠右,因此需要針對 Frappe 的 make_excel 進行修改(Source Code)
import openpyxl
from openpyxl.styles import Font, Alignment
from openpyxl.utils import get_column_letter
from frappe.utils.xlsxutils import handle_html
def make_xlsx(data, sheet_name, wb=None, column_widths=None):
column_widths = column_widths or []
if wb is None:
wb = openpyxl.Workbook(write_only=True)
ws = wb.create_sheet(sheet_name, 0)
for i, column_width in enumerate(column_widths):
if column_width:
ws.column_dimensions[get_column_letter(i + 1)].width = column_width
row1 = ws.row_dimensions[1]
row1.font = Font(name='Calibri', bold=True)
for row in data:
clean_row = []
for item in row:
if isinstance(item, str) and (sheet_name not in ['Data Import Template', 'Data Export']):
value = handle_html(item)
else:
value = item
if isinstance(item, str) and next(ILLEGAL_CHARACTERS_RE.finditer(value), None):
# Remove illegal characters from the string
value = re.sub(ILLEGAL_CHARACTERS_RE, '', value)
clean_row.append(value)
ws.append(clean_row)
# 置右特定欄位
alignment_right_columns = ['field_1', 'field_2']
for col in ws.columns:
for idx, cell in enumerate(col):
if idx == 0 and cell.value not in alignment_right_columns:
break
cell.alignment = Alignment(horizontal='right')
xlsx_file = BytesIO()
wb.save(xlsx_file)
return xlsx_file
make_excel 的主要 Code 都不用修改,只需要在跑完 for row in data
這個迴圈後,依照 ws.columns 的去跑迴圈,由於第一列的第一個 cell 都是欄位名稱(我們的使用情境不會有特殊的報表),因此若第一列的第一個 cell 為需要置右的欄位,就將該 col 的每一個欄位都透過 openpyxl 的 Alignment 去設定靠右,若為不需要靠右的欄位,就跳過該欄即可。之後透過該方法所產的 Excel,特定欄位便都會是靠右顯示。
PS: 所有操作都在 ~ 路徑下
Aug 2, 2024Frappe edit background job timeout Frappe default time is 300s, So if your job runtime over 300s, Frappe will throw below exception rq.timeouts.JobTimeoutException: Task exceeded maximum timeout value (300 seconds) But some job need spend a lot of time, So we can set below settings in common_site_config.json "workers": { "default": { "timeout": 900
Mar 22, 2022ERPNext 開發雜記 不知道怎麼分類的紀錄都會丟到這邊來 發票金額的四捨五入 由於台灣的發票金額,稅費等都是整數,而 ERPNext 的金額預設都會有小數點,因此需要透過一些設定來讓 ERPNext 在計算時將金額與稅費時自行四捨五入,以符合台灣的使用習慣。 1. 設定 Regional ERPNext 會根據當前的區域,若為特地區域會有不一樣的金額計算方式(ERPNext 的 Regionl 設定),因此我們可以按照 ERPNext 的做法,在 hooks.py 中新增一個 Taiwan,並且設定要 Override 的 method,如下: # hooks.py
Feb 10, 2022在 MultiSelectDialog 中預設 Filter 在上圖的情境中,點選右上角的「從...獲取項目」後,會出現途中的 Dialog,由於客戶要求在 Dialog 中可以有預設的 Filter,這在 Frappe 的 Dialog 物件中有類似的 function 能用,但 ERPNext 在產生這個 Dialog 時(utils.js #L705),雖然 map_current_doc 有回傳 Dialog 的物件,不過在purchase_invoice.js #L109中,並沒有變數去接這個物件,因此為了達成這個功能,就需要稍微修改一下 map_current_doc 才能夠達成。 Step.1 透過 Form Event 掛載自定義的 JS Frappe Form Event 新增一個 JS 檔,設定 Listen 「Purchase Invoice」(這邊能換成任何一個 Module,此部分以 Purchase Invoice 為例),以及一個 onload 事件。 frappe.ui.form.on("Purchase Invoice", {
Dec 8, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up