#csv #spreadsheet #compile #excel #target #variables #format

bin+lib csvpp

将 csv++ 源代码编译为目标电子表格格式

7 个不稳定版本 (3 个破坏性更改)

0.6.1 2024年2月13日
0.6.0 2024年1月15日
0.5.1 2023年12月29日
0.4.1 2023年11月8日
0.3.0 2023年9月10日

#383 in 解析器实现

Download history 9/week @ 2024-03-28 15/week @ 2024-04-04

每月下载量 62 次

MIT 许可协议

380KB
10K SLoC

crates.io github workflow dependency status codecov

csv++

csv++ 是 CSV 的超集,允许您在文本文件中编写电子表格,然后将其编译为目标电子表格(Excel、Google Sheets 或甚至回到 CSV)。

由于 csv++ 是 CSV 的超集,因此任何 CSV 文档都是有效的

Sum,Column 1,Column 2,
=5*SUM(B2,C2),,,

但是,您可以通过在顶部创建一个代码部分来提取可重用变量和函数,这部分与单元格隔开,使用 ---。以下是一个相同的电子表格,但已提取为变量和函数

# you can define variables with `:=`
multiplier := 5

# functions look like this and have a single expression as their body
fn my_fn(a, b)
  multiplier * SUM(a, b)

---
Sum                 , Column 1, Column 2,
"=my_fn(B2, C2)"    ,         ,         ,

另一个有用的功能是将变量绑定到单元格。您可以在要绑定变量的单元格上使用 [[/]] 语法。

fn my_complex_fn(a, b)
  a * a + SQRT(b)

---
Complex function      , Column 1  , Column 2 ,
"=my_complex_fn(a, b)", [[var=a]] , [[var=b]],

填充

另一个有用的功能是定义在编译的电子表格中填充的行范围(无限或有限)。要指定一个,请使用类似于上面的行选项语法,只需在其前面加上 !: ![[/]]

Product Name  , Quantity          , Price per Unit  , =SUM(D2:D12)
![[fill=10]]  , [[var=quantity]]  , [[var=price]]   , =quantity * price

这将获取第二行并在最终电子表格中重复 10 次。如果想要它一直重复到电子表格的末尾,只需省略 =10 并将其指定为 ![[fill]]

变量作用域

变量的作用域语义非常独特,因为每次函数调用都是相对于其使用的单元格进行评估的。如你所见,你可以使用 [[var=...]] 来将变量名绑定到指定的单元格。作为一个作用域语义的例子,我们将使用这个 csv++ 模板

foo_from_code_section := 42
---
[[var=bar_outside_fill]] ,                         ,                 ,                     ,                       ,
![[fill=2]]bar           , [[var=bar_in_fill]]     , =bar_in_fill    , =bar_outside_fill   , =foo_from_code_section,

它将编译为

     ,     ,     ,     ,
bar  ,     , =B2 , =A1 , =42
bar  ,     , =B3 , =A1 , =42

分解如下

  • foo_from_code_section - 不论在何处使用,总是 42
  • bar_in_fill - 由于它在 ![[fill]] 内定义,它的值取决于最后一行,将是 B2B3
  • bar_outside_fill - 总是 A1,指向其定义的单元格。由于它不在 fill 内定义,所以没有相对性。

导入代码

csv++ 允许你使用 use 语句导入和重用函数和变量

my_math_constants.csvpp

pi := 3.14159
e := 2.7182818284
---

main.csvpp

use my_math_constants

fn circumference_from_diameter(r)
    r * 2 * pi

fn radius_to_diameter(r)
    2 * r

fn circumference_from_radius(r)
    radius_from_diameter(radius_to_diameter(r))

---
Radius          ,Circumference                           ,
[[var=radius]]  ,"=circumference_from_radius(radius)"    ,

格式化

你可以应用基本的单元格格式,这将对整行或单个单元格生效。要为单个单元格应用格式,请使用 [[/]] 语法

[[text=bold/text=underline]]foo,[[fontsize=20]]bar,baz,

这里使用缩写语法实现相同的功能

[[t=b/t=u]]foo,[[fs=20]]bar,baz,

要格式化整个行,你可以在行的开头使用 ![[/]]

![[t=b/t=u]]foo,bar,baz,

有关完整格式化功能的列表,请参阅 语言参考

其他阅读材料

依赖关系

~62MB
~840K SLoC