fastgenerateapi 1.2.33__tar.gz → 1.2.34__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/PKG-INFO +1 -1
  2. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/__version__.py +1 -1
  3. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/xlsx_util.py +47 -36
  4. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/PKG-INFO +1 -1
  5. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/LICENSE +0 -0
  6. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/README.md +0 -0
  7. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/__init__.py +0 -0
  8. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/__init__.py +0 -0
  9. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/api_view.py +0 -0
  10. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/base_view.py +0 -0
  11. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/create_view.py +0 -0
  12. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  13. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  14. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/delete_view.py +0 -0
  15. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_all_view.py +0 -0
  16. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_one_view.py +0 -0
  17. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_relation_view.py +0 -0
  18. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_tree_view.py +0 -0
  19. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  20. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
  21. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
  22. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  23. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  24. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  25. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  26. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  27. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/switch_view.py +0 -0
  28. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/update_relation_view.py +0 -0
  29. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/update_view.py +0 -0
  30. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/cache/__init__.py +0 -0
  31. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/cache/cache_decorator.py +0 -0
  32. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/cache/key_builder.py +0 -0
  33. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/__init__.py +0 -0
  34. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/connection_manager.py +0 -0
  35. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/consumer.py +0 -0
  36. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/websocket_view.py +0 -0
  37. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/__init__.py +0 -0
  38. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/filter_controller.py +0 -0
  39. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/router_controller.py +0 -0
  40. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/rpc_controller.py +0 -0
  41. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/search_controller.py +0 -0
  42. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/ws_controller.py +0 -0
  43. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/__init__.py +0 -0
  44. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/data_type.py +0 -0
  45. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  46. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/tortoise_type.py +0 -0
  47. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/deps/__init__.py +0 -0
  48. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  49. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  50. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/example/__init__.py +0 -0
  51. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/example/models.py +0 -0
  52. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/example/routers.py +0 -0
  53. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/example/schemas.py +0 -0
  54. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/example/views.py +0 -0
  55. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  56. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/all.py +0 -0
  57. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  58. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  59. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/tortoise_utils.py +0 -0
  60. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/__init__.py +0 -0
  61. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/common.py +0 -0
  62. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/docx_util.py +0 -0
  63. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/file_util.py +0 -0
  64. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/pdf_util.py +0 -0
  65. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/zip_util.py +0 -0
  66. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/model/__init__.py +0 -0
  67. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/model/base_model.py +0 -0
  68. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/__init__.py +0 -0
  69. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/aes_field.py +0 -0
  70. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/enum_field.py +0 -0
  71. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/pk_field.py +0 -0
  72. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  73. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  74. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/validator.py +0 -0
  75. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  76. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
  77. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  78. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  79. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  80. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/common_function.py +0 -0
  81. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  82. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  83. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
  84. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  85. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  86. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  87. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  88. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  89. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  90. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  91. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/__init__.py +0 -0
  92. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/all_settings.py +0 -0
  93. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/app_settings.py +0 -0
  94. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/db_settings.py +0 -0
  95. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/etcd_settings.py +0 -0
  96. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/file_settings.py +0 -0
  97. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/jwt_settings.py +0 -0
  98. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/otlp_settings.py +0 -0
  99. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/redis_settings.py +0 -0
  100. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/sms_settings.py +0 -0
  101. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/system_settings.py +0 -0
  102. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/__init__.py +0 -0
  103. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/aes.py +0 -0
  104. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/auto_discover.py +0 -0
  105. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/exception.py +0 -0
  106. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/pwd_utils.py +0 -0
  107. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  108. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/snowflake.py +0 -0
  109. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/str_util.py +0 -0
  110. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  111. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/validator/__init__.py +0 -0
  112. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi/validator/validator.py +0 -0
  113. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  114. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  115. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/top_level.txt +0 -0
  116. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/script/__init__.py +0 -0
  117. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/setup.cfg +0 -0
  118. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.34}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.33
