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