2

1)我正在尝试使用 NSMutableArray(数组数组)创建 CSV 文件,我想使用 MFMailComposeViewController 将其作为邮件附件发送。以下是我为它编写的代码 -

//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中正确显示数据,但在开放式办公室中却没有, 例如:-

Open Office 输出 帐号
19824:38:00

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

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

提前致谢。

4

2 回答 2

4

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

您创建了许多自动释放的对象。但是因为你的代码是一个巨大的内存分配循环,它在到达当前运行循环的末尾之前就崩溃了,自动创建的自动释放池被耗尽了。

您应该使用自己的自动释放池。而且,正如graver 所指出的,使用NSMutableString 和appendString。这将创建较少占用内存的自动释放对象。并尝试使用 only appendString:, not 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];
}
于 2012-05-24T07:40:59.033 回答
2

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

于 2012-05-24T07:17:32.057 回答