Skip to content

Commit c226537

Browse files
authored
Handle date and datetime values encoded with numeric cell type (#33)
1 parent eab0cf3 commit c226537

File tree

2 files changed

+69
-49
lines changed

2 files changed

+69
-49
lines changed

lib/xlsx_reader/parsers/worksheet_parser.ex

+6
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,12 @@ defmodule XlsxReader.Parsers.WorksheetParser do
373373

374374
# Numbers
375375

376+
{"n", :date, value} ->
377+
value |> Conversion.to_date(state.workbook.base_date) |> handle_conversion_error()
378+
379+
{"n", type, value} when type in [:time, :date_time] ->
380+
value |> Conversion.to_date_time(state.workbook.base_date) |> handle_conversion_error()
381+
376382
{"n", _, value} ->
377383
value |> Conversion.to_number(state.number_type) |> handle_conversion_error()
378384

test/compatibility_test.exs

+63-49
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,69 @@
22
defmodule CompatibilityTest do
33
use ExUnit.Case
44

5+
describe "elixlsx" do
6+
test "file generated by elixlsx" do
7+
test_row = [
8+
"string1",
9+
"",
10+
nil,
11+
:empty,
12+
"string1",
13+
"string2",
14+
123,
15+
true,
16+
false
17+
]
18+
19+
workbook = %Elixlsx.Workbook{
20+
sheets: [
21+
%Elixlsx.Sheet{
22+
name: "sheet1",
23+
rows: [
24+
test_row
25+
]
26+
},
27+
%Elixlsx.Sheet{name: "sheet2", rows: []}
28+
]
29+
}
30+
31+
assert {:ok, {_filename, zip_binary}} = Elixlsx.write_to_memory(workbook, "test.xlsx")
32+
33+
assert {:ok, package} = XlsxReader.open(zip_binary, source: :binary)
34+
35+
assert ["sheet1", "sheet2"] = XlsxReader.sheet_names(package)
36+
37+
assert {:ok,
38+
[
39+
[
40+
"string1",
41+
"",
42+
nil,
43+
nil,
44+
"string1",
45+
"string2",
46+
123.0,
47+
true,
48+
false
49+
]
50+
]} = XlsxReader.sheet(package, "sheet1", blank_value: nil)
51+
52+
assert {:ok, []} = XlsxReader.sheet(package, "sheet2")
53+
end
54+
55+
test "sheets with dates and datetimes" do
56+
s1 = Elixlsx.Sheet.with_name("1") |> Elixlsx.Sheet.set_cell("A1", {{2015, 11, 30}, {21, 20, 38}}, datetime: true)
57+
s2 = Elixlsx.Sheet.with_name("2") |> Elixlsx.Sheet.set_cell("A1", {{2015, 11, 30}, {21, 20, 38}}, yyyymmdd: true)
58+
wk = %Elixlsx.Workbook{sheets: [s1, s2]}
59+
60+
{:ok, {_filename, bin}} = Elixlsx.write_to_memory(wk, "test.xlsx")
61+
{:ok, package} = XlsxReader.open(bin, source: :binary)
62+
{:ok, sheets} = XlsxReader.sheets(package)
63+
64+
assert [{"1", [[~N[2015-11-30 21:20:38]]]}, {"2", [[~D[2015-11-30]]]}] = sheets
65+
end
66+
end
67+
568
test "google_spreadsheet.xlsx" do
669
assert {:ok, package} =
770
XlsxReader.open(
@@ -37,55 +100,6 @@ defmodule CompatibilityTest do
37100
]} = XlsxReader.sheet(package, "merged")
38101
end
39102

40-
test "file generated by elixlsx" do
41-
test_row = [
42-
"string1",
43-
"",
44-
nil,
45-
:empty,
46-
"string1",
47-
"string2",
48-
123,
49-
true,
50-
false
51-
]
52-
53-
workbook = %Elixlsx.Workbook{
54-
sheets: [
55-
%Elixlsx.Sheet{
56-
name: "sheet1",
57-
rows: [
58-
test_row
59-
]
60-
},
61-
%Elixlsx.Sheet{name: "sheet2", rows: []}
62-
]
63-
}
64-
65-
assert {:ok, {_filename, zip_binary}} = Elixlsx.write_to_memory(workbook, "test.xlsx")
66-
67-
assert {:ok, package} = XlsxReader.open(zip_binary, source: :binary)
68-
69-
assert ["sheet1", "sheet2"] = XlsxReader.sheet_names(package)
70-
71-
assert {:ok,
72-
[
73-
[
74-
"string1",
75-
"",
76-
nil,
77-
nil,
78-
"string1",
79-
"string2",
80-
123.0,
81-
true,
82-
false
83-
]
84-
]} = XlsxReader.sheet(package, "sheet1", blank_value: nil)
85-
86-
assert {:ok, []} = XlsxReader.sheet(package, "sheet2")
87-
end
88-
89103
test "file with omitted row elements" do
90104
assert {:ok, package} = XlsxReader.open(TestFixtures.path("omitted_row.xlsx"))
91105

0 commit comments

Comments
 (0)