iOS - 解析Excel

需求

1.读取Excel文件内容
2.获取Excel第一行字段名
3.根据某个字段获取某列

如需从其他地方读取,请参考从微信,QQ,iCloud读取文件
网上一顿查找资料,大神demo
能实现xls,xlsx,csv格式数据解析

实现

1.读取Excel文件内容

解析后得到一个数组

2.获取Excel第一行字段名

遍历数组,筛选keyName(单元格位置)最后一个字符为“1”的数据,且“1”之前的字符必须为纯字母,需考虑以下情况(A1,AA1,A11,AA11)

//获取第一行 arr:全部数据  sheetName:表名称
+ (NSArray *)getFirstLineWith:(NSArray *)arr sheetName:(NSString *)sheetName{
    NSMutableArray *tepArr = [NSMutableArray array];

    for (int i =0 ; i < arr.count; i++) {
        ZContent *content = arr[i];
        NSString *head = [content.keyName substringWithRange:NSMakeRange(0, content.keyName.length-1)];
        NSString *foot = [content.keyName substringWithRange:NSMakeRange(1, 1)];
        if ([self checkCapitalLetterWith:head] && [foot isEqualToString:@"1"] && [content.sheetName isEqualToString:sheetName]) {
            [tepArr addObject:content];
        }
    }
//   排序 按照从小到大排序
    [tepArr sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        ZContent *content1 = (ZContent *)obj1;
        ZContent *content2 = (ZContent *)obj2;
        NSString *str1 = [content1.keyName substringWithRange:NSMakeRange(0, content1.keyName.length-1)];
        NSString *str2 = [content2.keyName substringWithRange:NSMakeRange(0, content2.keyName.length-1)];
        if ([str1 characterAtIndex:0]  > [str2 characterAtIndex:0] ) {
            return YES;
        }else{
            return NO;
        }
    }];
    return tepArr;

}

3.根据某个字段获取某列

//获取某列
+ (NSArray *)getColumnWith:(NSArray *)arr sheetName:(NSString *)sheetName index:(NSString *)keyName{
    NSMutableArray *tepArr = [NSMutableArray array];
      //获取列标号,考虑以下情况(A1,AA1,A11,AA11)
    NSString *column = @""; 
    for(int i =0; i < [keyName length]; i++){
        NSString *tep = [keyName substringWithRange:NSMakeRange(i, keyName.length-i)];
        if ([self checkJustNumberWith:tep]) {
            column = [keyName substringWithRange:NSMakeRange(0, i)];// A1   AA1  A11  AA11
        }
    }
     //筛选对应列
    for (int i =0 ; i < arr.count; i++) {
        ZContent *content = arr[i];
        NSString *head = [content.keyName substringWithRange:NSMakeRange(0, column.length)];
        NSString *foot = [content.keyName substringWithRange:NSMakeRange(column.length, content.keyName.length-column.length)];
        if ([head isEqualToString:column] && [self checkJustNumberWith:foot] && [content.sheetName isEqualToString:sheetName]) {
            [tepArr addObject:content];
        }
    }
    //   排序
    [tepArr sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        ZContent *content1 = (ZContent *)obj1;
        ZContent *content2 = (ZContent *)obj2;
        NSString *str1 = [content1.keyName substringWithRange:NSMakeRange(column.length, content1.keyName.length-column.length)];
        NSString *str2 = [content2.keyName substringWithRange:NSMakeRange(column.length, content2.keyName.length-column.length)];
        if ([str1 integerValue] > [str2 integerValue]) {
            return YES;
        }else{
            return NO;
        }
    }];
    return tepArr;
}

需求完成,收工干饭

待完善点

1.筛选数据时候直接插入数组对应位置,这样就不用进行排序操作(是否更节省时间?)
2.分离表数据,减少遍历数组次数
3.xls格式解析不了,因DHxlsReader添加libiconv.2.dylib库后无法编译,demo是可以用,添加到自己项目就编译失败,可能是自己工程配置有问题,有知道咋回事可以告知一下

你可能感兴趣的:(iOS - 解析Excel)