An analysis of the ice:dataExporter component revealed that the component assumes that the exporting action will be triggered only once in the view. This means that after triggering the exporting action in the server, the exporter button/link changes its state to load the URL of the generated resource in a new popup window to deal past popup blockers. The button never goes back to its initial state where it could trigger a new exporting action. A simple test of modifying the javascript was carried out to make the button go back to its initial state after a second click. While the button did trigger a new exporting action, the component in the server didn't clear the reference to the previous resource. While it would be relatively easy to make the component refresh its reference to the previously generated resource, another issue remains: If after clicking the button for the first time and getting the browser's warning message, the user decides to download the file by selecting the appropriate option in this warning message, the user would still have to click the button again (and download the file again) to make the button go back to its initial state. The button and the server side code don't have a way of knowing if the resource was downloaded by selecting one of the options presented in the warning message of the browser. Therefore, a more elaborate structural change is necessary. Probably, it would be convenient to implement the same file-delivering mechanism used in the newer ace:dataExporter component, which doesn't require the user to click twice the same button and doesn't use popup windows (except in IE7 and older versions). This mechanism also doesn't cause browsers to display warning messages and the component object doesn't cache the resource objects.
This issue is not only limited to toggling visible columns. This is also valid if data in the table is dynamic and gets changed on user actions or by server push!. So, the key here would be clearing cached file after each export - as mentioned in the Description's last line.