excel ios
2014-05-13 01:58:23 u013936810 阅读数 1581

项目中需要用到.xls文件,作为输出文件。

通常.net或者c#会好做一点,但是没办法,需要要在iPad上面导出,那就导出吧。

翻了一遍网上的库,觉得还是比较少见,而且也不是中文,所以就用别人的库,顺便自己写了个拓展来方便调用。

先给出人家库的主人xlslib(这里说一句,人家从08年一直维护和回答大家的提问直到现在真的不容易,支持这样的开发者)

现在开始正题:

这个库是独立的,截图如下:

为了方便调用,我自己写了一个拓展GGxls

大家在调用的时候直接调用就行(推荐自己增加类方法,更加直观,作者的原生代码请看mytest方法)

	[[GGxls singleton] saveDemoData];
说道这里就从这个示例方法开始说吧。

	self.dhWorkbook = [DHWorkBook new];
    	[self createandNamedSheet:@"工作表1"];
首先需要定义workBook和workSheet

	[self.dhWorksheet width:4580 col:n format:NULL];
然后是开始规划xls的表格,这里是设置第n行的宽为4580。

   	 for (int i = 0; i <4; i++) {
   	     [self.dhWorksheet height:340 row:i format:NULL];
   	 }
这里是设置高度,通常高度都是一致的所以就省点功夫了。(经过我的测试,这里的单位大概是毫米,但是又比毫米少一点点,很奇怪。但是大家基本可以用毫米来定位你的表格形态)

	NSArray *arr = @[@"现场检核",@"总分",@"得分",@"得分率",@"总数",@"达标数",@"达标率"];
   	for (int i = 0; i <7; i++) {
   	    [self titlecell:self.cell andtext:[arr objectAtIndex:i] andcolor:30 andRow:0 andCol:i];
   	}
这里就是设置带颜色的title。这里要说一点,颜色并不是自定义的,作者做了一个颜色表的枚举。分别对应下图中间的50种颜色。

[self contentcell:self.cell andtext:@"项目1" andRow:1 andCol:0];
这句就是设置普通内容的方法示例。(这里写好的方法都设置了黑色全边框,如果需要对边框进行操作的童鞋请自己查看源代码)。

然后这个xls就导出得差不多了。

成品图

项目文件由于不知道怎么在csdn上传整个项目,所以就借用了自己的百度网盘(我真不是在打广告)http://pan.ba idu.com/s/1ntmb68x

最后希望能够帮到大家,很久没写文章,文笔不畅,逻辑不通,望见谅。








2017-05-20 16:26:00 weixin_34038652 阅读数 5

最近做一个详情页的时候 需求给了一个展示商品属性的页面

如下

1315745-0efd2b4afa37f42f.png

我明明记得淘宝以前就是张图片  然后找需求商量 不同意 。 无奈只能自己做了。

我使用的是UIcollectionView 做的   使用的是系统自带的布局  没有自定义

以下是我写的demo

第一步 添加宏定义

#define MAIN_TEXT_COLOR                    0x333333

//当前设备宽度

#define ScreenWidth [[UIScreen mainScreen] bounds].size.width

//当前设备高度

#define ScreenHeight [[UIScreen mainScreen] bounds].size.height

//Color

#define RGB(r, g, b)                        [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]

#define RGBA(r, g, b, a)                    [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]

#define HEXCOLOR(c)                        [UIColor colorWithRed:((c>>16)&0xFF)/255.0 green:((c>>8)&0xFF)/255.0 blue:(c&0xFF)/255.0 alpha:1.0]

//用于分割线颜色使用

#define DIVIDING_LINE_COLOR                0xe5e5e5

//以iPhone6s为参照 6P上使用6s 的大小

#define ADJUSTFONT_VALUE(value) (((ScreenWidth > 375 ? 375:ScreenWidth)) / 375 * value )

第二步:创建数据模型 model  命名为LZYAttributeModel

头文件内容如下

#import#import@interface LZYAttributeModel : NSObject

