如何在iOS拖放后保存Excel xlsx
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在iOS拖放后保存Excel xlsx相关的知识,希望对你有一定的参考价值。
我正在尝试使用拖放功能在我的ios应用程序中读取xlsx电子表格,感谢一些帮助,我已经到了可以获取数据的阶段,并编写了这个NSItemProviderReading
类来访问它:
class ExcelDocument:NSObject, NSItemProviderReading {
let data:Data?
required init(excelData:Data, typeIdentifier:String) {
data = excelData
}
static var readableTypeIdentifiersForItemProvider: [String] {
return ["org.openxmlformats.spreadsheetml.sheet"]
}
static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self {
return self.init(excelData: data, typeIdentifier: typeIdentifier)
}
func write(toFile: String) -> URL?{
let fileManager = FileManager.default
do {
let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false)
let fileURL = documentDirectory.appendingPathComponent(toFile)
try self.data?.write(to: fileURL)
return fileURL
} catch {
print(error)
}
return nil
}
}
所有这一切运行正常,我可以打开并读取self.data?.write
行写的文件,但xlsx文件的结构似乎已经丢失 - 没有[Content_Types] .xml或.rels,所以尝试和读取的实用程序该文件(我正在使用XlsxReaderWriter)抛出一个错误。
鉴于Office Open XML是压缩XML,我认为字节流可以工作,解压缩会重新创建结构,但似乎不是......
有任何想法吗?
答案
我解决了......
问题是我正在使用我在上面创建的NSItemProvider检索drop项目。
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
session.loadObjects(ofClass: ExcelDocument.self) { excelItems in
if let workbooks = excelItems as? [ExcelDocument], let book = workbooks.first, let excelData = book.data {
我应该做的(以及有效的)是:
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
session.items[0].itemProvider.loadFileRepresentation(forTypeIdentifier: "org.openxmlformats.spreadsheetml.sheet") { url, error in
if url != nil {
(read the excel data from the URL)
}
}
我在Apple文档中偶然发现了session.loadFileRepresentation作为iOS 11中的一个新功能 - 我没有在iOS 11中的任何拖放示例中看到过它。无论如何,它现在都在工作了
以上是关于如何在iOS拖放后保存Excel xlsx的主要内容,如果未能解决你的问题,请参考以下文章