Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 三井住友カード
- 카마츠루
- PayPayフリマ
- react.js
- PostgreSQL
- 프라하
- pyenv
- terraform
- 아타미
- 태국
- 뮌헨
- PayPay
- 熱海
- 메르페이
- CSV
- JenkinsFile
- vba
- local
- 체코
- Python
- 방콕
- Selenium
- 미츠이 스미토모
- 釜つる
- javascript
- duckdb
- node.js
- documentdb
- typescript
- 페이페이
Archives
- Today
- Total
도쿄사는 외노자
CSV Download Button 본문
1. Data 준비
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | const data = { buttonStatus: [ { name: 'CSV', type: 'csv', status: true }, ... ], csvFileName: 'export.csv', columns: [ { key: 'name', label: 'Dessert (100g serving)', tooltip: '英語', sortable: true, ... }, ... ], rows: [ { name: 'Frozen yogurt', jname: 'フローズンヨーグルト', kname: '프로즌 요구르트', ... }, ... ] } | cs |
2. CSV Download Button 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | setButton(btnStatus) { if (!btnStatus || btnStatus.length === 0) return null; this.btnList = btnStatus.map((btn) => { if (!btn.status) return false; switch (btn.type) { case 'csv': return ( <RaisedButton label={btn.name} onClick={this.handleCSVButtonClick} style={{ marginRight: 10 }} /> ); default: return false; } }); return ( <div style={{ padding: 10 }}> {this.btnList} </div> ); } | cs |
3. Data를 변환
- Column명은 Columns의 label을 사용
- 실제 데이터를 따올 key는 Columns의 key를 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | convertRowsToCsv() { const columns = this.state.columns; const rows = this.state.rows; let result = null; const columnDelimiter = ','; const lineDelimiter = '\n'; const columnRows = []; columns.forEach((column) => { columnRows.push(column.label); }); result = ''; result += columnRows.join(columnDelimiter); result += lineDelimiter; rows.forEach((row) => { let count = 0; columns.forEach((column) => { const key = column.key; if (count > 0) result += columnDelimiter; result += row[key]; count += 1; }); result += lineDelimiter; }); return result; } | cs |
4. Button Click시 변환한 Data를 Download
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | handleCSVButtonClick(event) { event.preventDefault(); const data = this.convertRowsToCsv(); if (!data || data.length === 0) return; const bom = new Uint8Array([0xEF, 0xBB, 0xBF]); const fileName = this.props.data.csvFileName; const blob = new Blob([bom, data], { type: 'text/csv' }); if (window.navigator.msSaveBlob) { window.navigator.msSaveBlob(blob, fileName); window.navigator.msSaveOrOpenBlob(blob, fileName); } else { const csv = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.setAttribute('href', csv); link.setAttribute('download', fileName); link.click(); } } | cs |
'Tech > React.js' 카테고리의 다른 글
라벨의 Byte Length에 따른 요소 길이 조정 (0) | 2017.01.23 |
---|---|
React.js에서의 propTypes 복수 지정 (0) | 2017.01.12 |
React.js에서의 modal의 cache삭제 (0) | 2016.11.04 |
React.js에서의 PDF파일의 DB저장과 열람 (0) | 2016.10.27 |
HTML5 input type number에서의 maxlength 적용 (0) | 2016.09.21 |