2012-05-24 12 views
2

1)我试图使用NSMutableArray(array of array)创建CSV文件,我想使用MFMailComposeViewController作为邮件附件发送。后面是代码i已经写了它 -iOS应用程序在创建数据量过大的csv文件时崩溃

//Export Data to excel 
-(NSString*)ExportToExcelClicked 
{ 
    dataToSend = @""; 

@try { 

    for(int cntHeader = 0;cntHeader< [NamesArray count];cntHeader++) 
    { 

     dataToSend = [NSString stringWithFormat:@"%@%@\n",dataToSend,[NamesArray objectAtIndex:cntHeader]]; 
     dataToSend = [NSString stringWithFormat:@"\nAccount Number,Engine Number,Chasssis Number,Registration,Vehicle Type,Vehicle Model,Vehicle Make\n"]; 

     for(int cntData = 0;cntData< [appDelegate.arrEmailRepossessionDetail count];cntData++) 
     { 

      NSMutableArray *thearr = [appDelegate.arrEmailRepossessionDetail objectAtIndex:cntData]; 

      NSString *strVehicleDetail = @""; 

      strVehicleDetail = [NSString stringWithFormat:@"%@%@,",strVehicleDetail,[thearr objectAtIndex:0]]; 
      strVehicleDetail = [NSString stringWithFormat:@"%@%@,",strVehicleDetail,[thearr objectAtIndex:1]]; 
      strVehicleDetail = [NSString stringWithFormat:@"%@%@,",strVehicleDetail,[thearr objectAtIndex:2]]; 
      strVehicleDetail = [NSString stringWithFormat:@"%@%@,",strVehicleDetail,[thearr objectAtIndex:3]]; 
      strVehicleDetail = [NSString stringWithFormat:@"%@%@,",strVehicleDetail,[thearr objectAtIndex:4]]; 
      strVehicleDetail = [NSString stringWithFormat:@"%@%@,",strVehicleDetail,[thearr objectAtIndex:5]]; 
      strVehicleDetail = [NSString stringWithFormat:@"%@%@,",strVehicleDetail,[thearr objectAtIndex:6]]; 

      dataToSend = [NSString stringWithFormat:@"%@%@\n",dataToSend,strVehicleDetail]; 
     } 

    dataToSend = [NSString stringWithFormat:@"%@\n\n",dataToSend]; 
    return dataToSend; 

} 

}    

@catch (NSException *exception) { 
    NSLog(@"NSException: %@", exception.reason); 
} 

}

代码邮件附件

NSString *strCSVData = [self ExportToExcelClicked]; 

     if ([strCSVData isEqualToString:@""] || strCSVData.length > 0) 
     { 
      NSData *dataObj = [strCSVData dataUsingEncoding:NSUTF8StringEncoding]; 
     } 

问题是csv文件正在为大约800到900条记录正确创建,但超出 该应用程序正在崩溃。是否有效率是创建csv记录。

2)另外,csv文件正确的Excel中而不是在开放式办公室中显示数据 如: -

开放式办公输出 帐号
19824:38:00

Excel输出(预期输出) 帐号 019465:021578

不明白为什么OpenOffice的没有显示正确的输出。

在此先感谢。

回答

2

您绝对需要将您的dataToSend实例变量更改为NSMuableString类型,并且只将数据追加到它。你现在这样做,每次都会创建一个新的字符串,但是NSMutableString只会追加它。

+0

感谢刻刀你right.Creating一个新字符串绝对不是一个有效的way.Will尝试代码的NSMutableString。 – niks

+0

对于for循环中的strVehicleDetail做同样的事情... – graver

4

很有可能您的应用程序内存不足。

您创建了大量的自动释放对象。但是因为你的代码是一个巨大的内存分配循环,它会在它到达当前runloop的末尾时崩溃,在这个循环中自动创建的autorelease池被耗尽。

您应该使用自己的autorelease pool。而且,正如Graver指出的那样,使用NSMutableString和appendString。这将创建占用内存的较少的自动释放对象。 并尝试仅使用appendString:而不是appendFormat:,解析格式需要时间和内存。

大概是这样的:

NSMutableString *dataToSend = [NSMutableString stringWithCapacity:10000]; // put your own estimate, based on the usual length of a data row and the number of rows 

[dataToSend appendString:[namesArray objectAtIndex:cntHeader]]; 
[dataToSend appendString:@"\n\nAccount Number,Engine Number,Chasssis Number,Registration,Vehicle Type,Vehicle Model,Vehicle Make\n"]; 
for(int cntData = 0;cntData< [appDelegate.arrEmailRepossessionDetail count];cntData++) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSMutableArray *thearr = [appDelegate.arrEmailRepossessionDetail objectAtIndex:cntData]; 
    for (NSInteger i = 0; i < [thearr count]; i++) { 
     // loop for the columns 
     if (i > 0) { 
      // put , before each column that is not the first column 
      [dataToSend appendString:@","]; 
     } 
     [dataToSend appendString:[thearr objectAtIndex:i]]; 
    } 
    [dataToSend appendString:@"\n"]; 

    [pool drain]; 
} 
+0

@ Mathhias,谢谢你的建议真的有用......现在它真的有效地工作了...... – niks

相关问题