I would suggest exporting to excel and then have them save as CSV. Here is some client side code I wrote to override the "Export to Excel" button on the ribbon(just the Excel part). It takes xml, but might make a good starting point.
openExcel = function(xmlDoc){
var Excel = new ActiveXObject("Excel.Application"),
book,
map,
range,
listObj;
Excel.DisplayAlerts = false;
Excel.Visible = true;
book = Excel.Workbooks.Add();
map = book.XMLMaps.Add(xmlDoc);
range = book.ActiveSheet.Range("A1","I1").Select();
listObj = book.ActiveSheet.ListObjects.Add();
listObj.ListColumns(1).XPath.SetValue(map, "/Users/User/@PreferredName");
listObj.ListColumns(2).XPath.SetValue(map, "/Users/User/@AccountName");
listObj.ListColumns(3).XPath.SetValue(map, "/Users/User/@EmployeeNumber");
listObj.ListColumns(4).XPath.SetValue(map, "/Users/User/@Title");
listObj.ListColumns(5).XPath.SetValue(map, "/Users/User/@Office");
listObj.ListColumns(6).XPath.SetValue(map, "/Users/User/@Manager");
listObj.ListColumns(7).XPath.SetValue(map, "/Users/User/@ManagerAccountName");
listObj.ListColumns(8).XPath.SetValue(map, "/Users/User/@ManagerTitle");
listObj.ListColumns(9).XPath.SetValue(map, "/Users/User/@ManagerEmployeeNumber");
listObj.ListColumns(1).Name = "Name";
listObj.ListColumns(2).Name = "Account Name";
listObj.ListColumns(3).Name = "Employee Number";
listObj.ListColumns(4).Name = "Title";
listObj.ListColumns(5).Name = "Office";
listObj.ListColumns(6).Name = "Manager";
listObj.ListColumns(7).Name = "Manager Account Name";
listObj.ListColumns(8).Name = "Manager Title";
listObj.LIstColumns(9).Name = "Manager Employee Number";
book.XmlImportXml(xmlDoc, map,range);
}