---
# System prepended metadata

title: React直接接資料庫

---

# 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)
