我唯一能想到的是使用C或其他东西并包装它,但这并不理想.解析这些数据以便在Swift中使用的任何更好的建议?
目标是消除Applescript,但我不确定在与Excel文件交互时是否可行.通过Applescript编写Excel脚本似乎是唯一的方法.
编辑:我没有从这个工作流程中删除Excel的选项.这就是数据将如何进入应用程序,因此我必须包含它.
能够简化解析这些数据的过程然后处理它将是至关重要的.我知道Applescript过去一直很好,帮助我处理它;然而,它对我来说有点过于封闭.
我一直在寻找在Swift / Cocoa中编写的东西,但是仍然可能需要用Applescript提取数据,对吧?
推动Swift的一大优点是可读性.我不太了解Objective-C,而且我觉得swift会更容易过渡.
我在PC上的工作流程一直在使用COM对象,如前所述,在Mac Excel应用程序中不可用.我此刻只是在寻找数据提取.一些以前的应用程序在应用程序中进行了处理,但我希望使其非常独立,因此我正在开发的应用程序中的所有处理.一旦从.XLS或.XLSX文件中提取数据,我将通过RegEx进行一些文本编辑,也许还有一些数字运算.没什么太疯狂的.截至目前,它将在客户端运行,但我希望将其扩展到服务器进程.
解决方法
AppleScriptObjC不能直接在Swift中使用,因为NSBundle的命令loadAppleScriptObjectiveCScripts没有桥接到Swift.
但是,您可以使用Objective-C桥类
ASObjC.h
@import Foundation; @import AppleScriptObjC; @interface NSObject (Excel) - (void)openExcelDocument:(NSString *)filePath; - (NSArray *)valueOfUsedRange; @end @interface ASObjC : NSObject + (ASObjC *)sharedASObjC; @property id Excel; @end
ASObjC.m
#import "ASObjC.h" @implementation ASObjC + (void)initialize { if (self == [ASObjC class]) { [[NSBundle mainBundle] loadAppleScriptObjectiveCScripts]; } } + (ASObjC *)sharedASObjC { static id sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken,^{ sharedInstance = [[ASObjC alloc] init]; }); return sharedInstance; } - (instancetype)init { self = [super init]; if (self) { _Excel = NSClassFromString(@"ASExcel"); } return self; } @end
从AppleScriptObjC模板创建AppleScript源文件
ASExcel.applescript
script ASExcel property parent: class "NSObject" on openExcelDocument:filePath set asFilePath to filePath as text tell application "Microsoft Excel" set sourceBook to open workbook workbook file name asFilePath repeat try get workbooks return end try delay 0.5 end repeat end tell end openDocument on valueOfUsedRange() tell application "Microsoft Excel" tell active sheet set activeRange to used range return value of activeRange end tell end tell end valueOfUsedRange end script
如有必要,链接到AppleScriptObjC框架.
创建桥接头并导入ASObjC.h
然后你可以用Swift调用AppleScriptObjC
ASObjC.sharedASObjC().Excel.openExcelDocument("Macintosh HD:Users:MyUser:Path:To:ExcelFile.xlsx")
要么
let excelData = ASObjC.sharedASObjC().Excel.valueOfUsedRange() as! Array<[String]>