The initial render of the grid occurs on a different request to the "export" event. Tapestry does not maintain state between requests (unless you explicitly @Persist which i wouldn't recommend).
Therefore it's perfectly reasonable for the GridDataSource to be invoked once for the initial html render and again for the export.