如何在iOS拖放后保存Excel xlsx

时间:2017-12-14 16:53:43

标签: ios swift excel drag-and-drop openxml

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

有什么想法吗?

1 个答案:

答案 0 :(得分: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的任何拖放示例中都没有看到它。无论如何,它是现在都在工作