经验分享:使用Taro包读取Excel文件

安装Taro

# ]激活Pkg模式
add Taro

配置(本步骤的前置条件:已安装jupyter)

这里一定要细看,自己摸索的话,没准就是坑。
Taro依赖于Java软件包。想要调用Taro,必须在启动Julia时,必须传入环境变量JULIA_COPY_STACKS=yes 。

①终端中的启动配置。
一般情况下,我们在终端中进入Julia模式,是以键入 julia 开始的。在不额外配置的情况下,这时,调用Taro会报错。

julia> using Taro  
┌ Warning: JavaCall needs the environment variable `JULIA_COPY_STACKS` to be `1` or `yes`.  
│ Calling the JVM may result in undefined behavior.  
└ @ JavaCall ~/.julia/packages/JavaCall/tjlYt/src/JavaCall.jl:53

想在命令行中正确调用Taro,需要在终端中键入 JULIA_COPY_STACKS=yes julia 以启动Julia。这时,才可以正常调用Taro。

②在jupyter中的使用环境配置。(部分内容,来自于直接向Taro包的作者讨教来的答案。作者真赞,回复很快。)

如果不加配置的话,当在jupyter中调用Taro时

using Taro

,会报错如下:

┌ Warning: JavaCall needs the environment variable `JULIA_COPY_STACKS` to be `1` or `yes`.
│ Calling the JVM may result in undefined behavior.
└ @ JavaCall /home/wangxl/.julia/packages/JavaCall/tjlYt/src/JavaCall.jl:53

JavaCall.JavaCallError("Either the environmental variable JULIA_COPY_STACKS must be 1 OR JavaCall must be used on the root Task.")

Stacktrace:
 [1] assertroottask_or_goodenv
   @ ~/.julia/packages/JavaCall/tjlYt/src/jvm.jl:236 [inlined]
 [2] _init(opts::Vector{String})
   @ JavaCall ~/.julia/packages/JavaCall/tjlYt/src/jvm.jl:285
 [3] init()
   @ JavaCall ~/.julia/packages/JavaCall/tjlYt/src/jvm.jl:277
 [4] init()
   @ Taro ~/.julia/packages/Taro/7MUCw/src/Taro.jl:21
 [5] top-level scope
   @ In[1]:2
 [6] eval
   @ ./boot.jl:373 [inlined]
 [7] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base ./loading.jl:1196

为了使用Taro,必须配置jupyter中的Julia环境变量JULIA_COPY_STACKS。

方法1:直接修改jupyter核文件。以我的情况为例(linux),找到位于 /home/wangxl/.local/share/jupyter/kernels/julia-1.7/ 文件夹下的jupyter的kernel配置文件kernel.json。找到 “env”: {}这一行,# 在"env"后的花括号内,插入 “JULIA_COPY_STACKS”: “yes” 。

{
  "display_name": "Julia 1.7.2",
  "argv": [
    "/usr/bin/julia",
    "-i",
    "--color=yes",
    "--project=@.",
    "/home/wangxl/.julia/packages/IJulia/e8kqU/src/kernel.jl",
    "{connection_file}"
  ],
  "language": "julia",
  "env": {
   "JULIA_COPY_STACKS": "yes"  # 在"env"后的花括号内,加入这一行
  },
  "interrupt_mode": "signal"
}

重启jupyter,即可。
调用Taro,没报错,表示成功。

using Taro

方法2:新建jupyter核时,设定环境变量"JULIA_COPY_STACKS"=>“yes”。

using IJulia
installkernel("Julia for Taro.jl", env=Dict("JULIA_COPY_STACKS"=>"yes"))  # 传入环境变量

重启jupyter,会看到新建的核。

关于installkernel函数的详细说明,可以参考这个链接。若想删除找个核,找到对应文件夹直接手工删除,或者用命令:

rm("/home/wangxl/.local/share/jupyter/kernels/julia-for-taro.jl-1.7",recursive=true)

③配置/home/wangxl/.julia/config/startup.jl 文件,主要是为了在vscode中使用Taro。
打开该上述文件,添加新的一行:ENV[“JULIA_COPY_STACKS”] = “yes”,保存。
如果配置了该文件,在终端和jupyter中都可以不必在配置。

vscode中应该也可以通过配置launch.json来设置,而不影响在终端和jupyter中的表现。熟悉的朋友,可以给指点下。

使用示例(一定要加上 Taro.init())

using Taro, DataFrames
Taro.init()  # 一定要加这行
df=Taro.readxl("file.xls", 0,"A1:B5")|>DataFrame

readxl传入的参数中,
第1个:是文件名,xls和xlsx都可以;
第2个:是sheetname,可以是字符串,也可以是整数(索引从0开始,即0代表第1个sheet),此字段默认值为0,可省略;
第3个:是range,单元格范围。目前,这个字段不可省略,不方便。

本篇侧重介绍配置,更详细的说明,请阅读官方文档。另外,Taro不局限于Excel,还可以读写Word、PDF等文档。