diff --git a/lib/exoffice/parser/excel_2003.ex b/lib/exoffice/parser/excel_2003.ex index ee1893d..115fa6c 100644 --- a/lib/exoffice/parser/excel_2003.ex +++ b/lib/exoffice/parser/excel_2003.ex @@ -49,7 +49,7 @@ defmodule Exoffice.Parser.Excel2003 do """ def count_rows(pid) do - Xlsxir.get_multi_info(pid, :rows) + :ets.info(pid, :size) end @doc """ diff --git a/lib/exoffice/parser/excel_2003/loader.ex b/lib/exoffice/parser/excel_2003/loader.ex index dc69c82..5aa8fb7 100644 --- a/lib/exoffice/parser/excel_2003/loader.ex +++ b/lib/exoffice/parser/excel_2003/loader.ex @@ -50,7 +50,10 @@ defmodule Exoffice.Parser.Excel2003.Loader do loader <- get_stream(ole), {stream, _pos, excel} <- parse(loader, 0, %Excel2003{data_size: byte_size(loader.data)}), pids = parse_sheets(loader, excel, sheet) do - Enum.map(pids, fn {status, pid, _} -> {status, pid} end) + Enum.map(pids, fn {status, pid, _} -> + sort_ets_table_by_row(pid) + {status, pid} + end) else {:error, reason} -> {:error, reason} end @@ -193,7 +196,7 @@ defmodule Exoffice.Parser.Excel2003.Loader do # add cell case :ets.match(pid, {row, :"$1"}) do [[cells]] -> - :ets.insert(pid, {row, cells ++ [[column_string <> to_string(row), value]]}) + :ets.insert(pid, {row, [[column_string <> to_string(row), value]] ++ cells}) _ -> :ets.insert(pid, {row, [[column_string <> to_string(row), value]]}) @@ -218,7 +221,7 @@ defmodule Exoffice.Parser.Excel2003.Loader do # add cell case :ets.match(pid, {row, :"$1"}) do [[cells]] -> - :ets.insert(pid, {row, cells ++ [[column_string <> to_string(row), value]]}) + :ets.insert(pid, {row, [[column_string <> to_string(row), value]] ++ cells}) _ -> :ets.insert(pid, {row, [[column_string <> to_string(row), value]]}) @@ -241,7 +244,7 @@ defmodule Exoffice.Parser.Excel2003.Loader do # add cell case :ets.match(pid, {row, :"$1"}) do [[cells]] -> - :ets.insert(pid, {row, cells ++ [[column_string <> to_string(row), nil]]}) + :ets.insert(pid, {row, [[column_string <> to_string(row), nil]] ++ cells}) _ -> :ets.insert(pid, {row, [[column_string <> to_string(row), nil]]}) @@ -733,4 +736,9 @@ defmodule Exoffice.Parser.Excel2003.Loader do new_pos = pos + length + 4 apply(__MODULE__, fun, if(pid, do: [loader, new_pos, excel, pid], else: [loader, new_pos, excel])) end + + def sort_ets_table_by_row(tid) do + rows = :ets.tab2list(tid) |> Enum.map(fn {row, cells} -> {row, Enum.sort(cells)} end) + :ets.insert(tid, rows) + end end