diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2019-04-30 07:49:14 +0200 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2019-04-30 07:49:14 +0200 |
commit | 054019f7afb7aeeac680493c0b176eb35a832c96 (patch) | |
tree | 0b5693d15e917cd97461daa29c02896f4dbfa7fd /src/ee/part | |
parent | 37e4be24129b6980e3e9fced7345d4a596af3d58 (diff) | |
download | ee-python-054019f7afb7aeeac680493c0b176eb35a832c96.tar.gz ee-python-054019f7afb7aeeac680493c0b176eb35a832c96.tar.bz2 ee-python-054019f7afb7aeeac680493c0b176eb35a832c96.tar.xz ee-python-054019f7afb7aeeac680493c0b176eb35a832c96.zip |
part:
o Experimental importer from Excel-like files.
Diffstat (limited to 'src/ee/part')
-rw-r--r-- | src/ee/part/excel.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/ee/part/excel.py b/src/ee/part/excel.py new file mode 100644 index 0000000..cbbffde --- /dev/null +++ b/src/ee/part/excel.py @@ -0,0 +1,61 @@ +from pathlib import Path +from typing import Optional, Mapping + +from pyexcel import get_book + +from ee.money import Money +from ee.part import Part, PartDb +from ee.xml import types + +__all__ = [ + "from_excel", +] + + +def from_excel(path: Path, sheet_name: Optional[str]) -> PartDb: + wb = get_book(file_name=str(path)) + + db = PartDb() + + sheet = wb.sheet_by_index(0) if sheet_name is None else wb.sheet_by_name(sheet_name) + + sheet = list(sheet) + + header: Mapping[str, int] = {name.lower(): idx for idx, name in enumerate(sheet[0]) if len(name.strip())} + print(header) + + mpn_idx = header.get("mpn", None) + desc_idx = header.get("description", None) + price_idx = header.get("price", None) + url_idx = header.get("url", None) + + print("mpn: {}, desc: {}, price: {}, url: {}".format(mpn_idx, desc_idx, price_idx, url_idx)) + + for idx, row in enumerate(sheet[1:], 1): + mpn = row[mpn_idx] if mpn_idx is not None else "" + desc = row[desc_idx].strip() if desc_idx is not None else "" + price = row[price_idx] if price_idx is not None else None + url = row[url_idx] if url_idx is not None else None + + print(row[desc_idx]) + + if len(mpn) == 0 and len(desc) == 0: + print("Bad part, line #{}. MPN or description is required".format(idx)) + continue + + part = Part(types.Part()) + + if not mpn: + mpn = desc.replace(" ", "-").lower() + + part.add_mpn(mpn) + part.xml.descriptionProp = desc + + if price: + part.add_price_break(1, Money(price)) + if url: + part.get_links().append(types.Link(url=url, relation="canonical")) + + db.add_entry(part, False) + + return db |