Como gerar uma planilha do EXCEL a partir de um Dataset no Fluig?
Essa é uma pergunta que recorrente em grupos e fóruns e a solução é simples e não requer nenhuma biblioteca adicional, tudo feito com JavaScript puro. Ao menos, nenhuma biblioteca externa ao Fluig, pois é necessário que o vcXMLRPC.js tenha sido carregado na página.
Caso deseje fazer a consulta sem a necessidade de o vcXMLRPC.js você pode considerar alterar a chamada ao dataset na linha 162 do código, substituindo a chamada a o método DatasetFactory para uma chamada a API do Fluig.
Vale lembrar que esse código pode ser bloqueado pelo navegador em alguns casos. Verifique se será necessário alterar as permissões para a página do Fluig abrir novas abas.
Vamos ao código.
let myExcelXML = (function () {
let Workbook, WorkbookStart = '\n';
const WorkbookEnd = ' \n';
let fs, SheetName = 'SHEET 1',
styleID = 1, columnWidth = 80,
fileName = "Employee_List", uri, link;
class myExcelXML {
constructor(o) {
let respArray = JSON.parse(o);
let finalDataArray = [];
for (let i = 0; i < respArray.length; i++) {
finalDataArray.push(flatten(respArray[i]));
}
let s = JSON.stringify(finalDataArray);
fs = s.replace(/&/gi, '&') != undefined ? s.replace(/&/gi, '&') : s;
}
downLoad() {
const Worksheet = myXMLWorkSheet(SheetName, fs);
// WorkbookStart += myXMLStyles(styleID);
Workbook = WorkbookStart + myXMLStyles(styleID) + Worksheet + WorkbookEnd;
uri = 'data:text/xls;charset=utf-8,' + encodeURIComponent(Workbook);
link = document.createElement("a");
link.href = uri;
link.style = "visibility:hidden";
link.download = fileName + ".xls";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
get fileName() {
return fileName;
}
set fileName(n) {
fileName = n;
}
get SheetName() {
return SheetName;
}
set SheetName(n) {
SheetName = n;
}
get styleID() {
return styleID;
}
set styleID(n) {
styleID = n;
}
}
const myXMLStyles = function (id) {
let Styles = ' \n';
return Styles;
}
const myXMLWorkSheet = function (name, o) {
const Table = myXMLTable(o);
let WorksheetStart = '';
const WorksheetEnd = ' \n';
return WorksheetStart + Table + WorksheetEnd;
}
const myXMLTable = function (o) {
let TableStart = '\n';
const TableEnd = ' \n';
const tableData = JSON.parse(o);
if (tableData.length > 0) {
const columnHeader = Object.keys(tableData[0]);
let rowData;
for (let i = 0; i < columnHeader.length; i++) {
TableStart += myXMLColumn(columnWidth);
}
for (let j = 0; j < tableData.length; j++) {
rowData += myXMLRow(tableData[j], columnHeader);
}
TableStart += myXMLHead(1, columnHeader);
TableStart += rowData;
}
return TableStart + TableEnd;
}
const myXMLColumn = function (w) {
return '';
}
const myXMLHead = function (id, h) {
let HeadStart = '';
const HeadEnd = ' \n';
for (let i = 0; i < h.length; i++) {
const Cell = myXMLCell(h[i].toUpperCase());
HeadStart += Cell;
}
return HeadStart + HeadEnd;
}
const myXMLRow = function (r, h) {
let RowStart = '';
const RowEnd = ' \n';
for (let i = 0; i < h.length; i++) {
const Cell = myXMLCell(r[h[i]]);
RowStart += Cell;
}
return RowStart + RowEnd;
}
const myXMLCell = function (n) {
let CellStart = '';
const CellEnd = ' ';
const Data = myXMLData(n);
CellStart += Data;
return CellStart + CellEnd;
}
const myXMLData = function (d) {
let DataStart = '';
const DataEnd = ' ';
return DataStart + d + DataEnd;
}
const flatten = function (obj) {
var obj1 = JSON.parse(JSON.stringify(obj));
const obj2 = JSON.parse(JSON.stringify(obj));
if (typeof obj === 'object') {
for (var k1 in obj2) {
if (obj2.hasOwnProperty(k1)) {
if (typeof obj2[k1] === 'object' && obj2[k1] !== null) {
delete obj1[k1]
for (var k2 in obj2[k1]) {
if (obj2[k1].hasOwnProperty(k2)) {
obj1[k1 + '-' + k2] = obj2[k1][k2];
}
}
}
}
}
var hasObject = false;
for (var key in obj1) {
if (obj1.hasOwnProperty(key)) {
if (typeof obj1[key] === 'object' && obj1[key] !== null) {
hasObject = true;
}
}
}
if (hasObject) {
return flatten(obj1);
} else {
return obj1;
}
} else {
return obj1;
}
}
return myExcelXML;
})();
/**
* Função onde você deve indicar qual o dataset deve ser utilizado como base e quais os campos serão utilizados
* @param dataset ID do Dataset no Fluig
* @param fieldArray campos que devem ser retornados
* @returns o arquivo XLS para download
*/
function carregaDadosJson(dataset, fieldArray) {
let dados = DatasetFactory.getDataset(dataset, fieldArray, null, null);
let myTestXML = new myExcelXML(JSON.stringify(dados.values));
myTestXML.fileName = dataset;
return myTestXML.downLoad();
}
/** Nesse exemplo o objetivo é gerar uma planilha contendo os campos nome, e-mail e colleagueId
* do dataset Colleague */
carregaDadosJson('colleague', new Array('colleagueName', 'mail', 'colleaguePK.colleagueId'));
/** Nesse exemplo o objetivo é gerar uma planilha contendo os
* campos ID da instância do processo, ID do processo e ID do usuário do dataset Colleague */
carregaDadosJson('workflowProcess', ["workflowProcessPK.processInstanceId", "processId", "requesterId",]);
Assinar:
Postar comentários
(
Atom
)

Ajudou muito xD
ResponderExcluir