需求
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是可以用,添加到自己项目就编译失败,可能是自己工程配置有问题,有知道咋回事可以告知一下
网友评论