J'essaie d'exporter mes tables vers PDF avec une largeur de 100%. J'ai essayé ce qui suit mais j'ai échoué
var settings={};
settings.buttons = [
{
extend:'pdfHtml5',
text:'Export PDF',
orientation:'landscape',
customize : function(doc){
doc.styles['table'] = { width:100% }
}
}
];
$('.dTable').dataTable(settings);
J'ai trouvé un moyen plus simple et plus rapide de le faire.
{
extend: 'pdf',
customize: function (doc) {
doc.content[1].table.widths =
Array(doc.content[1].table.body[0].length + 1).join('*').split('');
}
}
Ce qui se passe ici est le suivant:
doc.content[1].table.widths
Est un tableau de largeurs pour chaque colonne, et si chacune d'entre elles est un '*'
Cela signifie que le tableau s'adaptera à 100% de la page avec les colonnes réparties uniformément.
Array(doc.content[1].table.body[0].length + 1)
crée un tableau dans la longueur de toutes les colonnes de ma table.
.join('*')
crée une chaîne à partir de toutes les cellules du tableau avec un '*'
pour chacune.
.split('');
le divise en un tableau.
J'espère que j'ai aidé quelqu'un en cours de route.
Après avoir creusé et creusé, j'ai constaté que vous devez simplement ajouter une largeur de '*' pour chacune des colonnes. J'ai créé une fonction simple afin de créer un tableau basé sur le nombre de balises td et inclus une vérification colspan.
var tbl = $('.dTable');
var settings={};
settings.buttons = [
{
extend:'pdfHtml5',
text:'Export PDF',
orientation:'landscape',
customize : function(doc){
var colCount = new Array();
$(tbl).find('tbody tr:first-child td').each(function(){
if($(this).attr('colspan')){
for(var i=1;i<=$(this).attr('colspan');$i++){
colCount.Push('*');
}
}else{ colCount.Push('*'); }
});
doc.content[1].table.widths = colCount;
}
}
];
$('.dTable').dataTable(settings);
customize : function(doc){
var colCount = new Array();
var length = $('#reports_show tbody tr:first-child td').length;
console.log('length / number of td in report one record = '+length);
$('#reports_show').find('tbody tr:first-child td').each(function(){
if($(this).attr('colspan')){
for(var i=1;i<=$(this).attr('colspan');$i++){
colCount.Push('*');
}
}else{ colCount.Push(parseFloat(100 / length)+'%'); }
});
}
Cela fonctionne dans mon cas. Il compte le nombre de balises de données dans l'en-tête. Ensuite, il attribue une largeur de 100/(pas de balises de données) à chacune des balises de données.
var dtTbl = tbl.DataTable({
dom: 'Bt',
buttons: [{
extend: "pdfHtml5",
title: "Report",
customize: function(doc) {
console.log(doc.content)
doc.content.splice(0, 0, {
margin: [12, 0, 0, 12],
alignment: "center",
});
doc.content[2].table.widths = ["*", "*", "*"];
}]
})
C'est ce que j'ai fait et cela a fonctionné. Je n'ai que 3 en-têtes, j'ai donc inséré trois astérisques dans les largeurs de table.
Vous pouvez choisir la taille souhaitée pour chaque colonne et les laisser s'adapter à l'espace dont vous avez besoin. Vous avez juste besoin de faire quelques réglages:
"doc.content[1].table.widths = [90,90,90,90,90,90,90,90]; " : {
extend: 'pdfHtml5',
orientation: 'landscape',//orientamento stampa
pageSize: 'A4', //formato stampa
alignment: "center", //non serve a nnt ma gli dice di stampare giustificando centralmente
titleAttr: 'PDF', //titolo bottone
exportOptions: {// quali colonne vengono mandate in stampa (indice posizionale)
columns: [ 1,2,3,4,5,6,7,8 ]
},
customize : function(doc){
doc.styles.tableHeader.alignment = 'left'; //giustifica a sinistra titoli colonne
doc.content[1].table.widths = [90,90,90,90,90,90,90,90]; //costringe le colonne ad occupare un dato spazio per gestire il baco del 100% width che non si concretizza mai
}
}
Vous devriez chercher où il est dit t.table.widths dans le fichier 'pdfmake.js' et changer la valeur en '*'.
t.table.widths = "*"
Ce travail excellent ... Est adaptable. Édité pour moi. Modifiez la classe (.Datatable) pour l'ID ou la classe de votre table
customize: function(doc) {
var colCount = new Array();
var tr = $('.DataTable tbody tr:first-child');
var trWidth = $(tr).width();
var length = $('.DataTable tbody tr:first-child td').length;
$('.DataTable').find('tbody tr:first-child td').each(function() {
var tdWidth = $(this).width();
var widthFinal = parseFloat(tdWidth * 115);
widthFinal = widthFinal.toFixed(2) / trWidth.toFixed(2);
if ($(this).attr('colspan')) {
for (var i = 1; i <= $(this).attr('colspan'); $i++) {
colCount.Push('*');
}
} else {
colCount.Push(parseFloat(widthFinal.toFixed(2)) + '%');
}
});
doc.content[1].table.widths = colCount;
}