---
# System prepended metadata

title: Frappe 的 Excel 匯出格式設定

---

---
title: Frappe 的 Excel 匯出格式設定
---
# Frappe 的 Excel 匯出格式設定

在使用 Frappe 內建的匯出下載報表時，若為數值(Number)或幣值(Currency)資料，在 Excel 中便會自動靠右，不過因客戶需求的關係，我們需要將某些數字格式化 XX,XXX NTS 這種格式，此時資料型態已經是 String，在 Excel 中便不會靠右，因此需要針對 Frappe 的 make_excel 進行修改（[Source Code](https://github.com/frappe/frappe/blob/version-13/frappe/utils/xlsxutils.py#L18)）

```python=
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，特定欄位便都會是靠右顯示。