ag-grid-enterprise
Version:
ag-Grid Enterprise Features
174 lines (144 loc) • 6.5 kB
text/typescript
import {
Autowired,
BaseCreator,
Bean,
Column,
ColumnController,
Downloader,
ExcelExportParams,
GridOptions,
GridOptionsWrapper,
GridSerializer,
IExcelCreator,
PostConstruct,
RowNode,
RowType,
StylingService,
ValueService,
ZipContainer,
_
} from 'ag-grid-community';
import {ExcelCell, ExcelStyle} from 'ag-grid-community';
import {ExcelXmlSerializingSession} from './excelXmlSerializingSession';
import {ExcelXlsxSerializingSession} from './excelXlsxSerializingSession';
import {ExcelXmlFactory} from './excelXmlFactory';
import {ExcelXlsxFactory} from './excelXlsxFactory';
export interface ExcelMixedStyle {
key: string;
excelID: string;
result: ExcelStyle;
}
type SerializingSession = ExcelXmlSerializingSession | ExcelXlsxSerializingSession;
export class ExcelCreator extends BaseCreator<ExcelCell[][], SerializingSession, ExcelExportParams> implements IExcelCreator {
private excelXmlFactory: ExcelXmlFactory;
private xlsxFactory: ExcelXlsxFactory;
private columnController: ColumnController;
private valueService: ValueService;
private gridOptions: GridOptions;
private stylingService: StylingService;
private downloader: Downloader;
private gridSerializer: GridSerializer;
gridOptionsWrapper: GridOptionsWrapper;
zipContainer: ZipContainer;
private exportMode: string;
public postConstruct(): void {
this.setBeans({
downloader: this.downloader,
gridSerializer: this.gridSerializer,
gridOptionsWrapper: this.gridOptionsWrapper
});
}
public exportDataAsExcel(params?: ExcelExportParams): string {
if (params && params.exportMode) {
this.setExportMode(params.exportMode);
}
return this.export(params);
}
public getDataAsExcelXml(params?: ExcelExportParams): string {
return this.getData(_.assign({}, params, { exportMode: 'xml' }));
}
public getMimeType(): string {
return this.getExportMode() === 'xml' ? 'application/vnd.ms-excel' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
}
public getDefaultFileName(): string {
return `export.${this.getExportMode()}`;
}
public getDefaultFileExtension(): string {
return this.getExportMode();
}
public createSerializingSession(params?: ExcelExportParams): SerializingSession {
const {columnController, valueService, gridOptionsWrapper} = this;
const {processCellCallback, processHeaderCallback, sheetName, suppressTextAsCDATA} = params;
const isXlsx = this.getExportMode() === 'xlsx';
const excelFactory = isXlsx ? this.xlsxFactory : this.excelXmlFactory;
const config = {
columnController,
valueService,
gridOptionsWrapper,
processCellCallback: processCellCallback || null,
processHeaderCallback: processHeaderCallback || null,
sheetName: sheetName != null && sheetName !== '' ? (sheetName.toString()).substr(0, 31) : 'ag-grid',
excelFactory,
baseExcelStyles: this.gridOptions.excelStyles,
styleLinker: this.styleLinker.bind(this),
suppressTextAsCDATA: suppressTextAsCDATA || false
};
return new (isXlsx ? ExcelXlsxSerializingSession : ExcelXmlSerializingSession)(config);
}
private styleLinker(rowType: RowType, rowIndex: number, colIndex: number, value: string, column: Column, node: RowNode): string[] {
if ((rowType === RowType.HEADER) || (rowType === RowType.HEADER_GROUPING)) return ["header"];
if (!this.gridOptions.excelStyles || this.gridOptions.excelStyles.length === 0) return null;
let styleIds: string[] = this.gridOptions.excelStyles.map((it: ExcelStyle) => {
return it.id;
});
let applicableStyles: string [] = [];
this.stylingService.processAllCellClasses(
column.getColDef(),
{
value: value,
data: node.data,
node: node,
colDef: column.getColDef(),
rowIndex: rowIndex,
api: this.gridOptionsWrapper.getApi(),
context: this.gridOptionsWrapper.getContext()
},
(className: string) => {
if (styleIds.indexOf(className) > -1) {
applicableStyles.push(className);
}
}
);
return applicableStyles.sort((left: string, right: string): number => {
return (styleIds.indexOf(left) < styleIds.indexOf(right)) ? -1 : 1;
});
}
public isExportSuppressed():boolean {
return this.gridOptionsWrapper.isSuppressExcelExport();
}
private setExportMode(exportMode: string): void {
this.exportMode = exportMode;
}
private getExportMode(): string {
return this.exportMode || 'xlsx';
}
protected packageFile(data: string): Blob {
if (this.getExportMode() === 'xml') {
return super.packageFile(data);
}
const {zipContainer, xlsxFactory} = this;
zipContainer.addFolders(['_rels/', 'docProps/', 'xl/', 'xl/theme/', 'xl/_rels/', 'xl/worksheets/']);
zipContainer.addFile('[Content_Types].xml', xlsxFactory.createContentTypes());
zipContainer.addFile('_rels/.rels', xlsxFactory.createRels());
zipContainer.addFile('docProps/core.xml', xlsxFactory.createCore());
zipContainer.addFile('xl/workbook.xml', xlsxFactory.createWorkbook());
zipContainer.addFile('xl/styles.xml', xlsxFactory.createStylesheet());
zipContainer.addFile('xl/sharedStrings.xml', xlsxFactory.createSharedStrings());
zipContainer.addFile('xl/theme/theme1.xml', xlsxFactory.createTheme());
zipContainer.addFile('xl/_rels/workbook.xml.rels', xlsxFactory.createWorkbookRels());
zipContainer.addFile('xl/worksheets/sheet1.xml', data);
return zipContainer.getContent('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
}
}