Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ var rows = [{
- horizontalAlignment: <String> - left, center, right, fill, justify
- fontName: <String> Nome da fonte
- fontSize: <Number> tamanho da fonte
- fontColor: <String> Cor da Fonte.
Acesse https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/IndexedColors.html para lista de opções
- size: <Number> Tamanho da coluna. É utilizado quando a opção autoSize possui o valor `false`,
- backgroundColor: <String> 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: <Boolean> Seta a célula como desbloqueada. Só funciona quando uma senha é atribuida para a planilha.
- verticalAlignment: <String> top, center, bottom
- formula: <Boolean> Quando ativo pega o valor da célula e aplica como uma fórmula
- bold: <Boolean> se será negrito ou não.
- italic: <Boolean> se será itálico ou não
- striked: <Boolean> se terá strikethrough
Expand Down Expand Up @@ -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',
},
Expand All @@ -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
}
};

Expand All @@ -113,7 +130,7 @@ var metadata = { //Opcional
O primeiro argumento pode ser:
- <String> Path do arquivo
- <java.io.InputStream> stream da planilha
- <byte[]> bytes da planilha
- <byte[]> bytes da planilha
*/
var jsonPlanilha = xlsx.read('./planilha.xlsx', metadata);
```
```
4 changes: 2 additions & 2 deletions brief.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": [
Expand All @@ -16,4 +16,4 @@
"org.apache.xmlbeans:xmlbeans:2.6.0"
]
}
}
}
94 changes: 82 additions & 12 deletions dist/create.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
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';
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,
Expand All @@ -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);
Expand All @@ -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;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aqui poderiamos usar apenas uma expressão booleana simples, já que o campo formula do metadado é só um boolean.

var formula = Boolean(columnMD && columnMD.formula);

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) {
Expand All @@ -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;
}

Expand All @@ -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) {
Expand All @@ -123,14 +179,17 @@ 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) {
if (!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];
}
Expand Down Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
exports = create;