| 144 | |
| 145 | @staticmethod |
| 146 | def format_pd_data(column_list: list, data_list: list, col_formats: dict = None): |
| 147 | # 预处理数据并记录每列的格式类型 |
| 148 | # 格式类型:'text'(文本)、'number'(数字)、'default'(默认) |
| 149 | _fields_list = [] |
| 150 | |
| 151 | if col_formats is None: |
| 152 | col_formats = {} |
| 153 | for field_idx, field in enumerate(column_list): |
| 154 | _fields_list.append(field.name) |
| 155 | col_formats[field_idx] = 'default' # 默认不特殊处理 |
| 156 | |
| 157 | data = [] |
| 158 | |
| 159 | for _data in data_list: |
| 160 | _row = [] |
| 161 | for field_idx, field in enumerate(column_list): |
| 162 | value = _data.get(field.value) |
| 163 | if value is not None: |
| 164 | # 检查是否为数字且需要特殊处理 |
| 165 | if isinstance(value, (int, float)): |
| 166 | # 整数且超过15位 → 转字符串并标记为文本列 |
| 167 | if isinstance(value, int) and len(str(abs(value))) > 15: |
| 168 | value = str(value) |
| 169 | col_formats[field_idx] = 'text' |
| 170 | # 小数且超过15位有效数字 → 转字符串并标记为文本列 |
| 171 | elif isinstance(value, float): |
| 172 | decimal_str = format(value, '.16f').rstrip('0').rstrip('.') |
| 173 | if len(decimal_str) > 15: |
| 174 | value = str(value) |
| 175 | col_formats[field_idx] = 'text' |
| 176 | # 其他数字列标记为数字格式(避免科学记数法) |
| 177 | elif col_formats[field_idx] != 'text': |
| 178 | col_formats[field_idx] = 'number' |
| 179 | _row.append(value) |
| 180 | data.append(_row) |
| 181 | |
| 182 | return data, _fields_list, col_formats |