I have created a batch that will copy some event fields to a csv and attach it to an email. The problem I have is that I failed to replicate some characters (• bullet point, in this case) from the actual data. Is it possible to do it in the csv and if so, how?
Note: I have tried making a report in salesforce and exported the same data to csv using Unicode (UTF-8)and it has the same issue.
Here is my code:
public class AS_batchCsvCreator implements Database.Batchable<sObject>, Database.Stateful{
public String THECSVDATA ='';
public AS_batchCsvCreator() {
THECSVDATA += 'Id,Subject,Description \n';
}
public Database.QueryLocator start(Database.BatchableContext BC) {
return Database.getQueryLocator('Select Id,Subject,Description from Event');
}
public void execute(Database.BatchableContext BC, List<Event> scope) {
for(Event evnt : scope){
List<String> csvRow = new List<String>();
csvRow.add((String.valueOf(evnt.Id) != null)?String.valueOf(evnt.Id):'');
csvRow.add((String.valueOf(evnt.Subject) != null)?String.valueOf(evnt.Subject):'');
csvRow.add((String.valueOf(evnt.Description) != null)?String.valueOf(evnt.Description):'');
String appData = listToCSVStringConverter(csvRow);
THECSVDATA += appData;
THECSVDATA += '\n';
}
}
public void finish(Database.BatchableContext BC) {
AsyncApexJob batchResult = [Select Id, Status, NumberOfErrors, JobItemsProcessed,
TotalJobItems, CreatedBy.Email, ExtendedStatus from AsyncApexJob where Id = :bc.getJobId()];
try {
Messaging.EmailFileAttachment csvAttachment = new Messaging.EmailFileAttachment();
Blob csvBlob = blob.valueOf(THECSVDATA);
String csvName = 'Test.csv';
csvAttachment.setFileName(csvName);
csvAttachment.setBody(csvBlob);
Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {batchResult.CreatedBy.Email};
String subject = 'Event CSV)';
email.setSubject(subject);
email.setToAddresses(toAddresses);
email.setPlainTextBody('Attached is the event csv.');
email.setFileAttachments(new Messaging.EmailFileAttachment[]{csvAttachment});
Messaging.SendEmailResult[] r = Messaging.sendEmail(new Messaging.SingleEmailMessage[]{email});
} catch(Exception ex) {
}
}
public static String listToCSVStringConverter(List<String> theString) {
String returnString = '';
for(String newStr : theString) {
returnString += newStr.escapeCsv()+',';
}
return returnString;
}
}
