我正在尝试使用拖放功能在我的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,我原本认为字节流可以工作,解压缩会重新创建结构,但似乎不是......
有什么想法吗?
答案 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的任何拖放示例中都没有看到它。无论如何,它是现在都在工作