如何在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的主要内容,如果未能解决你的问题,请参考以下文章

拖放后将 Google Map Marker 的新纬度和经度保存到文本框

拖放后将元素的位置保存到本地文件

拖放后保存 HTML5 画布的状态等

拖放后如何更新记录

拖放后再次放置元素

css / html5:拖放后悬停状态保持不变