excel.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import logging
  2. import io
  3. import pandas
  4. from . import lily_pb2, lily_pb2_grpc
  5. class Service(lily_pb2_grpc.ExcelServicer):
  6. def Parse(self, request, context):
  7. logging.info("parse excel %s" % request.content_type)
  8. response = lily_pb2.ExcelParseResponse()
  9. file = io.BytesIO(request.payload)
  10. doc = pandas.read_excel(file, sheet_name=None)
  11. for name, sheet in doc:
  12. logging.info("find sheet %s", name)
  13. sht = response.sheets.add()
  14. sht.name = name
  15. for row, item in sheet.to_dict().items():
  16. for col, val in item.items():
  17. logging.debug('find (%s, %s, %s)', row, col, val)
  18. cell = sht.cells.add()
  19. cell.row = row
  20. cell.col = col
  21. cell.val = val
  22. return response
  23. def Generate(self, request, context):
  24. logging.info("parse excel %s" % request.content_type)
  25. bio = io.BytesIO()
  26. writer = pandas.ExcelWriter(bio, engine="xlsxwriter")
  27. for name, sheet in request.sheets:
  28. # https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
  29. df = pandas.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})
  30. df.to_excel(writer, scheet_name=name)
  31. writer.save()
  32. bio.seek(0)
  33. response = lily_pb2.File()
  34. response.payload = bio.read()
  35. return response