b2bcenter-parser/excel_parser.py

88 lines
2.6 KiB
Python
Raw Normal View History

2024-02-06 10:47:22 +03:00
import pathlib
from sqlite3 import Row
import requests
from openpyxl import load_workbook, Workbook
from openpyxl.cell import Cell
from openpyxl.worksheet.worksheet import Worksheet
from pathlib import Path
import pandas as pd
API_CALC_URL = "https://api.jde.ru/vD/calculator/PriceAddress"
TYPE = "1"
PICKUP = "1"
DELIVERY = "1"
USER = "2252130929823409"
TOKEN = "67065749269910593"
class ExcelParser:
def __init__(self, path: Path | str):
self._wb: Workbook | None = None
if isinstance(path, str):
path = Path(path)
assert path.is_file() is True
self.convert_to_xlsx(path)
self._sheet: Worksheet = self._wb.active
def convert_to_xlsx(self, path: pathlib.Path):
import pyexcel as pe
if path.suffix == '.xlsx':
self._wb = load_workbook(str(path))
return
pe.save_book_as(file_name=str(path), dest_file_name=str(path.with_suffix('.xlsx')))
self._wb = load_workbook(str(path.with_suffix('.xlsx')))
def clean_up_wb(self) -> pd.DataFrame:
triggered = False
for row in self._sheet.rows:
for cell in row:
cell: Cell
row: Row
if isinstance(cell.value, str) and cell.value.startswith('№ заявки'):
self._sheet.delete_rows(1, cell.row - 1)
triggered = True
break
if triggered:
break
df = pd.DataFrame(self._sheet.values)
not_nullable_cols = df.iloc[0].dropna().index
df = df.iloc[:, not_nullable_cols]
df.columns = df.iloc[0, :]
df: pd.DataFrame = df.drop(0, axis=0)
df.to_excel('./text.xlsx')
return df[['Адрес отгрузки', 'Адрес склада', 'Масса', 'Объем']].to_dict(orient='records')[0]
def calculate(self) -> int | None:
df = self.clean_up_wb()
query = {
"type": TYPE,
"token": TOKEN,
"delivery": DELIVERY,
"pickup": PICKUP,
"user": USER,
"addr_from": df['Адрес отгрузки'],
"addr_to": df['Адрес склада'],
"weight": df['Масса'],
"volume": df['Объем'],
}
if query['volume'] is None:
query['volume'] = 0.01
print(query)
data = requests.get(API_CALC_URL, params=query).json()
print(data)
if data.get('price', None) is not None:
return int(data['price'])
return None
if __name__ == '__main__':
parser = ExcelParser('./downloads/1342AWP1A.xls')
print(parser.calculate())