前言
想要用iOS原生直接導(dǎo)出xls文件,在網(wǎng)上查了下資料,發(fā)現(xiàn)iOS原生導(dǎo)出Excel文件的方法,在網(wǎng)上基本就兩種方法:
-
使用LibXL庫
這個(gè)庫很強(qiáng)大,具有Excel上的所有屬性設(shè)置,這個(gè)庫也很貴:199刀。我知道國內(nèi)沒有多少人愿意買,免費(fèi)版的也可以用,但是生成的文件第一行會(huì)有Created by LibXL trial version. Please buy the LibXL full version for removing this message.字樣,而且據(jù)說有行數(shù)限制。(光第一行有廣告就不能忍了?。?/li> -
原生系統(tǒng)方法
在原生里可以利用Excel的換行格式,用系統(tǒng)方法直接寫成xls文件,就可以生成Excel文件了。
但是本文介紹的是第三種方法:
-
libxlsxwriter開源庫
這是在GitHub上無意間發(fā)現(xiàn)的一個(gè)很???的生成Excel文件的第三方開源庫。
這個(gè)庫是個(gè)C語言庫,可以直接在iOS里使用,而且可以媲美那個(gè)收費(fèi)的LibXL,功能強(qiáng)大,文檔齊全,幾乎包含Excel中的所有屬性設(shè)置。本文要介紹的就是這個(gè)庫的大致使用。
libxlsxwriter使用
libxlsxwriter有非常齊全的文檔,所有函數(shù)、屬性的使用及參數(shù)的含義里面都有詳細(xì)介紹。這里只大致介紹一下常用的屬性設(shè)置。
生成xlsx
使用cocoapods導(dǎo)入libxlsxwriter,導(dǎo)入頭文件:
#import <xlsxwriter.h>
保存文件的路徑:
// 文件保存的路徑
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
NSString *filename = [documentPath stringByAppendingPathComponent:@"c_demo.xlsx"];
創(chuàng)建表格workbook,和工作表worksheet:
// 創(chuàng)建新xlsx文件,路徑需要轉(zhuǎn)成c字符串
lxw_workbook *workbook = workbook_new([filename UTF8String]);
// 創(chuàng)建sheet
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
保存生成文件:
workbook_close(workbook);
此時(shí)生成文件c_demo.xlsx,但是沒有寫入內(nèi)容,所以是個(gè)空的xlsx文件。

生成xlsx文件
注:生成文件是在xlsx文件內(nèi)的所有內(nèi)容和單元格格式設(shè)置完畢后執(zhí)行,此處只是介紹如何生成文件。
設(shè)置列寬
/* Change the column width for clarity.改變列寬
五個(gè)參數(shù)分別是:
worksheet Pointer to a lxw_worksheet instance to be updated.
first_col The zero indexed first column.
last_col The zero indexed last column.
width The width of the column(s).
format A pointer to a Format instance or NULL.
從第first_col到last_col的列的寬度為width,索引從0開始 */
worksheet_set_column(worksheet, 4, 5, 50, NULL);
worksheet_set_column(worksheet, COLS("B:D"), 5, NULL);

設(shè)置列寬
worksheet_set_column(worksheet, COLS("B:D"), 5, NULL);此句等同于worksheet_set_column(worksheet, 1, 3, 5, NULL);注:兩個(gè)
worksheet_set_column列寬設(shè)置里的列數(shù)不能重復(fù),否則前面設(shè)置的列數(shù)全部無效單元格屬性設(shè)置
設(shè)置單元格格式使用lxw_format,可以設(shè)置字體、顏色、對齊方式、邊框等等所有屬性。具體屬性可閱讀參考格式文檔。
- 新建單元格格式對象:
lxw_format *format = workbook_add_format(workbook);
- 字體設(shè)置:
format_set_bold(format);// 加粗
format_set_font_color(format, LXW_COLOR_RED);//顏色
- 設(shè)置對齊方式,所有對齊參數(shù)設(shè)置參閱:format_set_align
format_set_align(format, LXW_ALIGN_CENTER);// 水平居中
format_set_align(format, LXW_ALIGN_VERTICAL_CENTER);//垂直居中
- 設(shè)置邊框,所有邊框設(shè)置參閱:format_set_border
format_set_border(format, LXW_BORDER_MEDIUM);// 邊框(四周):中寬邊框
format_set_right(format, LXW_BORDER_DOUBLE);// 右邊框:雙線邊框
- 設(shè)置數(shù)字格式,所有數(shù)字格式設(shè)置參閱:format_set_num_format
format_set_num_format(format, "¥#,##0.00");
單元格寫入數(shù)據(jù)
- 寫入文本和數(shù)字:
- 第一個(gè)參數(shù)是工作表
- 第二個(gè)參數(shù)是行數(shù)(索引從0開始)
- 第三個(gè)參數(shù)是列數(shù)(索引從0開始)
- 第四個(gè)參數(shù)是寫入的內(nèi)容
- 第五個(gè)參數(shù)是單元格樣式,可為
NULL。
// 寫入文字
worksheet_write_string(worksheet, 1, 0, "Hello", format);
worksheet_write_string(worksheet, 1, 1, "World", NULL);
// 寫入數(shù)字
worksheet_write_number(worksheet, 2, 0, 123.456, format);
worksheet_write_number(worksheet, 3, 0, 123.456, NULL);
- 數(shù)學(xué)公式,具體使用參閱:worksheet_write_formula
在(4,0)位置即A5上輸出A3和A4的和:
worksheet_write_formula(worksheet, 4, 0, "=SUM(A3:A4)", format);
- 標(biāo)題欄固定
worksheet_freeze_panes(worksheet, 1, 2);// 標(biāo)題欄:前1行、前2列固定

設(shè)置屬性、寫入數(shù)據(jù)
這些屬性差不多夠平時(shí)使用的了,想要了解更多屬性請閱讀文檔,里面介紹的都很詳細(xì),這里就不再細(xì)述了。
本文中所有設(shè)置的源碼:
// 文件保存的路徑
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];
NSString *filename = [documentPath stringByAppendingPathComponent:@"c_demo.xlsx"];
NSLog(@"filepath:%@",filename);
lxw_workbook *workbook = workbook_new([filename UTF8String]);// 創(chuàng)建新xlsx文件,路徑需要轉(zhuǎn)成c字符串
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);// 創(chuàng)建sheet
// 添加格式
lxw_format *format = workbook_add_format(workbook);
//設(shè)置格式
format_set_bold(format);
format_set_font_color(format, LXW_COLOR_RED);
format_set_align(format, LXW_ALIGN_CENTER);// 水平居中
format_set_align(format, LXW_ALIGN_VERTICAL_CENTER);//垂直居中
format_set_border(format, LXW_BORDER_MEDIUM);// 邊框(四周):中寬邊框
format_set_right(format, LXW_BORDER_DOUBLE);// 右邊框:雙線邊框
format_set_num_format(format, "¥#,##0.00");
// 設(shè)置列寬
worksheet_set_column(worksheet, 4, 5, 50, NULL);
worksheet_set_column(worksheet, COLS("B:D"), 5, NULL);
//寫入數(shù)據(jù)
worksheet_write_string(worksheet, 1, 0, "Hello", format);
worksheet_write_string(worksheet, 1, 1, "World", NULL);
worksheet_write_number(worksheet, 2, 0, 123.456, format);
worksheet_write_number(worksheet, 3, 0, 123.456, NULL);
worksheet_write_formula(worksheet, 4, 0, "=SUM(A3:A4)", format);
worksheet_freeze_panes(worksheet, 1, 2);// 標(biāo)題欄:前一行、前2列懸停固定
//關(guān)閉,保存文件
workbook_close(workbook);
我做的demo
用代碼生成了一個(gè)報(bào)銷表格供自己用,不用每個(gè)月去一行一行填了??
樣子如下:

報(bào)銷表格demo.png
demo在此,需要的自己看下。