In order to display the timeline, the visual option needs to be set to true, but when exporting to Excel with the visual option set to true, this error occurs.
error message: Internal server error. Error: Gantt to Excel. TypeError: excelRefs variable sent to mergeCells function must be an array with length > 0
The code I executed is as follows, and generally, when the visual value is not set, everything except the timeline is displayed correctly.
code: gantt.exportToExcel({
name: ,
server: ,
local: ,
columns: customComlumns,
cellColors: true,
data: customData,
visual: true
})
Hello,
This is a known issue, and over time, the developers will resolve it. In the meantime, I can suggest a workaround: Simulate “task loading” by extending the timeline, obtain the cell numbers for the $start and $end parameters, export the data, and then restore the initial date range:
function exportData() {
// Backup the original date range
const backupStartDate = gantt.copy(gantt.config.start_date);
const backupEndDate = gantt.copy(gantt.config.end_date);
// Get tasks within the current date range
const tasks = gantt.copy(gantt.getTaskByTime());
const json = tasks.map(task => {
task.text += "_mod";
return task;
});
// Calculate min and max date range based on tasks
let minDate = gantt.date.add(json[0].start_date, -2, 'day');
let maxDate = gantt.date.add(json[0].end_date, 2, 'day');
json.forEach(task => {
if (+task.start_date < +minDate) minDate = new Date(task.start_date);
if (+task.end_date > +maxDate) maxDate = new Date(task.end_date);
});
// Update Gantt date range
gantt.config.start_date = minDate;
gantt.config.end_date = maxDate;
gantt.render();
// Map task data for export
json.forEach(task => {
task.$start = gantt.getScale().trace_indexes[+task.start_date];
task.$end = gantt.getScale().trace_indexes[+task.end_date];
task.$type = task.type || 'task';
task.$text = task.text;
});
// Export to Excel
gantt.exportToExcel({
visual: true,
columns: [
{ id: "text", header: "Action" },
{ id: "start_date", header: "Start date", type: "date" },
{ id: "end_date", header: "End date", type: "date" },
{ id: "duration", header: "Duration" },
{ id: "owner", header: "Who" },
{ id: "progress", header: "% Done", type: "number" }
],
data: json
});
// Restore original date range
gantt.config.start_date = backupStartDate;
gantt.config.end_date = backupEndDate;
gantt.render();
}
You can see a working example here: DHTMLX Snippet Tool