如何在iOS拖放后保存Excel xlsx

问题描述 投票:0回答:1

我正在尝试使用拖放功能在我的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,我认为字节流可以工作,解压缩会重新创建结构,但似乎不是......

有任何想法吗?

ios swift excel drag-and-drop openxml
1个回答
0
投票

我解决了......

问题是我正在使用我在上面创建的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中的任何拖放示例中看到过它。无论如何,它现在都在工作了

© www.soinside.com 2019 - 2024. All rights reserved.