一尘不染

在Apple Swift中解析Excel数据

swift

我当前的工作流程涉及使用Applescript本质上界定Excel数据并将其格式化为纯文本文件。我们正在向全Swift环境推进,但是我还没有找到任何将我的Excel数据解析为Swift的工具包。

我唯一想到的就是使用C或其他东西并将其包装,但这并不理想。关于解析此数据以在Swift中使用的任何更好的建议?

目的是消除Applescript,但是我不确定在仍然与Excel文件交互时是否有可能。通过Applescript编写Excel脚本似乎是唯一的方法。

编辑: 我没有选择从此工作流程中删除Excel。这就是数据将如何到达应用程序的方式,因此我必须将其包括在内。

能够简化解析此数据然后对其进行处理的过程将至关重要。我知道Applescript过去在帮助我进行处理方面一直很出色。但是,对于我来说,它有点封闭。

我一直在寻找用Swift / Cocoa编写东西的方法,但这仍然可能需要使用Applescript提取数据,对吗?

推动Swift的一大优势是可读性。我不太了解Objective-C,因此我认为快速过渡是一个容易的过程。

我在PC上的工作流程一直在使用COM对象,如上所述,Mac
Excel应用程序中没有该对象。我现在只在寻找数据提取。某些以前的应用程序在应用程序内进行过处理,但是我希望使它变得非常独立,因此我正在开发的应用程序内的所有处理过程均如此。从.XLS或.XLSX文件中提取数据后,我将通过RegEx进行一些文本编辑,也许还需要进行一些运算。没什么太疯狂的。到目前为止,它将在客户端运行,但是我希望将其扩展到服务器进程。


阅读 1259

收藏
2020-07-07

共1个答案

一尘不染

在Mac OS X 10.6 Snow
Leopard中,Apple引入了AppleScriptObjC框架,该框架使可可和AppleScript之间的交互变得非常容易。可以在同一源文件中使用AppleScript代码和类似Objective-
C的语法。它比Scripting Bridge和更方便NSAppleScript

AppleScriptObjC无法直接在Swift中使用,因为loadAppleScriptObjectiveCScriptsNSBundle
的命令未桥接到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.apple脚本

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]>
2020-07-07