/**

key 属性描述

*/

@property (nonatomic ,strong)NSString *keyString;

/**

value 值描述

*/

@property (nonatomic ,strong)NSString *valueString;

/**

组合结果

*/

@property (nonatomic ,strong)NSString *textContent;

/**

获取当前cell大小

*/

@property (nonatomic, assign)CGSize size;

/**

几倍大小 (一 二 三)

*/

@property (nonatomic ,assign)NSInteger sizeNumber;

@end


模型 .m内容如下

#import "LZYAttributeModel.h"

@implementation LZYAttributeModel

- (NSString *)textContent {

if (_textContent.length == 0) {

_textContent = [NSString stringWithFormat:@"%@: %@",_keyString,_valueString];

}

return _textContent;

}

- (CGSize)size {

if (_size.width < 1) {

NSDictionary *attrs = @{NSFontAttributeName : [UIFont systemFontOfSize:ADJUSTFONT_VALUE(11)]};

CGSize size = [self.textContent sizeWithAttributes:attrs];

if ((size.width + 20) < (ScreenWidth - 20 - 4) / 3) {

_sizeNumber = 1;

_size = CGSizeMake((ScreenWidth - 20 - 4) / 3, 130 / 5 - 1);

}

else if ((size.width + 20) < ((ScreenWidth - 20 - 4) / 3 * 2 + 1)) {

_sizeNumber = 2;

_size = CGSizeMake((ScreenWidth - 20 - 4) / 3 * 2 + 1, 130 / 5 - 1);

}

else {

_sizeNumber = 3;

_size = CGSizeMake((ScreenWidth - 20 - 4) / 3 * 3 + 2, 130 / 5 - 1);

}

}

return _size;

}

@end


第三步:

创建cell 

#import/**

基础参数 cell

*/

@interface LZYRVBrandBasicCollectionViewCell : UICollectionViewCell

/**

title

*/

@property (nonatomic ,strong)UILabel *titleLabel;

@end


//.m 

- (id)initWithFrame:(CGRect)frame {

self = [super initWithFrame:frame];

if (self) {

self.contentView.backgroundColor = [UIColor whiteColor];

self.titleLabel = [[UILabel alloc]init];

self.titleLabel.textAlignment = NSTextAlignmentLeft;

self.titleLabel.numberOfLines = 1;

self.titleLabel.textColor = HEXCOLOR(MAIN_TEXT_COLOR);

self.titleLabel.font = [UIFont systemFontOfSize:ADJUSTFONT_VALUE(11)];

[self.contentView addSubview:self.titleLabel];

[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {

make.centerY.equalTo(self.contentView);

make.left.mas_equalTo(10);

make.right.equalTo(self.contentView.mas_right).offset(-10);

}];

}

return self;

}

@end


第四步 主控制器

#import/** 基本信息 view */@interface LZYRVBrandBasicParametersView : UIView/**

数据源 传入一个数组

*/

@property (nonatomic,strong)NSMutableArray *soureArr;

/**

用于设置view大小  先传递数据源 然后这个才会有值 宽度是当前屏幕宽度 只返回高度  使用者被动接受 防止数据未布局完成 就调用

*/

@property (nonatomic, copy) void (^heightBlock)(float height);

- (instancetype)initWithFrame:(CGRect)frame WithSourceArr:(NSMutableArray *)arr;

@end

主控制器内容

#import "LZYRVBrandBasicParametersView.h"

#import "LZYRVBrandBasicCollectionViewCell.h"

#import "LZYAttributeModel.h"

#import "View+MASAdditions.h"

@interface LZYRVBrandBasicParametersView ()

@property (nonatomic, strong)UICollectionView *collectionView;

/**

用于保存上一次计算的位置信息 防止重复计算

*/

@property (nonatomic, assign)int lastNumber;

/**

用于存放当前位置

*/

@property (nonatomic, assign)int blockViewNumber;

@end

@implementation LZYRVBrandBasicParametersView

