프로젝트 구성이 지연되어 관련 서비스를로드 할 수 없다고 생각합니다. 서비스에서 필요로하는 추출 기능을 제안하고 모두 함께 작성했습니다. 예 :
function Workbook() {
if (!(this instanceof Workbook)) return new Workbook();
this.SheetNames = [];
this.Sheets = {};
}
function sheetFromArrayUiGrid(data, columns) {
var ws = {};
var range = {
s: {
c: 10000000,
r: 10000000
},
e: {
c: 0,
r: 0
}
};
var C = 0;
columns.forEach(function (c) {
var v = c.displayName || c.value || columns[i].name;
addCell(range, v, 0, C, ws);
C++;
}, this);
var R = 1;
data.forEach(function (ds) {
C = 0;
ds.forEach(function (d) {
var v = d.value;
addCell(range, v, R, C, ws);
C++;
});
R++;
}, this);
if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
return ws;
}
/**
*
* @param {*} data
* @param {*} columns
*/
function datenum(v, date1904) {
if (date1904) v += 1462;
var epoch = Date.parse(v);
return (epoch - new Date(Date.UTC(1899, 11, 30)))/(24 * 60 * 60 * 1000);
}
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
function addCell(range, value, row, col, ws) {
if (range.s.r > row) range.s.r = row;
if (range.s.c > col) range.s.c = col;
if (range.e.r < row) range.e.r = row;
if (range.e.c < col) range.e.c = col;
var cell = {
v: value
};
if (cell.v == null) cell.v = '-';
var cell_ref = XLSX.utils.encode_cell({
c: col,
r: row
});
if (typeof cell.v === 'number') cell.t = 'n';
else if (typeof cell.v === 'boolean') cell.t = 'b';
else if (cell.v instanceof Date) {
cell.t = 'n';
cell.z = XLSX.SSF._table[14];
cell.v = datenum(cell.v);
}else if(cell.v ==='string'){
cell.s=font.bold===true
} else cell.t = 's';
ws[cell_ref] = cell;
}
function getData(grid, rowTypes, colTypes, applyCellFilters) {
var data = [];
var rows;
var columns;
switch (rowTypes) {
case uiGridExporterConstants.ALL:
rows = grid.rows;
break;
case uiGridExporterConstants.VISIBLE:
rows = grid.getVisibleRows();
break;
case uiGridExporterConstants.SELECTED:
if (grid.api.selection){
rows = grid.api.selection.getSelectedGridRows();
} else {
gridUtil.logError('selection feature must be enabled to allow selected rows to be exported');
}
break;
}
if (colTypes === uiGridExporterConstants.ALL){
columns = grid.columns;
} else {
var leftColumns = grid.renderContainers.left ? grid.renderContainers.left.visibleColumnCache.filter(function(column){ return column.visible; }) : [];
var bodyColumns = grid.renderContainers.body ? grid.renderContainers.body.visibleColumnCache.filter(function(column){ return column.visible; }) : [];
var rightColumns = grid.renderContainers.right ? grid.renderContainers.right.visibleColumnCache.filter(function(column){ return column.visible; }) : [];
columns = leftColumns.concat(bodyColumns,rightColumns);
}
rows.forEach(function(row, index) {
if (row.exporterEnableExporting !== false) {
var extractedRow = [];
columns.forEach(function(gridCol, index) {
if ((gridCol.visible || colTypes === uiGridExporterConstants.ALL) &&
gridCol.colDef.exporterSuppressExport !== true &&
grid.options.exporterSuppressColumns.indexOf(gridCol.name) === -1){
var cellValue = applyCellFilters ? grid.getCellDisplayValue(row, gridCol) : grid.getCellValue(row, gridCol);
var extractedField = { value: grid.options.exporterFieldCallback(grid, row, gridCol, cellValue) };
if (gridCol.colDef.exporterPdfAlign) {
extractedField.alignment = gridCol.colDef.exporterPdfAlign;
}
extractedRow.push(extractedField);
}
});
data.push(extractedRow);
}
});
return data;
}
function getColumnHeaders(grid, colTypes) {
var headers = [];
var columns;
if (colTypes === uiGridExporterConstants.ALL){
columns = grid.columns;
} else {
var leftColumns = grid.renderContainers.left ? grid.renderContainers.left.visibleColumnCache.filter(function(column){ return column.visible; }) : [];
var bodyColumns = grid.renderContainers.body ? grid.renderContainers.body.visibleColumnCache.filter(function(column){ return column.visible; }) : [];
var rightColumns = grid.renderContainers.right ? grid.renderContainers.right.visibleColumnCache.filter(function(column){ return column.visible; }) : [];
columns = leftColumns.concat(bodyColumns,rightColumns);
}
columns.forEach(function(gridCol, index) {
if (gridCol.colDef.exporterSuppressExport !== true &&
grid.options.exporterSuppressColumns.indexOf(gridCol.name) === -1){
// gridCol.colDef.headerCellTemplate = '<a target="_blank" href="http://stackoverflow.com" align="middle" ><img src="http://cdn.flaticon.com/png/256/70689.png" align="middle" title="Describe Image Link Destination" width="70" height="20" /></a>'+'</div>';
headers.push({
name: gridCol.field,
displayName: grid.options.exporterHeaderFilter ? (grid.options.exporterHeaderFilterUseName ? grid.options.exporterHeaderFilter(gridCol.name) : grid.options.exporterHeaderFilter(gridCol.displayName)) : gridCol.displayName,
width: gridCol.drawnWidth ? gridCol.drawnWidth : gridCol.width,
align: gridCol.colDef.type === 'number' ? 'right' : 'left'
});
}
});
return headers;
}
// gridCol.colDef.headerCellTemplate = '<a target="_blank" href="http://stackoverflow.com" align="middle" ><img src="http://cdn.flaticon.com/png/256/70689.png" align="middle" title="Describe Image Link Destination" width="70" height="20" /></a>'+'</div>';
function exporting(sheetName, gridApi, rowTypes, colTypes) {
var columns = gridApi.grid.options.showHeader ? getColumnHeaders(gridApi.grid, colTypes) : [];
var data = getData(gridApi.grid, rowTypes, colTypes);
var fileName = gridApi.grid.options.exporterExcelFilename ? gridApi.grid.options.exporterExcelFilename : 'BI_REPORT';
fileName += '.xlsx';
var wb = new Workbook(),
ws = sheetFromArrayUiGrid(data, columns);
wb.SheetNames.push(sheetName);
wb.Sheets[sheetName] = ws;
var wbout = XLSX.write(wb, {
bookType: 'xlsx',
bookSST: false,
type: 'binary',
cellStyles: true
});
wbout.
saveAs(new Blob([s2ab(wbout)], {
type: 'application/octet-stream'
}), fileName);
}