diff --git a/README.md b/README.md index 65bdd12..c1bf37b 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,13 @@ var rows = [{ - horizontalAlignment: - left, center, right, fill, justify - fontName: Nome da fonte - fontSize: tamanho da fonte + - fontColor: Cor da Fonte. + Acesse https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/IndexedColors.html para lista de opções + - size: Tamanho da coluna. É utilizado quando a opção autoSize possui o valor `false`, + - backgroundColor: Cor de fundo da célula. Acesse https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/IndexedColors.html para lista de opções + - unlocked: Seta a célula como desbloqueada. Só funciona quando uma senha é atribuida para a planilha. + - verticalAlignment: top, center, bottom + - formula: Quando ativo pega o valor da célula e aplica como uma fórmula - bold: se será negrito ou não. - italic: se será itálico ou não - striked: se terá strikethrough @@ -71,6 +78,9 @@ var metadata = { //Opcional horizontalAlignment: 'center', fontName: 'Colibri' }, + rowStyle: { // Estilos específica da linha + height: 1000 // Altura das linhas da planilha + } style: { //Estilo padrão que será aplicado a todas as celulas fontName: 'Courrier New', }, @@ -87,8 +97,15 @@ var metadata = { //Opcional striked: true, }, salario: { - type: 'currency' + type: 'currency', + }, + somatoria: { + formula: true } + }, + sheetProperties : { // Configurações específicas da sheet + password: '123', // Senha, que ao ser setada bloqueia toda a planilha. Utilize a propriedade `unlocked` para desbloquear as células de uma coluna + name: 'Planilha 1' // nome da aba } }; @@ -113,7 +130,7 @@ var metadata = { //Opcional O primeiro argumento pode ser: - Path do arquivo - stream da planilha - - bytes da planilha + - bytes da planilha */ var jsonPlanilha = xlsx.read('./planilha.xlsx', metadata); -``` \ No newline at end of file +``` diff --git a/brief.json b/brief.json index 3d77a19..234eac8 100644 --- a/brief.json +++ b/brief.json @@ -2,7 +2,7 @@ "name": "xlsx", "description": "Biblioteca de modelagemd e xlsx", "path": "dist", - "version": "0.0.3", + "version": "0.0.5", "author": "Bruno Machado", "dependencies": { "jars": [ @@ -16,4 +16,4 @@ "org.apache.xmlbeans:xmlbeans:2.6.0" ] } -} \ No newline at end of file +} diff --git a/dist/create.js b/dist/create.js index 127c9c0..84cb7ec 100644 --- a/dist/create.js +++ b/dist/create.js @@ -1,8 +1,11 @@ var ByteArrayOutputStream = Java.type('java.io.ByteArrayOutputStream'); var CellType = Java.type('org.apache.poi.ss.usermodel.CellType'); var HorizontalAlignment = Java.type('org.apache.poi.ss.usermodel.HorizontalAlignment'); +var VerticalAlignment = Java.type('org.apache.poi.ss.usermodel.VerticalAlignment'); var XSSFFont = Java.type('org.apache.poi.xssf.usermodel.XSSFFont'); var XSSFWorkbook = Java.type('org.apache.poi.xssf.usermodel.XSSFWorkbook'); +var IndexedColors = Java.type('org.apache.poi.ss.usermodel.IndexedColors'); +var FillPatternType = Java.type('org.apache.poi.ss.usermodel.FillPatternType'); var DEFAULT_DATE_FORMAT = 'DD/MM/yyyy'; var DEFAULT_TIME_FORMAT = 'HH:MM'; @@ -10,11 +13,15 @@ var DEFAULT_DATETIME_FORMAT = DEFAULT_DATE_FORMAT + ' ' + DEFAULT_TIME_FORMAT; var DEFAULT_CURRENCY_FORMAT = 'R$ #,##0.00'; -var FONT_OPTION_NAMES = ['fontName', 'fontSize', 'bold', 'italic', 'striked', 'underline', 'doubleUnderline']; +var FONT_OPTION_NAMES = ['fontName', 'fontSize', 'fontColor', 'bold', 'italic', 'striked', 'underline', 'doubleUnderline']; var FONTS_CACHE = {}; var STYLES_CACHE = {}; function create(rows, metadata) { + + FONTS_CACHE = {}; + STYLES_CACHE = {}; + metadata = Object.assign({ asByteArray: true, autoSize: true, @@ -29,21 +36,44 @@ function create(rows, metadata) { var createHelper = wb.getCreationHelper(); var sheet = wb.createSheet(); + var sheetProperties = metadata.sheetProperties; var columnsMD = metadata.columns; var generalStyle = metadata.style; var headerStyleMD = metadata.headerStyle; + var rowStyle = metadata.rowStyle; + + if (sheetProperties) { + if (sheetProperties.password) { + sheet.protectSheet(sheetProperties.password); + sheet.lockDeleteColumns(true); + sheet.lockInsertColumns(true); + } - rows.forEach(function (row, index) { + if (sheetProperties.name) { + wb.setSheetName(0, sheetProperties.name); + } + } + + rows.forEach(function(row, index) { var sheetHeader = metadata.hasHeader && index == 0 ? sheet.createRow(0) : null; var sheetRow = sheet.createRow(metadata.hasHeader ? index + 1 : index); - Object.keys(row).forEach(function (key, cellIndex) { + Object.keys(row).forEach(function(key, cellIndex) { var value = row[key]; var valueClass = value && value.constructor.name; var columnMD = columnsMD && columnsMD[key]; + if (rowStyle && rowStyle.height) { + sheetRow.setHeight(rowStyle.height); + } + if (sheetHeader != null) { + + if (headerStyleMD && headerStyleMD.height) { + sheetHeader.setHeight(headerStyleMD.height); + } + var style = Object.assign({}, generalStyle, columnMD, headerStyleMD); var headerCell = createCell(wb, sheetHeader, cellIndex, style, createHelper, valueClass); @@ -57,15 +87,32 @@ function create(rows, metadata) { var style = Object.assign({}, generalStyle, columnMD); var cell = createCell(wb, sheetRow, cellIndex, style, createHelper, valueClass); - setTypedValue(cell, value, valueClass); + + var formula = (columnMD && columnMD.formula) ? columnMD.formula : null; + setTypedValue(cell, value, valueClass, formula); }); }); if (metadata.autoSize) { var headerRow = sheet.getRow(0); - headerRow.cellIterator().forEachRemaining(function (cell) { + headerRow.cellIterator().forEachRemaining(function(cell) { sheet.autoSizeColumn(cell.getColumnIndex()); }); + } else { + var headerRow = sheet.getRow(0); + headerRow.cellIterator().forEachRemaining(function(cell) { + var columnsKeys = Object.keys(columnsMD); + var columnIndex = cell.getColumnIndex() + + if (columnsMD && columnsKeys.length > 0) { + var columnMD = columnsMD[columnsKeys[columnIndex]] + if (columnMD.size && columnMD.size.toString().toUpperCase() === 'AUTO') { + sheet.autoSizeColumn(cell.getColumnIndex()); + } else if (!isNaN(columnMD.size) && columnMD.size >= 0) { + sheet.setColumnWidth(cell.getColumnIndex(), columnMD.size); + } + } + }); } if (metadata.asByteArray) { @@ -90,12 +137,12 @@ function createCell(wb, sheetRow, cellIndex, style, createHelper, valueClass) { if (Object.keys(style).length) { var cacheKey = JSON.stringify(style); var cellStyle = STYLES_CACHE[cacheKey]; - + if (!cellStyle) { cellStyle = wb.createCellStyle(); - + updateCellStyle(wb, cellStyle, style, createHelper); - + STYLES_CACHE[cacheKey] = cellStyle; } @@ -110,10 +157,19 @@ function updateCellStyle(wb, cellStyle, options, createHelper) { return; } + if (options.backgroundColor) { + cellStyle.setFillForegroundColor(IndexedColors[options.backgroundColor.toUpperCase()].getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + } + if (options.format) { cellStyle.setDataFormat(createHelper.createDataFormat().getFormat(options.format)); } + if(options.unlocked) { + cellStyle.setLocked(false); + } + var font = resolveFont(wb, options); if (font) { @@ -123,6 +179,9 @@ function updateCellStyle(wb, cellStyle, options, createHelper) { if (options.horizontalAlignment) { cellStyle.setAlignment(HorizontalAlignment[options.horizontalAlignment.toUpperCase()]); } + if (options.verticalAlignment) { + cellStyle.setVerticalAlignment(VerticalAlignment[options.verticalAlignment.toUpperCase()]); + } } function resolveFont(wb, options) { @@ -130,7 +189,7 @@ function resolveFont(wb, options) { return undefined; } - var fontOpts = FONT_OPTION_NAMES.reduce(function (map, optName) { + var fontOpts = FONT_OPTION_NAMES.reduce(function(map, optName) { if (options[optName]) { map[optName] = options[optName]; } @@ -171,6 +230,10 @@ function resolveFont(wb, options) { font.setUnderline(0x22); } + if (fontOpts.fontColor) { + font.setColor(IndexedColors[fontOpts.fontColor.toUpperCase()].getIndex()); + } + FONTS_CACHE[key] = font; } } @@ -198,7 +261,8 @@ function resolveDataFormat(options, valueClass) { } } -function setTypedValue(cell, value, valueClass) { +function setTypedValue(cell, value, valueClass, formula) { + if (value === null || value === undefined) { cell.setCellType(CellType.BLANK); return; @@ -208,7 +272,13 @@ function setTypedValue(cell, value, valueClass) { value = new java.util.Date(value.getTime()); } - cell.setCellValue(value); + if (formula) { + cell.setCellType(CellType.FORMULA); + cell.setCellFormula(value); + } else { + cell.setCellValue(value); + } + } -exports = create; \ No newline at end of file +exports = create;