代码之家  ›  专栏  ›  技术社区  ›  A O

如何将此字符*转换为可选字符串?使用LibXL中的xlSheetReadStrA,检查空单元格

  •  0
  • A O  · 技术社区  · 6 年前

    以下是在框架头中声明的签名:

    const char* XLAPIENTRY xlSheetReadStrA(SheetHandle handle, int row, int col, FormatHandle* format);
    

    http://www.libxl.com/spreadsheet.html

    以下是我们当前读取单元格的方式:

    func readNillableString(row:Int32, col:Int32) -> String? {
        let value:String? = String(format: "%s", xlSheetReadStrA(sheet, row, col, nil) ?? "").trimmingCharacters(in: .whitespacesAndNewlines)
        let set = NSMutableCharacterSet.alphanumeric()
        set.addCharacters(in: "., +%%()/[]:-_ ®÷")
        if self.rangeOfCharacter(from: set.inverted) != nil || self.isEmpty {
            return nil
        }
        if value?.isEmpty == true {
            return nil
        }
        return value
    }
    

    但实际上,我们所要做的只是将excel单元格中的值转换为快速字符串

    xlSheetReadStrA 在一个空牢房里,拿着它 char* String ,这是结果:

    (lldb) po value
    ▿ Optional<String>
      - some : "hÿh\u{03}\u{01}"
    

    字符串 如果有一个值,并且 nil

    那个 rangeOfCharacter 调用只是确定单元格是否为空的一种方法。。。


    有没有人有任何LibXL的经验,或者可以看看这个解析代码,并找出更好的方法来做到这一点?我在想可能有更有效的方法 char* xlSheetReadStrA

    1 回复  |  直到 6 年前
        1
  •  1
  •   OOPer    6 年前

    我从未使用过LibXL,但您的代码无法处理 nil 箱子放好了。

    func readNillableString(row:Int32, col:Int32) -> String? {
        guard let cStr = xlSheetReadStrA(sheet, row, col, nil) else {
            return nil
        }
        let value = String(cString: cStr).trimmingCharacters(in: .whitespacesAndNewlines)
        if value.isEmpty {
            return nil
        }
        return value
    }
    

    试着看看会发生什么。