3
+ Version: 1.2.34
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 2, 33)
11
+ VERSION = (1, 2, 34)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -123,42 +123,47 @@ class XlsxImporterImpl(XlsxImporterInterface):
123
123
  def __init__(self, file: Optional[UploadFile], *args, **kwargs):
124
124
  self.file = file
125
125
  self.args = args
126
+ self.kwargs = kwargs
127
+ # 初始化时预计算常量,避免循环内重复计算
126
128
  self.required_field_dict = {field: True for field in self.required_fields} if self.required_fields else {}
127
129
  self.field_title_dict = {self.fields[i]: self.xlsx_headers[i] for i in range(len(self.fields))}
128
- self.kwargs = kwargs
130
+ self.fields_length = len(self.fields) if self.fields else 0
129
131
 
130
132
  # ------------------------------ 钩子函数 ------------------------------------
131
133
  async def handle_data(self, rows: List[Dict[str, str]]):
132
134
  if not self.model_class:
133
- raise NotImplementedError
134
- create_list = []
135
+ raise NotImplementedError("model_class must be set")
136
+
135
137
  global_dict = {}
136
138
  if self.fields_handler:
137
139
  if is_async_callable(self.fields_handler):
138
140
  rows = await self.fields_handler(rows, *self.args, **self.kwargs, global_dict=global_dict)
139
141
  else:
140
142
  rows = self.fields_handler(rows, *self.args, **self.kwargs, global_dict=global_dict)
143
+ processed_rows = []
141
144
  for row in rows:
142
145
  try:
146
+ # 前置处理
143
147
  if self.field_before_handler_list:
144
- for field_before_handler in self.field_before_handler_list:
145
- if is_async_callable(field_before_handler):
146
- row = await field_before_handler(row, *self.args, **self.kwargs, global_dict=global_dict)
148
+ for handler in self.field_before_handler_list:
149
+ if is_async_callable(handler):
150
+ row = await handler(row, *self.args, **self.kwargs, global_dict=global_dict)
147
151
  else:
148
- row = field_before_handler(row, *self.args, **self.kwargs, global_dict=global_dict)
152
+ row = handler(row, *self.args, **self.kwargs, global_dict=global_dict)
153
+ # 数据验证
149
154
  if self.create_schema:
150
155
  create_dict = self.create_schema(**row).model_dump(exclude_unset=True)
151
156
  else:
152
157
  create_dict = row
158
+ # 后置处理
153
159
  if self.field_after_handler_list:
154
- for field_after_handler in self.field_after_handler_list:
155
- if is_async_callable(field_after_handler):
156
- create_dict = await field_after_handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
160
+ for handler in self.field_after_handler_list:
161
+ if is_async_callable(handler):
162
+ create_dict = await handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
157
163
  else:
158
- create_dict = field_after_handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
159
- if not create_dict:
160
- continue
161
- create_obj = self.model_class(**create_dict)
164
+ create_dict = handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
165
+ if create_dict:
166
+ processed_rows.append(self.model_class(**create_dict))
162
167
  except ValidationError as e:
163
168
  alise_dict = ToolMixin.get_schema_alise_to_name(self.create_schema)
164
169
  _error_field = e.errors()[0].get('loc')[0]
@@ -167,9 +172,9 @@ class XlsxImporterImpl(XlsxImporterInterface):
167
172
  if not row.get(error_field):
168
173
  return ResponseMixin.error(msg=f"第{row['_row_index']}行【{description}】不能为空")
169
174
  return ResponseMixin.error(msg=f"第{row['_row_index']}行【{description}】填写错误")
170
- create_list.append(create_obj)
171
- await self.model_class.bulk_create(create_list)
172
- return create_list
175
+ if processed_rows:
176
+ await self.model_class.bulk_create(processed_rows)
177
+ return processed_rows
173
178
 
174
179
  async def upload_file(self, bytes_io: io.BytesIO):
175
180
  raise NotImplementedError
@@ -180,51 +185,59 @@ class XlsxImporterImpl(XlsxImporterInterface):
180
185
  async def push_status_error(self, msg: Optional[str]):
181
186
  raise NotImplementedError
182
187
 
