朱莉娅 Excel 对象

4

Julia是否有类似VBA的命令? - Solar Mike
1个回答

5
有两种选择:
  1. 使用 Julia 本地库 (XLSX.jl) <== 推荐
  2. 通过 PyCall.jl 使用现有的 Python 库(同样有效)- 其中还提供了类似 VBA 命令选项 - 请参见本帖子末尾的代码

广告1。

编写电子表格

using XLSX
using Dates
XLSX.openxlsx("smyample.xlsx", mode="w") do xf
    sheet = xf[1]
    XLSX.rename!(sheet, "NewSheetName")
    sheet["A1"] = "Data generated on:"
    sheet["B1"] =  Dates.now()
    dat = rand(4, 5)
    for i in 1:size(dat,1), j in 1:size(dat,2)
        XLSX.setdata!(sheet, XLSX.CellRef(2+i, j), dat[i,j])
    end
end

阅读电子表格:

julia> wb = XLSX.readxlsx("mysample.xlsx")
XLSXFile("sample2.xlsx") containing 1 Worksheet
            sheetname size          range
-------------------------------------------------
         NewSheetName 6x5           A1:E6

让我们获取前两列:

julia> XLSX.getcellrange(ws, ws.dimension)[:,1:2]
6×2 Array{XLSX.AbstractCell,2}:
 Cell(A1, "s", "", "0", "")                   Cell(B1, "", "1", "43995.77937614583", "")
 EmptyCell(A2)                                EmptyCell(B2)
 Cell(A3, "", "", "0.7723129181734945", "")   Cell(B3, "", "", "0.9539233196840988", "")
 Cell(A4, "", "", "0.15112461473849814", "")  Cell(B4, "", "", "0.9088105399888486", "")
 Cell(A5, "", "", "0.38606711950516326", "")  Cell(B5, "", "", "0.274487313772527", "")
 Cell(A6, "", "", "0.4390332370925689", "")   Cell(B6, "", "", "0.04038483579623442", "")

一个 Cell 对象有一个 value 字段,因此您可以进一步处理它。
您也可以直接请求任何单元格:
julia> ws["A1"], ws["B1"]
("Data generated on:", DateTime("2020-06-13T18:42:18"))

也许通常你会更喜欢一个高级的DataFrames-面向API:

using XLSX
using DataFrames
df1 = DataFrame(a=1:3, b=6:8);
df2 = DataFrame(x1=1:3, x2=string.('A':'C'));


XLSX.writetable("myexcel.xlsx",
    MySheetName1=(collect(eachcol(df1)), names(df2)),
    MySheetName2=(collect(eachcol(df2)), names(df2)))

广告2:

首先安装openpyxl

using Conda
Conda.add("openpyxl")

那么任何Python示例都可以工作,例如:

using PyCall
xl = pyimport("openpyxl")

wb = xl.Workbook();
ws = wb.active

ws["A1"] = "hello world"

wb.save("yetanother.xlsx")

最后但并非不重要的是,您可以通过ActiveX自动化Excel。 对于大多数情况,我不建议这样做(速度慢、不跨平台、需要安装Office、需要桌面环境等),但以下是示例:

using Conda
Conda.add("pywin32")

using PyCall
pw = pyimport("win32com")
pwc = pyimport("win32com.client")
import win32com.client

xlApp = pwc.Dispatch("Excel.Application")
xlApp.Visible=1
workBook = xlApp.Workbooks.Open("C:\\temp\\MyTest.xlsx")
workBook.ActiveSheet.Cells(1, 1).Value = "hello world"
workBook.Close(SaveChanges=1) 
xlApp.Quit()

请注意,这个答案只回答了提问者提出的一部分问题。 - Antonello
我添加了ActiveX示例,但我明白目标是读写Excel文件。在生产中使用ActiveX进行此操作有许多注意事项...无论如何,它已经被列入我的示例列表中。 - Przemyslaw Szufel
感谢您的迅速回复!因此,有几种方法可以读/写数据。但是,格式化Excel表格(例如增加单元格的字体大小,更改单元格范围的颜色等)的唯一方法是使用Conda通过ActiveX。您能确认吗? - Manos
绝对不行!我唯一能想象到有人如此绝望地使用ActiveX的情况是运行VBA宏。否则不要碰它。 XLSX.jl 有几种 XLSX.styles* 方法,这里是openpyxl的样式文档 https://openpyxl.readthedocs.io/en/stable/styles.html - Przemyslaw Szufel
好的,知道了,感谢进一步的澄清! - Manos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接