Try   HackMD

Frappe 的 Excel 匯出格式設定

在使用 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,特定欄位便都會是靠右顯示。