首先自己导入
/// 获取xlsx类型文件信息
/// - Parameter fileName: 文件名
/// - Returns: 返回所有信息数组 层级为:所有文件的所有信息->一个文件(xlsx文件)的所有信息->一个工作表(sheet)的所有信息->一行的信息->[第几行,第几列,行的信息,列的信息]
@objc func GetXLSXFileInfo(fileName:String) -> NSArray {
/**
1.如果是程序打包时的文件,可通过
let path = Bundle.main.path(
forResource: fileName,//注意这个fileName不能带后缀啊
ofType: "xlsx"
) ?? "" 获取文件路径
2.如果是通过UIDocumentPickerViewController获取的文件,可通过
var pathDocuments = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0];
pathDocuments = pathDocuments + "/" + fileName;
获取,不能直接使用func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {}中的URL(这个是选择文件之后的回调方法),因为
这个URL(如:file:///private/var/mobile/Containers/Data/Application/FA5F8E01-522F-4657-B896-F4C555477F06/Documents/1111.xlsx)包含前缀file:///private,会导致获取不到文件
最终使用的路径应该是如:/var/mobile/Containers/Data/Application/FA5F8E01-522F-4657-B896-F4C555477F06/Documents/1111.xlsx这种样式
*/
var pathDocuments = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0];
pathDocuments = pathDocuments + "/" + fileName;
if pathDocuments.hasSuffix("xlsx"){
guard let file = XLSXFile(filepath: pathDocuments) else{
return []
}
let allInfoArr = NSMutableArray.init();//所有文件的所有信息
let parseBooks = try? file.parseWorkbooks();//所有文件数组,一般都是一个文件所以返回的是一个内容的数组
for wbk in parseBooks ?? []{
let oneBookInfo = NSMutableArray.init();//一个文件的所有信息
for (name, path) in try! file.parseWorksheetPathsAndNames(workbook: wbk) {
if let worksheetName = name {
print("This worksheet has a name: \(worksheetName)")
}
let oneWorksheetInfo = NSMutableArray.init();//一个文件中一个工作表的所有信息
let worksheet = try! file.parseWorksheet(at: path)
let parseSharedStrings = try? file.parseSharedStrings();
/**
一行一行 将所有数据解析出来
先获取所有行rows
然后获取每一行的所有单元格cells
然后转换获取数据
*/
let worksheet_rows:[Row] = worksheet.data!.rows;
var rowNumber = 0;//第几行
var rowText = "";//第几行对应的文字
var columnNumber = 0;//第几列
var columnText = "";//第几列对应的文字
for subRow in worksheet_rows {
let oneRowInfo = NSMutableArray.init();//一个文件中一个工作表其中一行的所有信息
columnNumber = Int(subRow.reference);//第几列
for subCell in subRow.cells {
rowNumber = Int(subCell.reference.row);//第几行
rowText = subCell.stringValue(parseSharedStrings!) ?? "";//第几行对应的文字
columnText = subCell.reference.column.value;//第几列对应的文字
columnNumber = Int(subCell.reference.column.intValue);//第几列 需要将intValue改为public,否则无法获取
print("第"+String(rowNumber)+"行:" + " 第" + String(columnNumber)+"列:" + " 行信息:" + rowText + " 列信息:" + columnText);
//第几行 第几列 行的信息 列的信息
oneRowInfo.add([String(rowNumber),String(columnNumber),rowText,columnText]);
}
oneWorksheetInfo.add(oneRowInfo);
}
oneBookInfo.add(oneWorksheetInfo);
}
allInfoArr.add(oneBookInfo);
}
return allInfoArr;
}else{
// 文件格式不对
//文件格式只能是xlsx!
return [];
}
}
**注意:**需要将Cell.reference.column.intValue改为public,否则无法获取intValue,导致columnNumber无法及时更新,不用的话可以不修改。