2

1) MFMailComposeViewController.Followingを使用してメールの添付ファイルとして送信したいNSMutableArray(配列の配列) を使用して 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];
        }

問題は、約 800 ~ 900 レコードの csv ファイルが適切に作成されていることですが、それを超えるとアプリケーションがクラッシュします。csv レコードを作成するのに効率的な方法はありますか。

2) また、csv ファイルはExcel ではデータを正しく表示していますが、オープン オフィスでは表示していません

オープンオフィス出力 口座番号
19824:38:00

Excel出力(期待出力) 口座番号 019465:021578

OpenOfficeが適切な出力を表示しない理由を理解できません。

前もって感謝します。

4

2 に答える 2

4

ほとんどの場合、アプリのメモリが不足しています。

多くの自動解放オブジェクトを作成します。しかし、コードは巨大なメモリ割り当てループであるため、現在の実行ループの最後に到達する前にクラッシュし、自動作成された自動解放プールが空になります。

独自の自動解放プールを使用する必要があります。そして、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];
}
于 2012-05-24T07:40:59.033 に答える
2

dataToSendインスタンス変数をタイプに変更し、NSMuableStringデータのみを追加する必要があります。現在の方法では、毎回新しい文字列を作成しますが、NSMutableString追加するだけです。

于 2012-05-24T07:17:32.057 に答える