- (instancetype)initWithFrame:(CGRect)frame WithSourceArr:(NSMutableArray *)arr {

if (self = [super initWithFrame:frame]) {

self.lastNumber = 0;

self.blockViewNumber = 0;

self.backgroundColor = [UIColor clearColor];

UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new];

layout.minimumLineSpacing = 1;

layout.minimumInteritemSpacing = 1;

self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(10, 13, ScreenWidth - 20, frame.size.height - 14 - 11) collectionViewLayout:layout];

self.collectionView.backgroundColor = HEXCOLOR(DIVIDING_LINE_COLOR);

self.collectionView.delegate = self;

self.collectionView.dataSource = self;

self.collectionView.scrollsToTop = NO;

self.collectionView.showsVerticalScrollIndicator = NO;

self.collectionView.showsHorizontalScrollIndicator = NO;

[self.collectionView registerClass:[LZYRVBrandBasicCollectionViewCell class] forCellWithReuseIdentifier:@"LZYRVBrandBasicCollectionViewCell"];

self.collectionView.scrollEnabled = NO;

[self addSubview:self.collectionView];

[self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.mas_equalTo(10);

make.top.mas_equalTo(13);

make.right.mas_equalTo(self.mas_right).offset(-10);

make.bottom.equalTo(self.mas_bottom).offset(- 12);

}];

_soureArr = [[NSMutableArray alloc]initWithArray:arr];

[self.collectionView reloadData];

}

return self;

}

#pragma mark - UICollectionViewDataSource

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{

return self.soureArr.count ;

}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

LZYAttributeModel *model = self.soureArr[indexPath.row];

NSString *width = [NSString stringWithFormat:@"%.2lf",model.size.width];

return CGSizeMake([width floatValue] - 0.01, model.size.height);

}

//定义每个UICollectionView 的边距

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {

return UIEdgeInsetsMake ( 1 , 1 , 1 , 1 );

}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

LZYRVBrandBasicCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LZYRVBrandBasicCollectionViewCell" forIndexPath:indexPath];

LZYAttributeModel *model = self.soureArr[indexPath.row];

if (model.keyString.length) {

cell.titleLabel.text = model.textContent;

}

else {

cell.titleLabel.text = @" ";

}

return cell;

}

//选中处理

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

}

- (void)setSoureArr:(NSMutableArray *)soureArr {

_soureArr = [[NSMutableArray alloc]initWithArray:soureArr];

self.lastNumber = 0;

self.blockViewNumber = 0;

[self sortArrWithArr:_soureArr];

}

- (void)sortArrWithArr:(NSMutableArray *)soureArr {

//用于存放出现位子

NSInteger typeNumber = -1;

self.blockViewNumber = 0;

//筛选数据 防止出现空的字符

for (int i = 0; i < self.soureArr.count; i++) {

LZYAttributeModel *model = self.soureArr[i];

//二倍大小

if (model.size.width == ((ScreenWidth - 20 - 4) / 3 * 2 + 1)) {

if (self.blockViewNumber % 3 == 2) {

typeNumber = i;

break;

}

else if (self.blockViewNumber % 3 == 1) {

LZYAttributeModel *model1 = self.soureArr[i - 1];

if (model1.size.width == ((ScreenWidth - 20 - 4) / 3 * 2 + 1)) {

typeNumber = i;

break;

}

}

}

//三倍大小

else if (model.size.width == ((ScreenWidth - 20 - 4) / 3 * 3 + 2)) {

if (self.blockViewNumber % 3 == 1 || self.blockViewNumber % 3 == 2) {

typeNumber = i;

break;

}

}

self.blockViewNumber = self.blockViewNumber + (int)model.sizeNumber;

}

//添加空白页面模型

if (typeNumber > -1) {

self.lastNumber = (int)typeNumber;

self.lastNumber++;

self.blockViewNumber++;

[self addNewModelWithNumber:typeNumber];

}

else {

if (self.blockViewNumber % 3 == 1) {

//加2个空model

self.blockViewNumber++;

self.blockViewNumber++;

[self.soureArr addObject:[self newModel]];

[self.soureArr addObject:[self newModel]];

}

else if(self.blockViewNumber % 3 == 2) {

//加1个空model

self.blockViewNumber++;

[self.soureArr addObject:[self newModel]];

}

//刷新数据

[self.collectionView reloadData];

[self reloadHeight];

}

}

