feat: 엑셀다운로드 기능 추가
parent
4768160ba5
commit
7ad064138d
@ -0,0 +1,103 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { IconFileExport } from '@tabler/icons';
|
||||||
|
import { Button } from '@mui/material';
|
||||||
|
import * as Excel from 'exceljs';
|
||||||
|
import saveAs from 'file-saver';
|
||||||
|
|
||||||
|
const ExcelDownload = ({ fileName, gridColumns, excelDatas }) => {
|
||||||
|
const handleExcelDownload = () => {
|
||||||
|
const workbook = new Excel.Workbook();
|
||||||
|
const worksheet = workbook.addWorksheet('Sheet'); // sheet 이름이 My Sheet
|
||||||
|
/*
|
||||||
|
// subject
|
||||||
|
worksheet.mergeCells('A2:I2');
|
||||||
|
const customCell = worksheet.getCell('A2');
|
||||||
|
customCell.font = {
|
||||||
|
name: 'Comic Sans MS',
|
||||||
|
family: 4,
|
||||||
|
size: 20,
|
||||||
|
underline: true,
|
||||||
|
bold: true
|
||||||
|
};
|
||||||
|
customCell.value = 'Subject';
|
||||||
|
*/
|
||||||
|
const headerRow = worksheet.addRow();
|
||||||
|
worksheet.getRow(1).font = { bold: true };
|
||||||
|
|
||||||
|
gridColumns.forEach((col, idx) => {
|
||||||
|
const currentColumnWidth = col.width;
|
||||||
|
worksheet.getColumn(idx + 1).width = currentColumnWidth !== undefined ? currentColumnWidth / 6 : 20;
|
||||||
|
const cell = headerRow.getCell(idx + 1);
|
||||||
|
cell.value = col.headerName;
|
||||||
|
});
|
||||||
|
|
||||||
|
// if (this.state.excelFilterEnabled === true) {
|
||||||
|
worksheet.autoFilter = {
|
||||||
|
from: {
|
||||||
|
row: 1,
|
||||||
|
column: 1
|
||||||
|
},
|
||||||
|
to: {
|
||||||
|
row: 1,
|
||||||
|
column: gridColumns.length
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
worksheet.properties.outlineProperties = {
|
||||||
|
summaryBelow: false,
|
||||||
|
summaryRight: false
|
||||||
|
};
|
||||||
|
|
||||||
|
excelDatas.forEach((row) => {
|
||||||
|
const dataRow = worksheet.addRow();
|
||||||
|
|
||||||
|
// eslint-disable-next-line guard-for-in,no-restricted-syntax
|
||||||
|
for (const [k, v] of Object.entries(row)) {
|
||||||
|
// eslint-disable-next-line no-plusplus
|
||||||
|
|
||||||
|
// eslint-disable-next-line consistent-return
|
||||||
|
gridColumns.forEach((col, idx) => {
|
||||||
|
if (col.field === k) {
|
||||||
|
const cell = dataRow.getCell(idx + 1);
|
||||||
|
cell.value = v;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Footer
|
||||||
|
const rowCount = worksheet.rowCount;
|
||||||
|
worksheet.mergeCells(`A${rowCount}:I${rowCount + 1}`);
|
||||||
|
worksheet.getRow(1).font = { bold: true };
|
||||||
|
worksheet.getCell(`A${rowCount}`).font = {
|
||||||
|
name: 'Comic Sans MS',
|
||||||
|
family: 4,
|
||||||
|
size: 20,
|
||||||
|
underline: true,
|
||||||
|
bold: true
|
||||||
|
};
|
||||||
|
|
||||||
|
worksheet.getCell(`A${rowCount}`).value = 'Custom Footer here';
|
||||||
|
*/
|
||||||
|
|
||||||
|
workbook.xlsx.writeBuffer().then((buffer) => {
|
||||||
|
saveAs(new Blob([buffer], { type: 'application/octet-stream' }), `${fileName}.xlsx`);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button variant="contained" color="primary" size="small" startIcon={<IconFileExport />} onClick={handleExcelDownload}>
|
||||||
|
엑셀다운로드
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
ExcelDownload.propTypes = {
|
||||||
|
fileName: PropTypes.string.isRequired,
|
||||||
|
gridColumns: PropTypes.array.isRequired,
|
||||||
|
excelDatas: PropTypes.array.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ExcelDownload;
|
Loading…
Reference in New Issue