這里有一點(diǎn)需要注意:
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了觀山湖免費(fèi)建站歡迎大家使用!
命名的時候不能用Info.plist , INfo.plist, xxxInfo.plist等形式,否則會與系統(tǒng)中存在的Info.plist文件發(fā)生沖突。
點(diǎn)擊Root這一行,然后通過點(diǎn)擊右鍵-Add Row或者點(diǎn)擊Root后面的加號來增加一行。
這一行中包含三個屬性,key、type、value。其中key是字段屬性,type是字段類型,value是字段對應(yīng)的值。
Type包含7中類型,對寫入的數(shù)據(jù)結(jié)構(gòu)應(yīng)屬于7仲:
(NSString,NSData,NSDate,NSNumber,NSArray,NSDictionary)
讀取數(shù)據(jù)
文件是什么類型,就用什么類型的數(shù)據(jù)來接收
參考文檔1: iOS開發(fā),plist文件讀寫那些事
參考文檔2: iOS開發(fā)中怎么創(chuàng)建Plist文件
參考文檔3: 【iOS】plist無法寫入的原因
參考文檔4: plist 文件寫入與讀取
最近開發(fā)一個藍(lán)牙項(xiàng)目,需要導(dǎo)出和導(dǎo)入EXCEL數(shù)據(jù),由于之前沒有接觸這類功能,查閱了相關(guān)資料,最終選擇采用libxlsxwriter庫實(shí)現(xiàn)EXCEL文檔生成、CoreXLSX實(shí)現(xiàn)EXCEL文檔內(nèi)容解析,做個簡單匯總方便以后查閱,費(fèi)話不多說,直接上干貨。
Libxlsxwriter 是一個 C 庫,可用于在 Excel 2007+ XLSX 文件中寫入文本、數(shù)字、公式和指向多個工作表的超鏈接。
具體功能介紹請?zhí)D(zhuǎn)github的庫地址連接:
1、項(xiàng)目地址
2、使用手冊地址
因?yàn)轫?xiàng)目是用swift開發(fā),所以這里主要簡單介紹下swift項(xiàng)目下如何使用:
數(shù)據(jù)格式建議采用Array的方式存儲每一組的數(shù)據(jù),方便數(shù)據(jù)寫入處理
文件名稱根據(jù)實(shí)際需求定義,路徑只需要文件夾路徑拼接文件名即可
創(chuàng)建表格過程如下:
1、生成一張表格
2、創(chuàng)建一個sheet
3、設(shè)置表格的樣式、格式(包含文字格式、文字顏色、對齊方式等)
樣式設(shè)置可參考使用手冊里的說明,這里大概列幾個供參考:
4、關(guān)閉表格創(chuàng)建
如果格式不對或者樣式不喜歡,可以結(jié)合實(shí)際重新設(shè)置
QuickLook的框架詳解請查看:
可以通過QuickLook打開EXCEL文檔,同時QuickLook還集成一系列功能(保存文件、傳送文件等),導(dǎo)出文檔功能可用這個框架實(shí)現(xiàn),具體如何導(dǎo)出請看框架詳解說明即可
可以通過設(shè)置樣式創(chuàng)建各種復(fù)雜的EXCEL表格,文檔說明也非常詳細(xì),用戶很容易就可以利用該框架創(chuàng)建滿足各種需求的EXCEL表格
沒有EXCEL讀取功能,因此讀取功能只能另外處理
至此,一個簡單的EXCEL創(chuàng)建過程已經(jīng)完成。libxlsxwriter功能十分強(qiáng)大, 如果要生成一個復(fù)雜的表格,請仔細(xì)研讀格式設(shè)置說明文檔
CoreXLSX是一個庫,它專注于表示基于XML的XLSX電子表格格式的底層結(jié)構(gòu)。它允許您打開擴(kuò)展名為.xlsx的電子表格存檔,并將其內(nèi)部結(jié)構(gòu)映射到直接用Swift表示的模型類型中。
需要注意的是,此庫僅為.xlsx格式提供只讀支持。由于舊的legacy.xls電子表格格式具有完全不同的內(nèi)部結(jié)構(gòu),如果您需要使用該類型的文件,請參考其他庫。
如果您的.xlsx文件使用ECMA-376敏捷加密(這似乎是最流行的一種),請查看CryptoOffice庫。
項(xiàng)目地址:
可通過系統(tǒng)提供的API打開,如下:
可通過UIDocumentPickerDelegate回調(diào)方法拿到對應(yīng)的文件路徑, 這里需要注意一個細(xì)節(jié) ,如下圖
讀取文件時需要授權(quán),不然有的文件無法讀取,會報沒有權(quán)限的錯誤提示,讀取數(shù)據(jù)完成后,需要關(guān)閉授權(quán)
采用CoreXLSX相關(guān)API去讀取數(shù)據(jù),具體可參考項(xiàng)目文檔說明,因?yàn)轫?xiàng)目在讀取數(shù)據(jù)時需要校驗(yàn)文檔內(nèi)容是否合法,不合法需要提示用戶重新選擇其他文件,校驗(yàn)規(guī)則可根據(jù)實(shí)際需求去做,以下列舉個人項(xiàng)目的簡單校驗(yàn),如下圖
最終rows得到的就是每組的數(shù)據(jù),可通過遍歷獲取對應(yīng)的數(shù)據(jù),如有疑問,請參考官方文檔或者官方DEMO
參考文獻(xiàn):
libxlsxwriter開源庫:
CoreXLSX開源庫:
XlsxReaderWriterSwift開源庫:
謝謝各位的無私奉獻(xiàn)。。。
非常感謝大家對我的關(guān)注?。。。?/p>
打開文件的方法:
1.獲取文件的沙盒路徑path
2.將path路徑轉(zhuǎn)化URL
3.用webView顯示出來
一開始我用的方法一寫,但是后來發(fā)現(xiàn)在高系統(tǒng)上報錯(大概報錯內(nèi)容:NSCocoaErrorDomain:257)。
后來解決了,做個記錄。
1、在低于iOS13的系統(tǒng)中。用創(chuàng)建文件夾的形式可以如下:
+ (NSString *)tmpLogPath
{
NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library"];
NSString *dirPath = [docPath stringByAppendingPathComponent:@"mylog"];
NSString *filePath = [dirPath stringByAppendingPathComponent:@"tmpLog.txt"];
return filePath;
}
+ (void)writeTmpLog:(NSString *)aMsg
{
NSString *filePath = [[self class] tmpLogPath];
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
? ? BOOL isDir = NO;
? ? BOOL hasDir = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:isDir];
? ? if (!hasDir || !isDir) {
? ? ? ? [[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:NO attributes:nil error:nil];
? ? }
}
NSError *error;
NSString *content =[NSString stringWithContentsOfFile:filePath
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? encoding:NSUTF8StringEncoding
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? error:error];
NSString *newContent = [NSString stringWithFormat:@"%@\n%@",content,aMsg];
[newContent writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
+ (void)clearTmpLog
{
NSString *filePath = [[self class] tmpLogPath];
[@"" writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
2、但是在iOS13上,不能這樣寫。系統(tǒng)會默認(rèn)創(chuàng)建以為***.txt的文件夾,在寫入的時候就出問題了。
會報錯:NSCocoaErrorDomain:257 就是
NSFileReadNoPermissionError = 257,/ /讀取錯誤(權(quán)限問題)
所以可以這樣寫:
+ (NSString *)tmpLogPath {
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"mylog/tmpLog.txt"];
returnfilePath;
}
+ (void)writeTmpLog:(NSString*)aMsg {
NSString*fieldPath = [[self class]tmpLogPath];
NSLog(@"當(dāng)前文件大?。?llu",[self fileSizeWithPath:fieldPath]);
NSFileManager *manager = [NSFileManager defaultManager];
if(![managerfileExistsAtPath:fieldPath]){
? ? NSError*error;
? ? [aMsgwriteToFile:fieldPath atomically:YES encoding:NSUTF8StringEncoding error:error];
? ? if(error) {
? ? ? ? NSLog(@"寫入失敗:%@\n",[error localizedDescription]);
? ? }
}else{
? ? NSError*error;
? ? NSError*writeError;
? ? NSString *content =[NSString stringWithContentsOfFile:fieldPath
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? encoding:NSUTF8StringEncoding
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? error:error];
? ? if(error) {
? ? ? ? NSLog(@"讀取失敗:%@\n",[error localizedDescription]);
? ? }
? ? NSString*newContent = [NSString stringWithFormat:@"%@\n%@",content,aMsg];
? ? [newContentwriteToFile:fieldPath atomically:YES encoding:NSUTF8StringEncoding error:writeError];
? ? if(writeError) {
? ? ? ? NSLog(@"寫入失敗:%@\n",[writeErrorlocalizedDescription]);
? ? }
}
}
//獲取文件大小
+ (unsignedlonglong)fileSizeWithPath:(NSString*)path {
signedlonglongfileSize =0;
NSFileManager *fileManager = [NSFileManager defaultManager];
if([fileManagerfileExistsAtPath:path]) {
? ? NSError*error =nil;
? ? NSDictionary*fileDict = [fileManagerattributesOfItemAtPath:patherror:error];
? ? if(!error fileDict) {
? ? ? ? fileSize = [fileDictfileSize];
? ? }
}
returnfileSize;
}
+ (void)clearTmpLog {
NSError*error;
NSFileManager *manager = [NSFileManager defaultManager];
NSString*filePath = [[selfclass]tmpLogPath];
[managerremoveItemAtPath:filePatherror:error];
if(error) {
? ? NSLog(@"刪除失敗:%@\n",[error localizedDescription]);
}
}
ios關(guān)于文件的讀取有四種方法:
#import foundation foundation.h=""
int main(int argc, const char * argv[])
{
@autoreleasepool
{
//第一種方法: NSFileManager實(shí)例方法讀取數(shù)據(jù)
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
NSString* thepath = [paths lastObject];
thepath = [thepath stringByAppendingPathComponent:@"fd_list.txt"];
NSLog(@"桌面目錄:%@", thepath);
NSFileManager* fm = [NSFileManager defaultManager];
NSData* data = [[NSData alloc] init];
data = [fm contentsAtPath:thepath];
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//第二種方法: NSData類方法讀取數(shù)據(jù)
data = [NSData dataWithContentsOfFile:thepath];
NSLog(@"NSData類方法讀取的內(nèi)容是:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//第三種方法: NSString類方法讀取內(nèi)容
NSString* content = [NSString stringWithContentsOfFile:thepath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"NSString類方法讀取的內(nèi)容是:\n%@",content);
//第四種方法: NSFileHandle實(shí)例方法讀取內(nèi)容
NSFileHandle* fh = [NSFileHandle fileHandleForReadingAtPath:thepath];
data = [fh readDataToEndOfFile];
NSLog(@"NSFileHandle實(shí)例讀取的內(nèi)容是:\n%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
return 0;
}
/foundation