- (void) reloadHeight {

if (self.heightBlock) {

self.heightBlock(self.blockViewNumber / 3 * 130 / 5 + 1 );

}

}

- (void)addNewModelWithNumber:(NSInteger)number {

[self.soureArr insertObject:[self newModel] atIndex:number];

[self sortArrWithArr:self.soureArr];

}

- (LZYAttributeModel *)newModel {

LZYAttributeModel *model = [[LZYAttributeModel alloc]init];

model.sizeNumber = 1;

return model;

}

@end


以上就是view的绘制

接下来就是调用

@interface ViewController ()

/**

基本参数

*/

@property (nonatomic ,strong)LZYRVBrandBasicParametersView *basicView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor grayColor];

UIView *bgView = [[UIView alloc]initWithFrame:CGRectMake(0, 40, ScreenWidth, 150)];

bgView.backgroundColor = [UIColor blueColor];

[self.view addSubview:bgView];

self.basicView =  [[LZYRVBrandBasicParametersView  alloc]initWithFrame:CGRectMake(0, 56, ScreenWidth, 156) WithSourceArr:nil];

[bgView addSubview:self.basicView];

[self.basicView mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.right.equalTo(bgView);

make.top.mas_equalTo(0);

make.bottom.equalTo(bgView.mas_bottom).offset(0);

}];

self.basicView.heightBlock = ^(float height) {

bgView.frame = CGRectMake(0, 40, ScreenWidth, height + 81 - 56);

NSLog(@"基本参数:%lf",height);

};

self.basicView.soureArr = (NSMutableArray *)[self createDateSource1];

}

- (NSArray *)createDateSource1 {

LZYAttributeModel *model = [[LZYAttributeModel alloc]init];

model.keyString = @"床";

model.valueString = @"2张";

LZYAttributeModel *model1 = [[LZYAttributeModel alloc]init];

model1.keyString = @"冰箱";

model1.valueString = @"有";

LZYAttributeModel *model2 = [[LZYAttributeModel alloc]init];

model2.keyString = @"电视";

model2.valueString = @"有";

LZYAttributeModel *model3 = [[LZYAttributeModel alloc]init];

model3.keyString = @"空调";

model3.valueString = @"有";

LZYAttributeModel *model4 = [[LZYAttributeModel alloc]init];

model4.keyString = @"卫浴";

model4.valueString = @"有";

LZYAttributeModel *model5 = [[LZYAttributeModel alloc]init];

model5.keyString = @"电磁炉";

model5.valueString = @"有";

LZYAttributeModel *model6 = [[LZYAttributeModel alloc]init];

model6.keyString = @"倒车雷达";

model6.valueString = @"有";

LZYAttributeModel *model7 = [[LZYAttributeModel alloc]init];

model7.keyString = @"电动踏板";

model7.valueString = @"有";

LZYAttributeModel *model8 = [[LZYAttributeModel alloc]init];

model8.keyString = @"遮阳棚";

model8.valueString = @"有";

LZYAttributeModel *model9 = [[LZYAttributeModel alloc]init];

model9.keyString = @"尾部爬梯";

model9.valueString = @"有";

LZYAttributeModel *model10 = [[LZYAttributeModel alloc]init];

model10.keyString = @"自行车架";

model10.valueString = @"有";

LZYAttributeModel *model11 = [[LZYAttributeModel alloc]init];

model11.keyString = @"卫星电话";

model11.valueString = @"有";

LZYAttributeModel *model12 = [[LZYAttributeModel alloc]init];

model12.keyString = @"充电逆变器";

model12.valueString = @"有";

LZYAttributeModel *model13 = [[LZYAttributeModel alloc]init];

model13.keyString = @"暖风机";

model13.valueString = @"有";

NSArray *arr1 = [[NSArray alloc]initWithObjects:model,model1,model2,model3,model4,model5,model6,model7,model8,model9,model10,model11,model12,model13, nil];

return arr1;

}

