# React直接接資料庫
故事是這樣的:
榮總醫院急診的專案,當初說只是畫面翻新而已,所以只有前端,結果到後面就變成越來越複雜,阿不就還好我用django寫過後端,大概知道流程後,就自己嘗試用js寫了。
急診系統裡有一個東西叫做"模板",讓醫生可以直接一鍵填寫的功能。
客戶給了一個excel,說這是最新版的模板
???所以勒我要幹嘛??
事情演變到最後就是我要用後端去excel中找東西,回傳到前端
# 把excel當資料庫
先匯入excel處理包
> FormType 要先寫好每個excel欄位對應的type
:::spoiler
excel的欄位中會有XX1,XX2這種,但我顯示在畫面上只有要一個XX,也就是我會需要彙整XX1與XX2
```javascript=
export interface FormType {
id:string;
ERSBKEY?: string;
名稱?: string;
科別?:string;
CHIEFCOMPLAINT:string|""; // 彙整
CHIEFCOMPLAINT1?: string;
CHIEFCOMPLAINT2?: string;
CHIEFCOMPLAINT3?: string;
PRESENTILLNESS?: string|"";
PRESENTILLNESS1?: string;
PRESENTILLNESS2?: string;
PRESENTILLNESS3?: string;
PRESENTILLNESS4?: string;
PASTHISTORY?: string;
PASTHISTORY1?: string;
PASTHISTORY2?: string;
PASTHISTORY3?: string;
GENERALCONDITION?: string;
GENERALCONDITION1?: string;
GENERALCONDITION2?: string;
HEENT?: string;
NECK?: string;
HESTAndLUNGS?: string;
HESTAndLUNGS1?: string;
HESTAndLUNGS2?: string;
ABDOMEN?: string,
ABDOMEN1?: string;
ABDOMEN2?: string;
BACKAndSPINE?: string;
EXOGENITALIA?: string;
RECTALEXAM?: string;
EXTREMITIES?: string;
NEUROLOGICALEXAM?: string;
}
```
:::
```javascript=
import * as XLSX from 'xlsx';
import { FormType } from '@/lib/data/data';
type Props = {
closeModal: () => void;
tab: string; // 會根據這個tab來搜尋
onSelect: (item:FormType ) => void; // excel中的東西
};
export default function TraumaModal({ tab, onSelect,closeModal }: Props) {
const handleBackdropClick = (e: MouseEvent<HTMLDivElement>) => {
if (e.target === e.currentTarget) {
closeModal();
}
};
const [data, setData] = useState<FormType[]>([]); // 接收api回傳的資料
```
## 主要部分
```javascript=
useEffect(() => {
fetch('/急診病歷既有模組.xlsx')
.then((res) => res.arrayBuffer())
.then((buffer) => {
const workbook = XLSX.read(buffer, { type: 'array' });
const sheet = workbook.Sheets[workbook.SheetNames[0]];
const json = XLSX.utils.sheet_to_json<FormType>(sheet);
setData(json); // 直接賦值即可
});
}, []);
const filtered = data.filter((d) => d['科別' ]?.includes(tab));
```
將excel對應頁面表格
```javascript=
const handleClickItem = (item: FormType) => {
onSelect({
ERSBKEY: item['ERSBKEY'] || '',
名稱: item['名稱'] || '',
CHIEFCOMPLAINT: [item['CHIEFCOMPLAINT1'], item['CHIEFCOMPLAINT2'], item['CHIEFCOMPLAINT3']].filter(s => s?.trim()).join('\n'),
PRESENTILLNESS: [item['PRESENTILLNESS1'], item['PRESENTILLNESS2'], item['PRESENTILLNESS3'], item['PRESENTILLNESS4']].filter(s => s?.trim()).join('\n'),
PASTHISTORY: [item['PASTHISTORY1'], item['PASTHISTORY2'], item['PASTHISTORY3']].filter(s => s?.trim()).join('\n'),
GENERALCONDITION: [item['GENERALCONDITION1'], item['GENERALCONDITION2']].filter(s => s?.trim()).join('\n'),
HESTAndLUNGS: [item['HESTAndLUNGS1'], item['HESTAndLUNGS2']].filter(s => s?.trim()).join('\n'),
ABDOMEN: [item['ABDOMEN1'], item['ABDOMEN2']].filter(s => s?.trim()).join('\n'),
HEENT: item['HEENT'] || '',
NECK: item['NECK'] || '',
BACKAndSPINE: item['BACKAndSPINE'] || '',
EXOGENITALIA: item['EXOGENITALIA'] || '',
RECTALEXAM: item['RECTALEXAM'] || '',
EXTREMITIES: item['EXTREMITIES'] || '',
NEUROLOGICALEXAM: item['NEUROLOGICALEXAM'] || '',
id: item['id'] || '',
});
closeModal();
};
```
## 主畫面
```html=
return (
<div onClick={handleBackdropClick}>
<div className={styles.modalTitle}>{tab}科 模組</div>
<button onClick={closeModal}>✕</button>
<div>
{filtered.map((item, idx) => (
<div
key={idx}
onClick={() => handleClickItem(item)}
>
🩺{item['名稱']}
</div>
))}
</div>
</div>
```
# 用api.js接資料庫
[如何將excel匯入MySQL](https://hackmd.io/U4pftBjARg6uttniGbbtsg#%E5%B0%87excel%E5%8C%AF%E5%85%A5mySQL)