proc main(): void {
sheets := using "./ledger.xlsx" as xlsx
if sheets is Result.Ok(tables) {
if tables bounds 0 {
echo len(tables[0])
}
} else if sheets is Result.Error(err) {
echo "ainda sem planilha: {err.message}"
}
}
using lê mais do que um CSV. as xlsx e as ods leem cada um uma planilha inteira e respondem com um Result<Table[dyn], hive.TableError> — uma Table por aba, na ordem do documento, então uma aba vazia é uma Table vazia em vez de uma ausente. Os dois leitores não têm dependências. Uma célula de xlsx chega como o arquivo a guarda, com uma exceção: uma data é guardada internamente como uma contagem de dias, então o formato de número da própria célula é consultado para pegar exatamente essas e renderizá-las como uma data de verdade. Um ods já guarda datas de verdade, então nada ali precisa ser desfeito.