183
- async def validate_field(self, row_value):
184
-
188
+ def validate_field(self, row_value):
189
+ """字段验证逻辑"""
185
190
  return row_value
186
191
 
187
192
  # ------------------------------ 复用函数 ------------------------------------
188
193
  async def check_headers(self, row: tuple[Cell, ...]):
189
194
  if not self.xlsx_headers:
190
- raise NotImplementedError
191
- header_list = []
192
- for col_index, col in enumerate(row):
193
- header_list.append(col.value)
195
+ raise NotImplementedError("xlsx_headers must be set")
196
+ header_list = [cell.value for cell in row]
194
197
  if len(header_list) != len(self.xlsx_headers):
195
- return ResponseMixin.error(msg="文件首行长度校验错误")
198
+ return ResponseMixin.error(msg=f"文件首行长度错误,期望{len(self.xlsx_headers)}列,实际{len(header_list)}列")
196
199
  if not operator.eq(header_list, self.xlsx_headers):
197
- return ResponseMixin.error(msg="文件首行内容校验错误")
200
+ return ResponseMixin.error(msg="文件首行内容校验错误,请检查导入模板是否正确")
198
201
 
199
202
  return
200
203
 
201
204
  async def get_data_dict(self, sh: Worksheet) -> List[Dict[str, str]]:
205
+ import time
206
+
202
207
  data_list = []
203
- for row_index in range(2, sh.max_row + 1):
204
- row_data = await self.row_to_dict(sh[row_index], row_index)
208
+ # 使用iter_rows批量读取,利用只读模式优势
209
+ rows = sh.iter_rows(min_row=2, max_row=sh.max_row, values_only=False)
210
+ for row_index, row in enumerate(rows, start=2):
211
+ start_time = time.time()
212
+ row_data = self.row_to_dict(row, row_index)
205
213
  if not row_data:
206
214
  continue
207
215
  row_data["_row_index"] = row_index
208
216
  data_list.append(row_data)
217
+ print(f"get_data_dict第{row_index}行,内部代码执行时间: {time.time() - start_time:.6f} 秒")
209
218
 
210
219
  return data_list
211
220
 
212
- async def row_to_dict(self, row, row_index) -> dict:
221
+ def row_to_dict(self, row, row_index) -> dict:
213
222
  row_data = {}
214
- error_msg = ""
215
- for i in range(min(len(row), len(self.fields))):
223
+ error_msg = None
224
+ has_value = False
225
+ for i in range(min(len(row), self.fields_length)):
216
226
  field = self.fields[i]
217
- row_value = row[i].value
227
+ cell = row[i]
228
+ row_value = cell.value if cell else None
218
229
  if row_value in [None, "", " "]:
219
230
  row_value = None
220
231
  elif isinstance(row_value, int):
221
232
  row_value = str(row_value)
222
- row_value = await self.validate_field(row_value)
233
+ row_value = self.validate_field(row_value)
223
234
  if self.required_field_dict.get(field) and not row_value:
224
235
  if not error_msg:
225
236
  error_msg = f"第{row_index}行【{self.field_title_dict.get(field)}】不能为空"
226
- row_data[self.fields[i]] = row_value
227
- if any(row_data.values()):
237
+ row_data[field] = row_value
238
+ if row_value:
239
+ has_value = True
240
+ if has_value:
228
241
  if error_msg:
229
242
  return ResponseMixin.error(msg=error_msg)
230
243
  return row_data
@@ -377,7 +390,6 @@ class XlsxUtil:
377
390
  try:
378
391
  # 校验表头信息
379
392
  await importer.check_headers(sh[1])
380
-
381
393
  # 读取excel数据
382
394
  rows = await importer.get_data_dict(sh)
383
395
  finally:
@@ -387,7 +399,6 @@ class XlsxUtil:
387
399
  return ResponseMixin.error(msg="导入数据不能为空")
388
400
  # 处理完整数据
389
401
  await importer.handle_data(rows)
390
-
391
402
  return
392
403
 
393
404
  @staticmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.33
3
+ Version: 1.2.34
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com