| | 1 | |
|
| | 2 | | """ |
| | 3 | | JSONWorkbook(file::AbstractString; start_line = 1) |
| | 4 | |
|
| | 5 | | `start_line` of each sheets are considered as JSONPointer for data structure. |
| | 6 | | And each sheets are pared to `Array{OrderedDict, 1}` |
| | 7 | |
|
| | 8 | | # Constructors |
| | 9 | | ```julia |
| | 10 | | JSONWorkbook("Example.xlsx") |
| | 11 | | ``` |
| | 12 | |
|
| | 13 | | # Arguments |
| | 14 | | arguments are applied to all Worksheets within Workbook. |
| | 15 | |
|
| | 16 | | - `row_oriented` : if 'true'(the default) it will look for colum names in '1:1', if `false` it will look for colum names |
| | 17 | | - `start_line` : starting index of position of columnname. |
| | 18 | | - `squeeze` : squeezes all rows of Worksheet to a singe row. |
| | 19 | | - `delim` : a String or Regrex that of deliminator for converting single cell to array. |
| | 20 | |
|
| | 21 | | """ |
| | 22 | | mutable struct JSONWorkbook |
| 6 | 23 | | xlsxpath::AbstractString |
| | 24 | | sheets::Vector{JSONWorksheet} |
| | 25 | | sheetindex::Index |
| | 26 | | end |
| | 27 | |
|
| | 28 | | function JSONWorkbook(xf::XLSX.XLSXFile, v::Vector{JSONWorksheet}) |
| 12 | 29 | | wsnames = sheetnames.(v) |
| 6 | 30 | | index = Index(wsnames) |
| 6 | 31 | | JSONWorkbook(xf.filepath, v, index) |
| | 32 | | end |
| | 33 | | # same kwargs for all sheets |
| | 34 | | function JSONWorkbook(xf::XLSX.XLSXFile, sheets = XLSX.sheetnames(xf); kwargs...) |
| 18 | 35 | | v = Array{JSONWorksheet, 1}(undef, length(sheets)) |
| 12 | 36 | | @inbounds for (i, s) in enumerate(sheets) |
| 48 | 37 | | v[i] = JSONWorksheet(xf, s; kwargs...) |
| | 38 | | end |
| 6 | 39 | | close(xf) |
| | 40 | |
|
| 6 | 41 | | JSONWorkbook(xf, v) |
| | 42 | | end |
| | 43 | | # Different Kwargs per sheet |
| 0 | 44 | | function JSONWorkbook(xlsxpath::AbstractString, sheets, kwargs_per_sheet::Dict) |
| 0 | 45 | | xf = XLSX.readxlsx(xlsxpath) |
| | 46 | |
|
| 0 | 47 | | v = Array{JSONWorksheet, 1}(undef, length(sheets)) |
| 0 | 48 | | @inbounds for (i, s) in enumerate(sheets) |
| 0 | 49 | | v[i] = JSONWorksheet(xf, s; kwargs_per_sheet[s]...) |
| | 50 | | end |
| 0 | 51 | | close(xf) |
| | 52 | |
|
| 0 | 53 | | JSONWorkbook(xf, v) |
| | 54 | | end |
| 0 | 55 | | function JSONWorkbook(xlsxpath, sheets; kwargs...) |
| 0 | 56 | | xf = XLSX.readxlsx(xlsxpath) |
| 0 | 57 | | JSONWorkbook(xf, sheets; kwargs...) |
| | 58 | | end |
| | 59 | | function JSONWorkbook(xlsxpath; kwargs...) |
| 12 | 60 | | xf = XLSX.readxlsx(xlsxpath) |
| 6 | 61 | | JSONWorkbook(xf; kwargs...) |
| | 62 | | end |
| | 63 | |
|
| | 64 | | # JSONWorkbook fallback functions |
| 2 | 65 | | hassheet(jwb::JSONWorkbook, s::AbstractString) = haskey(jwb.sheetindex, s) |
| 2 | 66 | | hassheet(jwb::JSONWorkbook, s::Symbol) = haskey(jwb.sheetindex, string(s)) |
| 6 | 67 | | sheetnames(jwb::JSONWorkbook) = names(jwb.sheetindex) |
| 1 | 68 | | xlsxpath(jwb::JSONWorkbook) = jwb.xlsxpath |
| | 69 | |
|
| 32 | 70 | | getsheet(jwb::JSONWorkbook, i) = jwb.sheets[i] |
| 22 | 71 | | getsheet(jwb::JSONWorkbook, s::AbstractString) = getsheet(jwb, jwb.sheetindex[s]) |
| 1 | 72 | | getsheet(jwb::JSONWorkbook, s::Symbol) = getsheet(jwb, jwb.sheetindex[string(s)]) |
| 1 | 73 | | Base.getindex(jwb::JSONWorkbook, i::UnitRange) = getsheet(jwb, i) |
| 9 | 74 | | Base.getindex(jwb::JSONWorkbook, i::Integer) = getsheet(jwb, i) |
| 12 | 75 | | Base.getindex(jwb::JSONWorkbook, s::AbstractString) = getsheet(jwb, s) |
| 10 | 76 | | Base.getindex(jwb::JSONWorkbook, s::Symbol) = getsheet(jwb, string(s)) |
| | 77 | |
|
| 3 | 78 | | Base.length(jwb::JSONWorkbook) = length(jwb.sheets) |
| 1 | 79 | | Base.lastindex(jwb::JSONWorkbook) = length(jwb.sheets) |
| | 80 | |
|
| 0 | 81 | | Base.setindex!(jwb::JSONWorkbook, jws::JSONWorksheet, i1::Int) = setindex!(jwb.sheets, jws, i1) |
| 1 | 82 | | Base.setindex!(jwb::JSONWorkbook, jws::JSONWorksheet, s::Symbol) = setindex!(jwb, jws, string(s)) |
| 1 | 83 | | Base.setindex!(jwb::JSONWorkbook, jws::JSONWorksheet, s::AbstractString) = setindex!(jwb.sheets, jws, jwb.sheetindex[s]) |
| | 84 | |
|
| | 85 | | function Base.deleteat!(jwb::JSONWorkbook, i::Integer) |
| 2 | 86 | | deleteat!(getfield(jwb, :sheets), i) |
| 4 | 87 | | s = sheetnames.(getfield(jwb, :sheets)) |
| 2 | 88 | | setfield!(jwb, :sheetindex, Index(s)) |
| 2 | 89 | | jwb |
| | 90 | | end |
| 1 | 91 | | Base.deleteat!(jwb::JSONWorkbook, sheet::Symbol) = deleteat!(jwb, string(sheet)) |
| | 92 | | function Base.deleteat!(jwb::JSONWorkbook, sheet::AbstractString) |
| 2 | 93 | | i = getfield(jwb, :sheetindex)[sheet] |
| 1 | 94 | | deleteat!(jwb, i) |
| | 95 | | end |
| | 96 | |
|
| 0 | 97 | | Base.iterate(jwb::JSONWorkbook) = iterate(jwb, 1) |
| 0 | 98 | | function Base.iterate(jwb::JSONWorkbook, st) |
| 0 | 99 | | st > length(jwb) && return nothing |
| 0 | 100 | | return (jwb[st], st + 1) |
| | 101 | | end |
| | 102 | |
|
| | 103 | | ## Display |
| 0 | 104 | | function Base.summary(io::IO, jwb::JSONWorkbook) |
| 0 | 105 | | @printf(io, "JSONWorkbook(\"%s\") containing %i Worksheets\n", |
| | 106 | | basename(xlsxpath(jwb)), length(jwb)) |
| | 107 | | end |
| 0 | 108 | | function Base.show(io::IO, jwb::JSONWorkbook) |
| 0 | 109 | | summary(io, jwb) |
| 0 | 110 | | @printf(io, "%6s %-15s\n", "index", "name") |
| 0 | 111 | | println(io, "-"^(6+1+15+1)) |
| | 112 | |
|
| 0 | 113 | | index = sort(OrderedDict(jwb.sheetindex.lookup); byvalue = true) |
| 0 | 114 | | for el in index |
| 0 | 115 | | name = string(el[1]) |
| 0 | 116 | | @printf(io, "%6s %-15s\n", el[2], string(el[1])) |
| | 117 | | end |
| | 118 | | end |
| | 119 | |
|