这样就可以了

如果觉得不想看代码 直接加我QQ(1127038469) 我已经封装好了。

转载于:https://www.jianshu.com/p/441313197d2a

2017-11-08 17:54:44 lipengfei_1993 阅读数 347

目录

1.应用场景,资料搜索以及思路确认

2.DHxlsReader(解读XLS)

3.利用GDataXML解读XML的方式来解读(xlsx)

4.相关资源链接


一.应用场景

        在开发过程中遇到这样的需求,要求把APP沙盒的excel文件中的内容解析提取出来来使用,比如我有一张联系人的表,我要把其中的姓名,电话来提取出来,应用到app中去.开始没有接触过这方面的知识,于是乎理所当然的谷歌百度了一番,资料比较少,而且年代都比较久远,可能是这方面的需求比较少的原因吧.总之,理一下思路吧先.

        首先,我们来看一下Excel文件的两种格式xls和xlsx,格式不一样,解析的方式也不一样,区别的话大家自行百度,简而言之,在03之前都是xls,后来07版本出现了xlsx。网上有一种方法是先将excel文件转为csv格式的,然后再解析,但是转换的代码我没有找到,只是让客户在电脑上另存为,这个不合适.后来找到了一个框架,就是DHxlsReader,但是这个只能解析xls后缀格式的.然后xlsx格式的解决方法我是没有一点头绪,惭愧.后来是一块安卓的小伙伴想到的一个方法.后缀为.xlsx的excel文件从本质上是一个压缩文件,解压打开后的文件夹内容格式是固定的,具体的内容都放在一个xml文件中,我们要做的就是拿到文件,解析xml,提取内容.下面来把具体步骤分享一下.

二 .DHxlsReader(解读XLS)

      这个框架也令我头疼了一天,因为从github上面下载下来的库是不能直接使用的,我也不太懂,于是乎又搜索了一下如何用.网上也有demo.因为DHxlsReader是一个项目,所以我们想要用的话,就涉及到一个问题: 如何在你的项目中插入一个新的项目来供你的项目调用.下面由图来解.

  1,将单纯的DHxlsReader包含的文件全部拷贝到你的项目中来

2.打开你的项目,点击左下角加号,选择addFileTo...

3.这么只添加时没有关联的,下一步做的是添加关联,配置一些环境,有几个地方要注意

1添加库

第一个库添加的时候可能要注意一点,要点加号,Add Other...

第一个库添加的时候可能要注意一点,要点加号,Add Other...,然后command+shift+g, 输入/usr/lib/ ,你就可以找到了.我导入的时候碰到的问题是明明选择了 libiconv.dylib, 但是导出后就变成了libiconv.2.dylib, 如果出现这样的问题,就吧原来的删掉都统一换成新的库吧,

2.设置header search Path

3,因为DHxlsReader中用到了C的库,所以你的头文件要加上下图所示.

我配置的时候弄了一天,碰到各种各样的问题,因为这方面接触的不多,后来莫名其妙的就好了,也是无语,查资料的时候,header search path 设置的地方可能出了问题,但是demo是这么设置的,我也不甚理解,如果有大神知道,望给我详细解一下.

关于用法,demo里面都有,用法比较简单,就是环境配置比较麻烦一点.

三.利用GDataXML解读XML的方式来解读(xlsx)

         07版之后的excel基本都是xlsx格式的,其本质上其实是一个压缩文件,打开之后是一个文件夹

我们来分析一下这个文件夹的结构;shareString是一个公共的字符串池,相当于,给我们表中字符串贴上一个标签一样.然后我们先分析一下shareString.xml里面的内容

