Hola estoy intentando exportar a excel una tabla que esta en HTML, tengo columnas numericas con formato "0.00", pero al exportar no sale con el formato que le he puesto.
dejo mi codigo que uso para exportar mi tabla html:
exportTableToExcel('tbResumenExcel');
function exportTableToExcel(tableID, filename = '') {
var downloadLink;
var dataType = 'application/vnd.ms-excel';
var tableSelect = document.getElementById(tableID);
var tableHTML = tableSelect.outerHTML.replace(/ /g, '%20');
// Specify file name
filename = filename ? filename + '.xls' : 'excel_data.xls';
// Create download link element
downloadLink = document.createElement("a");
document.body.appendChild(downloadLink);
if (navigator.msSaveOrOpenBlob) {
var blob = new Blob(['ufeff', tableHTML], {
type: dataType
});
navigator.msSaveOrOpenBlob(blob, filename);
} else {
// Create a link to the file
downloadLink.href = 'data:' + dataType + ', ' + tableHTML;
// Setting the file name
downloadLink.download = filename;
//triggering the function
downloadLink.click();
}
}
Hola,
Lo que estás haciendo es el truco clásico de exportar la tabla HTML tal cual, con extensión .xls, y dejar que Excel la abra interpretándola como si fuera un archivo suyo. El problema es que, al ser HTML puro, Excel decide por su cuenta cómo mostrar cada número según su configuración regional, ignorando el formato visual que le hayas puesto con CSS.
La solución es indicarle explícitamente el formato a Excel usando una propiedad CSS propietaria de Microsoft Office que solo entiende Excel, mso-number-format, añadida como estilo inline en cada celda antes de exportar:
function prepararFormatoExcel(tableID) {
var celdas = document.querySelectorAll('#' + tableID + ' td.numero');
celdas.forEach(function (celda) {
celda.setAttribute('style', "mso-number-format:'0\.00';");
});
}
function exportTableToExcel(tableID, filename = '') {
prepararFormatoExcel(tableID);
var downloadLink;
var dataType = 'application/vnd.ms-excel';
var tableSelect = document.getElementById(tableID);
var tableHTML = tableSelect.outerHTML.replace(/ /g, '%20');
filename = filename ? filename + '.xls' : 'excel_data.xls';
downloadLink = document.createElement("a");
document.body.appendChild(downloadLink);
if (navigator.msSaveOrOpenBlob) {
var blob = new Blob(["\ufeff", tableHTML], { type: dataType });
navigator.msSaveOrOpenBlob(blob, filename);
} else {
downloadLink.href = 'data:' + dataType + ', ' + tableHTML;
downloadLink.download = filename;
downloadLink.click();
}
}
Dos cosas importantes para que esto funcione de verdad:
1. Tienes que añadir la clase numero (o el nombre que prefieras) a las celdas <td> que contienen valores numéricos en tu HTML, para que prepararFormatoExcel sepa cuáles tocar.
2. El contenido de esas celdas tiene que ser el número «en crudo» (por ejemplo 1234.5), no una cadena ya formateada a mano tipo "1.234,50". Si el texto ya viene formateado con separadores de miles o coma decimal, Excel lo trata como texto en vez de número, y mso-number-format no tiene efecto porque no hay ningún valor numérico real al que aplicarlo. Deja que sea Excel quien decida cómo pintarlo, tú solo dile el formato.
Un saludo,
David Carrero