objective-c - 在 Apple Swift 中解析 Excel 数据

标签 objective-c excel swift parsing applescript

我当前的工作流程涉及使用 Applescript 基本上分隔 Excel 数据并将其格式化为纯文本文件。我们正在插入全 Swift 环境,但我还没有找到任何类型的工具包来将我的 Excel 数据解析为 Swift。

我唯一能想到的就是用C什么的,然后把它包起来,但这并不理想。对于解析此数据以便在 Swift 中使用有更好的建议吗?

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

编辑:我没有从该工作流程中删除 Excel 的选项。这就是数据将如何进入应用程序,因此我必须包含它。

能够简化解析这些数据然后处理它的过程将是最重要的。我知道 Applescript 过去在帮助我处理它方面做得很好;但是,它对我来说有点太封闭了。

我一直在考虑用 Swift/Cocoa 编写一些东西,但这可能仍然需要使用 Applescript 提取数据,对吗?

插入 Swift 的一大优势是可读性。我不太了解 Objective-C,我觉得 Swift 会更容易过渡。

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

最佳答案

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

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 框架。
创建桥接 header 并导入 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]>

关于objective-c - 在 Apple Swift 中解析 Excel 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32081748/

相关文章:

ios - 在源 Controller 中委托(delegate)问题

excel - 使用 office 脚本从另一个 excel 工作簿中读取数据

mysql与vb脚本的连接(来自excel宏)

php - Laravel Excel 导入 CSV 加载数据

arrays - 如何在 Swift 中优化二维数组的编译

arrays - 获取 JSON 数组内的 UICollectionView 单元格 ID 并将其设为全局

swift - UIBezierPath 圆形动画失真

iphone - 如何使用使用 Interface Builder 创建的 nib 文件加载 UIView

iphone - 像 atm 机器输入一样实现文本字段输入

ios - 如何在 iOS 中创建自定义 UIActivity?