fastgenerateapi 1.2.32__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.32 → fastgenerateapi-1.2.34}/PKG-INFO +1 -1
  2. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/__version__.py +1 -1
  3. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/xlsx_util.py +51 -37
  4. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/PKG-INFO +1 -1
  5. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/LICENSE +0 -0
  6. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/README.md +0 -0
  7. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/__init__.py +0 -0
  8. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/__init__.py +0 -0
  9. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/api_view.py +0 -0
  10. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/base_view.py +0 -0
  11. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/create_view.py +0 -0
  12. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  13. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  14. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/delete_view.py +0 -0
  15. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_all_view.py +0 -0
  16. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_one_view.py +0 -0
  17. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_relation_view.py +0 -0
  18. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/get_tree_view.py +0 -0
  19. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  20. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
  21. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
  22. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  23. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  24. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  25. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  26. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  27. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/switch_view.py +0 -0
  28. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/update_relation_view.py +0 -0
  29. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/api_view/update_view.py +0 -0
  30. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/cache/__init__.py +0 -0
  31. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/cache/cache_decorator.py +0 -0
  32. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/cache/key_builder.py +0 -0
  33. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/__init__.py +0 -0
  34. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/connection_manager.py +0 -0
  35. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/consumer.py +0 -0
  36. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/channel/websocket_view.py +0 -0
  37. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/__init__.py +0 -0
  38. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/filter_controller.py +0 -0
  39. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/router_controller.py +0 -0
  40. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/rpc_controller.py +0 -0
  41. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/search_controller.py +0 -0
  42. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/controller/ws_controller.py +0 -0
  43. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/__init__.py +0 -0
  44. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/data_type.py +0 -0
  45. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  46. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/data_type/tortoise_type.py +0 -0
  47. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/deps/__init__.py +0 -0
  48. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  49. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  50. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/example/__init__.py +0 -0
  51. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/example/models.py +0 -0
  52. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/example/routers.py +0 -0
  53. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/example/schemas.py +0 -0
  54. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/example/views.py +0 -0
  55. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  56. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/all.py +0 -0
  57. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  58. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  59. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/fastapi_utils/tortoise_utils.py +0 -0
  60. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/__init__.py +0 -0
  61. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/common.py +0 -0
  62. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/docx_util.py +0 -0
  63. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/file_util.py +0 -0
  64. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/pdf_util.py +0 -0
  65. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/file_tool/zip_util.py +0 -0
  66. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/model/__init__.py +0 -0
  67. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/model/base_model.py +0 -0
  68. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/__init__.py +0 -0
  69. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/aes_field.py +0 -0
  70. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/enum_field.py +0 -0
  71. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/pk_field.py +0 -0
  72. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  73. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  74. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/my_fields/validator.py +0 -0
  75. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  76. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
  77. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  78. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  79. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  80. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/common_function.py +0 -0
  81. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  82. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  83. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
  84. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  85. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  86. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  87. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  88. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  89. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  90. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  91. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/__init__.py +0 -0
  92. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/all_settings.py +0 -0
  93. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/app_settings.py +0 -0
  94. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/db_settings.py +0 -0
  95. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/etcd_settings.py +0 -0
  96. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/file_settings.py +0 -0
  97. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/jwt_settings.py +0 -0
  98. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/otlp_settings.py +0 -0
  99. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/redis_settings.py +0 -0
  100. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/sms_settings.py +0 -0
  101. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/settings/system_settings.py +0 -0
  102. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/__init__.py +0 -0
  103. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/aes.py +0 -0
  104. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/auto_discover.py +0 -0
  105. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/exception.py +0 -0
  106. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/pwd_utils.py +0 -0
  107. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  108. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/snowflake.py +0 -0
  109. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/str_util.py +0 -0
  110. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  111. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/validator/__init__.py +0 -0
  112. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi/validator/validator.py +0 -0
  113. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  114. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  115. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/fastgenerateapi.egg-info/top_level.txt +0 -0
  116. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/script/__init__.py +0 -0
  117. {fastgenerateapi-1.2.32 → fastgenerateapi-1.2.34}/setup.cfg +0 -0
  118. {fastgenerateapi-1.2.32 → 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.32
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, 32)
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,50 +185,61 @@ 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
- 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)):
215
226
  field = self.fields[i]
216
- row_value = row[i].value
227
+ cell = row[i]
228
+ row_value = cell.value if cell else None
217
229
  if row_value in [None, "", " "]:
218
230
  row_value = None
219
231
  elif isinstance(row_value, int):
220
232
  row_value = str(row_value)
221
- row_value = await self.validate_field(row_value)
233
+ row_value = self.validate_field(row_value)
222
234
  if self.required_field_dict.get(field) and not row_value:
223
- return ResponseMixin.error(msg=f"第{row_index}行【{self.field_title_dict.get(field)}】不能为空")
224
-
225
- row_data[self.fields[i]] = row_value
226
- if any(row_data.values()):
235
+ if not error_msg:
236
+ error_msg = f"第{row_index}行【{self.field_title_dict.get(field)}】不能为空"
237
+ row_data[field] = row_value
238
+ if row_value:
239
+ has_value = True
240
+ if has_value:
241
+ if error_msg:
242
+ return ResponseMixin.error(msg=error_msg)
227
243
  return row_data
228
244
  return {}
229
245
 
@@ -374,7 +390,6 @@ class XlsxUtil:
374
390
  try:
375
391
  # 校验表头信息
376
392
  await importer.check_headers(sh[1])
377
-
378
393
  # 读取excel数据
379
394
  rows = await importer.get_data_dict(sh)
380
395
  finally:
@@ -384,7 +399,6 @@ class XlsxUtil:
384
399
  return ResponseMixin.error(msg="导入数据不能为空")
385
400
  # 处理完整数据
386
401
  await importer.handle_data(rows)
387
-
388
402
  return
389
403
 
390
404
  @staticmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.32
3
+ Version: 1.2.34
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com