我正在构建一个应用程序,其核心数据(1 个实体具有 5 个属性)显示在 tableView 中。现在我想将这些数据导出到一个 CSV 文件(这样我就可以通过电话发送这个文件),这样我就可以在 Windows 的 excel 中打开它。我搜索了很多但没有找到正确的答案。有人可以帮助我或给我一个好的解释或教程的链接吗?
顺便说一句,我正在快速构建。
func createExportString() -> String {
var merk: String?
var ref: String?
var beschrijving: String?
var aantal: String?
var wbs: String?
var export = NSLocalizedString("merk, ref, beschrijving, aantal, wbs \n", comment: "")
merk = Lijst.valueForKey("merk") as? String
ref = Lijst.valueForKey("ref") as? String
aantal = Lijst.valueForKey("aantal") as? String
beschrijving = Lijst.valueForKey("beschrijving") as? String
wbs = Lijst.valueForKey("wbs") as? String
let merkString = "\(merk!)" ?? "-"
let refString = "\(ref!)" ?? "-"
let beschString = "\(beschrijving!)" ?? "-"
let aantalString = "\(aantal!)" ?? "-"
let wbsString = "\(wbs!)" ?? "-"
export += merkString + "," + refString + "," + beschString + "," + aantalString +
"," + wbsString + "\n"
print("This is what the app will export: \(export)")
return export
}
@IBAction func saveToCSV(sender: AnyObject) {
exportDatabase()
}
func exportDatabase() {
var exportString = createExportString()
saveAndExport(exportString)
}
func saveAndExport(exportString: String) {
let exportFilePath = NSTemporaryDirectory() + "export.csv"
let exportFileURL = NSURL(fileURLWithPath: exportFilePath)
NSFileManager.defaultManager().createFileAtPath(exportFilePath, contents: NSData(), attributes: nil)
var fileHandleError: NSError? = nil
var fileHandle: NSFileHandle? = nil
do {
fileHandle = try NSFileHandle(forWritingToURL: exportFileURL)
} catch {
print( "Error with fileHandle")
}
if fileHandle != nil {
fileHandle!.seekToEndOfFile()
let csvData = exportString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
fileHandle!.writeData(csvData!)
fileHandle!.closeFile()
let firstActivityItem = NSURL(fileURLWithPath: exportFilePath)
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil)
self.presentViewController(activityViewController, animated: true, completion: nil)
}
}
最佳答案
这是一种简洁的方式来做你想做的一切——你传递托管对象的数组和一个字符串,它是 CSV 的文件名。该方法将您的 CSV 写入文件。我相信您的代码中已经包含了其中的大部分,缺少的是最后两行,它们只是将字符串写入“Documents”目录中的新文件。
func writeCoreDataObjectToCSV(objects: [NSManagedObject], named: String) -> String? {
/* We assume that all objects are of the same type */
guard objects.count > 0 else {
return nil
}
let firstObject = objects[0]
let attribs = Array<Any>(firstObject.entity.attributesByName.keys)
let csvHeaderString = (attribs.reduce("",combine: {($0 as String) + "," + $1 }) as NSString).substringFromIndex(1) + "\n"
let csvArray = objects.map({object in
(attribs.map({(object.valueForKey($0) ?? "NIL").description}).reduce("",combine: {$0 + "," + $1}) as NSString).substringFromIndex(1) + "\n"
})
let csvString = csvArray.reduce("", combine: +)
return csvHeaderString+csvString
}
现在,在代码的其他地方,您需要从该字符串创建 NSData 并将其添加到邮件编辑器中:
let csvString = .....
let data = csvString.dataUsingEncoding(NSUTF8StringEncoding)
let composer = MFMailComposeViewController()
composer.addAttachmentData(attachment: data,
mimeType mimeType: "text/csv",
fileName filename: "mydata.csv")
然后,用 Composer 做通常的事情(设置正文、主题等)并将其呈现给用户!
编辑:
编辑了答案以更好地回答问题。
关于ios - 如何从 Core Data (swift) 创建 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35530506/