2012-05-30 1 views
9

Sto cercando di creare un report in formato Excel, pronto per essere inviato via email. Finora ho trovato che il modo migliore e più semplice è quello di creare un documento XML come segue e salvarlo come xls.Creazione di file XLS di Excel su iOS

<?xml version="1.0"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> 
    <Worksheet ss:Name="Sheet1"> 
     <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="2" x:FullColumns="1" x:FullRows="1"> 
      <Row> 
       <Cell><Data ss:Type="String">Name</Data></Cell> 
       <Cell><Data ss:Type="String">Example</Data></Cell> 
      </Row> 
      <Row> 
       <Cell><Data ss:Type="String">Value</Data></Cell> 
       <Cell><Data ss:Type="Number">123</Data></Cell> 
      </Row> 
     </Table> 
    </Worksheet> 
</Workbook> 

Poi ho potuto salvare il documento utilizzando

NSArray *documentDirectoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *docDir = [NSString stringWithFormat:@"%@/Report.xls", [documentDirectoryPath objectAtIndex:0]]; 
     [xmlString writeToFile:docDir atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 
     [serializedData writeToFile:docDir atomically:YES]; 

Tuttavia, dopo mando l'e-mail e tenta di aprire il file xls, xml viene visualizzato nel foglio di calcolo, invece. Qualcuno potrebbe per favore guidarmi nella giusta direzione per creare questo file xls?

+1

hmm, per me funziona con Excel 2010 – CarlJ

+0

grazie per il tuo commento! sì, ha funzionato su Excel 2010. tuttavia mostra un errore che il formato del file non corrisponde all'estensione del file. e non si apre in google docs e iwork. quindi penso che il problema potrebbe essere dal documento xml che sto salvando. – ChrisBorg

+0

qualcuno forse conosce un buon modo per creare un documento XML che potrebbe essere supportato anche da Google Spreadsheets e Numbers? – ChrisBorg

risposta

-3

tenta di creare un formato di file CSV, sarà il metodo migliore

0

Prova ad aggiungere il seguente tag speciale nella parte superiore del documento:

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
[...] 

Ho appena provato questo tag con il tuo XML e ha funzionato sul mio computer Windows7: ho salvato il documento come "test.excel.xml" e il tag <?mso...> è stato sufficiente per consentire a Windows di riconoscere il formato come Excel.

V'è un esempio anche qui: http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats

+0

Con l'estensione file .xml questo funziona con Excel 2010 su Windows7. Con Excel 2011 su Mac OSX è necessario utilizzare l'estensione file .xls per lo stesso contenuto del file. Non so di una variante che funzionerebbe su entrambe le piattaforme, sfortunatamente. – pommy

1

Ho provato la stessa cosa del PO, e ha rinunciato. Alla fine ho usato libxls per aprire e leggere i file xls e ho scritto i file usando csv. (libxls non può scrivere xls, basta leggerlo).

http://libxls.sourceforge.net

non l'ho provato, ma xlslib sostiene di scrivere file excel. Ha un aggiornamento 6 Gennaio 2014 dicendo che può funzionare in iOS:

http://sourceforge.net/projects/xlslib/files/

Inoltre, leggere perché è così difficile scrivere file excel, perché è vero e divertente: http://www.joelonsoftware.com/items/2008/02/19.html

0

Questo è il codice per creare il file XLS

NSMutableString *stringToWrite = [[NSMutableString alloc] init]; 
[stringToWrite appendString:[NSString stringWithFormat:@"First Name /t Last Name /t Full Name /tPhone Number /tEmail /t Job/t organizationName /tNote\n\n"]]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     for(int i = 0 ;i<[Contact count];i++)  { 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@/t",[[Contact objectAtIndex:i] valueForKey:@"firstName"] ]]; 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@/t",[[Contact objectAtIndex:i] valueForKey:@"lastName"] ]]; 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@/t",[[Contact valueForKey:@"userName"] objectAtIndex:i]]]; 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@/t",[[Contact objectAtIndex:i] valueForKey:@"phoneNumber"] ]]; 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@/t",[[Contact objectAtIndex:i] valueForKey:@"emailAddress"] ]]; 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@/t",[[Contact objectAtIndex:i] valueForKey:@"jobTitle"] ]]; 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@/t",[[Contact objectAtIndex:i] valueForKey:@"organizationName"] ]]; 
      [stringToWrite appendString:[NSString stringWithFormat:@"%@\n",[[Contact objectAtIndex:i] valueForKey:@"note"] ]]; 
     } 
     dispatch_async(dispatch_get_main_queue(), ^(void) { 
      NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 
      NSString *documentDirectory=[paths objectAtIndex:0]; 
      NSString *strBackupFileLocation = [NSString stringWithFormat:@"%@/%@", documentDirectory,@"ContactList.xls"]; 
      [stringToWrite writeToFile:strBackupFileLocation atomically:YES encoding:NSUTF8StringEncoding error:nil]; 
     }); 
}); 
+0

come circa per rapido? –