所需要解析的东西都在xl这个文件夹里;

然后我们先分析一下shareString.xml里面的内容

下面来解析worksheet中sheet1.xml

然后就这样循环的查下去,把你需要的内容查找出来,当然,这样肯定要求excel表格有一定的样式,最起码要给你一格标识来找到哪一行是姓名,哪一行是号码,要有几个模糊关键字让你来查询.xlsx文件的解析,我的做法是,先用 ZipArchive 将其解压到某一个固定的路径,然后再用GDataXML来解析,两张表获取具体内容,关于ZipArchive和GDataXML的使用和注意点,大家自行谷歌吧.思路便是如此了,第一次写文章,有点缭乱,大家见谅.

四.相关资源链接

1.demo地址:pan.baidu.com/s/1c2lBqBQ 

作者:碎月Coder 链接:http://www.jianshu.com/p/95c88a7073a6 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2018-10-10 09:33:00 weixin_33895604 阅读数 7

表格转成word,ios代码
1、获取word文件转成Nsstring,通过webView

NSString *path = [[NSBundle mainBundle] pathForResource:@"word" ofType:@"docx"];
    NSURL *url = [NSURL fileURLWithPath:path];
-(void)webViewDidFinishLoad:(UIWebView *)webView

{
    NSString *strings = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerText"];
    ResultViewController *ov = [[ResultViewController alloc]init];
       NSString * address = strings;
   address = [address stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和换行字符
    address = [address stringByReplacingOccurrencesOfString:@"\t" withString:@""];
    address = [address stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    ov.str = address;
    [self.navigationController pushViewController:ov animated:YES];
}

2、处理字符串

    NSArray *array = [self.str componentsSeparatedByString:@"案例编号:-0"]; //从字符A中分隔成2个元素的数组
//有多少个该分类
    NSArray *smallArray = [array subarrayWithRange:NSMakeRange(1, 8)];
    NSMutableArray *textArr = [NSMutableArray array];
    for (int i = 0; i < smallArray.count; i++) {
        NSString *s = smallArray[i];
        NSArray *array = [s componentsSeparatedByString:@"测试概述"];
        NSArray *arrays = [array.lastObject componentsSeparatedByString:@"测试结果"];
        [textArr addObject:arrays.firstObject];
    }
    // 创建存放XLS文件数据的数组,Excel行
    NSMutableArray  *xlsDataMuArr = [[NSMutableArray alloc] init];
    [xlsDataMuArr addObject:@"执行人员"];
    [xlsDataMuArr addObject:@"客户端"];
    [xlsDataMuArr addObject:@"案例编号"];
    [xlsDataMuArr addObject:@"测试概述"];
    [xlsDataMuArr addObject:@"测试结果"];
    [xlsDataMuArr addObject:@"输出"];
  //Excel列
    for (int i = 0; i < smallArray.count; i ++) {
        [xlsDataMuArr addObject:@"XXX"];
        [xlsDataMuArr addObject:@"iOS"];
        [xlsDataMuArr addObject:[NSString stringWithFormat:@"要素类-0%02d",i]];
        [xlsDataMuArr addObject:STRING(textArr[i])];
        [xlsDataMuArr addObject:@"XXX"];
        [xlsDataMuArr addObject:@"XXX"];
    }
    // 把数组拼接成字符串,连接符是 \t(功能同键盘上的tab键)
    NSString *fileContent = [xlsDataMuArr componentsJoinedByString:@"\t"];
    // 字符串转换为可变字符串,方便改变某些字符
    NSMutableString *muStr = [fileContent mutableCopy];
    // 新建一个可变数组,存储每行最后一个\t的下标(以便改为\n)
    NSMutableArray *subMuArr = [NSMutableArray array];
    for (int i = 0; i < muStr.length; i ++) {
        NSRange range = [muStr rangeOfString:@"\t" options:NSBackwardsSearch range:NSMakeRange(i, 1)];
        if (range.length == 1) {
            [subMuArr addObject:@(range.location)];
        }
    }
    // 替换末尾\t
    for (NSUInteger i = 0; i < subMuArr.count; i ++) {
#warning  下面的6是列数,根据需求修改
        if ( i > 0 && (i%6 == 0) ) {
            [muStr replaceCharactersInRange:NSMakeRange([[subMuArr objectAtIndex:i-1] intValue], 1) withString:@"\n"];
        }
    }
    // 文件管理器
    NSFileManager *fileManager = [[NSFileManager alloc]init];
    NSData *fileData = [muStr dataUsingEncoding:NSUTF16StringEncoding];
    // 文件路径
    NSString *path = NSHomeDirectory();
    NSString *filePath = [path stringByAppendingPathComponent:@"/Documents/export.xls"];
    
    NSLog(@"文件路径:\n%@",filePath);
    // 生成xls文件
    [fileManager createFileAtPath:filePath contents:fileData attributes:nil];

转载于:https://www.jianshu.com/p/8fd6dcded526

2017-11-07 13:49:28 lipengfei_1993 阅读数 846
- (void)createXLSFile {
// 创建存放XLS文件数据的数组
NSMutableArray  *xlsDataMuArr = [[NSMutableArray alloc] init];
// 第一行内容
    [xlsDataMuArr addObject:@"Time"];
    [xlsDataMuArr addObject:@"Address"];
    [xlsDataMuArr addObject:@"Person"];
    [xlsDataMuArr addObject:@"Reason"];
    [xlsDataMuArr addObject:@"Process"];
    [xlsDataMuArr addObject:@"Result"];
// 100行数据
for (int i = 0; i < 100; i ++) {
        [xlsDataMuArr addObject:@"2016-12-06 17:18:40"];
        [xlsDataMuArr addObject:@"GuangZhou"];
        [xlsDataMuArr addObject:@"Mr.Liu"];
        [xlsDataMuArr addObject:@"Buy"];
        [xlsDataMuArr addObject:@"TaoBao"];
        [xlsDataMuArr addObject:@"Debt"];
    }
// 把数组拼接成字符串,连接符是 \t(功能同键盘上的tab键)
NSString *fileContent = [xlsDataMuArr componentsJoinedByString:@"\t"];
// 字符串转换为可变字符串,方便改变某些字符
NSMutableString *muStr = [fileContent mutableCopy];
// 新建一个可变数组,存储每行最后一个\t的下标(以便改为\n
NSMutableArray *subMuArr = [NSMutableArray array];
for (int i = 0; i < muStr.length; i ++) {
NSRange range = [muStr rangeOfString:@"\t" options:NSBackwardsSearch range:NSMakeRange(i, 1)];
if (range.length == 1) {
            [subMuArr addObject:@(range.location)];
        }
    }
// 替换末尾\t
for (NSUInteger i = 0; i < subMuArr.count; i ++) {
#warning  下面的6是列数,根据需求修改
if ( i > 0 && (i%6 == 0) ) {
            [muStr replaceCharactersInRange:NSMakeRange([[subMuArr objectAtIndex:i-1] intValue], 1) withString:@"\n"];
        }
    }
// 文件管理器
NSFileManager *fileManager = [[NSFileManager alloc]init];
//使用UTF16才能显示汉字;如果显示为#######是因为格子宽度不够,拉开即可
NSData *fileData = [muStr dataUsingEncoding:NSUTF16StringEncoding];
// 文件路径
NSString *path = NSHomeDirectory();

NSString *filePath = [path stringByAppendingPathComponent:@"/Documents/export.xls"];

NSLog(@"文件路径:\n%@",filePath);
name = @"export";

houzui = @"xls";
quanming = @"export.xls";
lujing = filePath;
// 生成xls文件
    [fileManager createFileAtPath:filePath contents:fileData attributes:nil];
}

iOS 类似excel的展示

阅读数 6234

iOS 生成Excel文件

阅读数 24

没有更多推荐了,返回首页