2016-03-22 10 views
1

Ich habe eine CSV-Datei in meiner Anwendung mit Obj C erstellt und an eine E-Mail angehängt, die sendet. All dies funktioniert gut und wenn der Dateianhang mit OSX geöffnet wird, liest sich der Dateiname wie erwartet; "beispiel.csv"..CSV-Dateien von iOS-Anwendung generiert nicht lesbar in Windows

Wenn ich dies jedoch in Windows versuche, ist die Dateierweiterung nicht mehr sichtbar und die "Datei ist nicht lesbar". Wenn ich den Namen der Datei ändere und am Ende die Datei .csv hinzufüge, wird sie lesbar.

Warum ist die Datei nach dem Herunterladen des Anhangs auf einen Windows-Computer verloren?

Hier ist, wo ich "FilePath" definieren;

NSError *error = nil; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/Jobs"]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]){ 
    [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; 
} 
FilePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"/Jobs/%@.csv",proposalNumber]]; 

Hier ist der Code zum Generieren der .csv-Datei verwendet;

// Creates a temporary GPS object that we will use to save our database as a .CSV file. 
    GPS *saveGPS = [[GPS alloc] init]; 
    @synchronized(FilePath) { 
     [[NSFileManager defaultManager] createFileAtPath:FilePath contents:nil attributes:nil]; 
     // Creates a file handler which will allow us to write to our file. 
     NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingAtPath:FilePath]; 
     // Creates and writes the first line to our CSV file, which tells the program reading it what the column titles are. 
     NSString *csvTitleString [email protected]"Source/Receiver, Latitude, Longitude"; 
     [myHandle writeData:[csvTitleString dataUsingEncoding:NSUTF8StringEncoding]]; 
     // Creates initializes another string object which will hold each line we want to write. 
     NSString *csvString = [[NSString alloc] init]; 
     // Declares an array and fills it with all GPS objects found in our Database. 
     NSArray *allGPS = [[NSArray alloc]initWithArray:[database getAllbyProposal:proposalNumber]]; 
     // While the current index value is less than the length of the array write the GPS values into our file then take a new line. 
     for(int i=0;i <= allGPS.count;i++){ 
      if(i < allGPS.count){ 
       saveGPS = [allGPS objectAtIndex:i]; 
       csvString = [NSString stringWithFormat:@"\n %@ %d, %@, %@", [saveGPS sourceReceiver], [[saveGPS positionNo] intValue], [saveGPS latitude], [saveGPS longitude]]; 
       [myHandle seekToEndOfFile]; 
       [myHandle writeData:[csvString dataUsingEncoding:NSUTF8StringEncoding]]; 
      } 
      else if (i == allGPS.count){ 
       @synchronized(FilePath) { 
        // Checks if the device can send email. 
        if([MFMailComposeViewController canSendMail]){ 
         // Sets the subject to data from (our current proposal number). 
         [mail setSubject:[NSString stringWithFormat:@"Data from %@", proposalNumber]]; 
         [mail setMessageBody:@"Please see the attached .CSV file." isHTML:NO]; 
         // Finds the .CSV file we just saved, and attaches it to the email. 
         NSData *myattachment = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@", FilePath]]; 
         [mail addAttachmentData:myattachment mimeType:@"text/csv" fileName:[NSString stringWithFormat:@"%@",proposalNumber]]; 
         // Opens up the email screen. 
         [self presentViewController:mail animated:YES completion:NULL]; 
        } 
        else 
        { 
         // Creates a popup window to inform the user that their email wasn't able to send. 
         UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Error" 
                         message:@"Unable to send email. Have you set up a mail account on this device?" 
                       preferredStyle:UIAlertControllerStyleAlert]; 
         UIAlertAction* dismissAction = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {}]; 
         alert.view.tintColor = [UIColor orangeColor]; 
         [alert addAction:dismissAction]; 
         [self presentViewController:alert animated:YES completion:nil]; 
        } 
       } 
      } 
     } 
    } 

Antwort

2

In dieser Zeile:

[mail addAttachmentData:myattachment mimeType:@"text/csv" fileName:[NSString stringWithFormat:@"%@",proposalNumber]]; 

Sie die Einstellung der Art Pantomime, aber der Dateiname enthält keine Erweiterung. Mac OS X ist intelligent genug, um herauszufinden, was zu tun ist, indem man den MIME-Typ und möglicherweise den Dateiinhalt betrachtet. Windows ist nicht. Windows ist viel mehr auf die tatsächliche Dateierweiterung angewiesen.

Fügen Sie die Dateierweiterung dem Namen der Datei hinzu, die an die E-Mail angehängt ist.

+0

Beachten Sie, dass iOS die * nix-Konvention für Zeilenumbrüche verwendet, d. H. Es beendet jede Zeile des csv mit einem LF (Zeilenvorschub). Windows erwartet stattdessen CR LF (Wagenrücklauf, Zeilenvorschub). Dies kann zu Problemen beim späteren Import der Daten führen. – Aaganrmu

+0

Danke für die Hilfe, fühle mich ziemlich dumm, diesen Fehler gemacht zu haben! –

0

Sie verwenden die Erweiterung ".xls", nicht csv. Verwenden Sie ".csv" als Ihre Erweiterung.

+0

Das ist ein Fehler, ich habe eine xls-Bibliothek ausprobiert, um eine .xls anstatt einer .csv zu schreiben, um dieses Problem zu lösen und vergessen, es zurück zu ändern, danke für die Erinnerung. –

Verwandte Themen