列の型が無効

 Cause: java.sql.SQLException: 列の型が無効です。这个问题是因为sqlmap中的 “jdbcType = "CHAR”  char这个类型和 insert 这个 sql文 中的类型不一致 所造成的, 我的就写成了 varchar2这个类型,搞得我弄了很长的时间没有做对,主要是我写test测试是为他们测试的,所以这个类型问题没有看出来,怎么测试也不成功,现在可以了,呵呵!Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in keijo/common/data/dao/SeisangakuDaoImpl.xml.  
--- The error occurred while applying a result map.  
--- Check the SeisangakuDaoImpl.SeisangakuResult.  
--- Check the result mapping for the 'tesuRyoPerS' property.  
--- Cause: java.sql.SQLException: 列名が無効です。
Caused by: java.sql.SQLException: 列名が無効です。
这个错误是resultMap 中的字段数目 和  select 语句中的 字段的数目应该是 相等的,或者select语句中的字段的数目大于resultMap中的字段数目也是可以,还有不匹配的话也会出错,这个是不匹配出错的。这个只是这个错误提示的一个解决的办法,继续总结。()
Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: com.ibatis.common.exception.NestedRuntimeException: Error parsing XPath '/sqlMapConfig/sqlMap'.  Cause: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: com.ibatis.common.exception.NestedRuntimeException: Error parsing XPath '/sqlMap/select'.  Cause: com.ibatis.sqlmap.client.SqlMapException: There is already a statement named SeisangakuDaoImpl.sumSeisanIchiran in this SqlMap.
Caused by: com.ibatis.sqlmap.client.SqlMapException: There is already a statement named SeisangakuDaoImpl.sumSeisanIchiran in this SqlMap.  这个是因为在 sqlmap中放置了两个id 名字相同的sql文。删除一个就可以了。
select  0 num from tab   前面的零我以前没有见过,这个语法从在oracle运行的结果来看, 这个零 可以变成任何的数字 然后选择出来的就是你变成的数据,当然,是数字类型还是 char 类型 要看  num  这个 应该是 num是char的话就可以 前面就是 写成字母了,然后数据库中的数据会变成你赋的值。有人会的请指导一下谢谢!
我们做这个项目是用xls表和数据库交换了进行的,要进行初始化,对比什么,就是说在xls表里填写数据,好处是你自己写的xls是自己的数据每次运行都是自己的数据,别人运行时别人的数据,这样就不会互相影响,不过也有缺陷,运行的时候xls有时候会出错,并且莫名其妙,今天发现了一个错误,老是说是这个字段是空值,解决办法是在其他的表里要是也有这个字段的话,并且他没有报错,你就在xls sheet表里把这个字段复制到提示有null的那个sheet里面就可以运行了,实现不行那就从建立xls表开始做起。
class SCLStatsProcessor: “”“SCL统计处理器 - 优化版:固定位置”“” def init(self, color_detector): self.color_detector = color_detector # 固定位置 self.COLUMN_MAPPING = { “差分種別”: 12, # L “变更内容”: 13, # M “判断”: 14, # N “判断理由”: 15, # O “变更背景”: 16, # P “备注”: 17 # Q } # 新增规则19-59的关键词 self.keywords = [ "波形図延長、非機能変更と判定されました。", "選択肢的补充说明,不属于功能变更。", "空白行追加され、非機能変更と判定された", "空行削除され、非機能変更と判定された", "无效更改,判定为无功能变更。", "書式変更で機能変更ではないと判断されました。", "仅修改了背景色,不影响软件设计,判定为无功能变更。" ] # 统计结果映射 self.target_columns = { "diff_no_fill": 16, # P "diff_fill": 23, # W "diff_add_no_fill": 27, # AA "diff_add_fill": 30, # AD "diff_change_no_fill": 34, # AH "diff_change_fill": 37, # AK "diff_delete_no_fill": 42, # AP "diff_delete_fill": 45, # AS "valid_yes_no_fill": 50, # AX "valid_yes_f极ill": 53, # BA "valid_no_no_fill": 57, # BE "valid_no_fill": 60, # BH "valid_yes_reason_no_fill": 62, # BL "valid_yes_reason_fill": 65, # BO "valid_no_reason_no_fill": 71, # BS "valid_no_reason_fill": 74, # BV "background_no_fill": 78, # BZ "background_fill": 85, # CG "rule19": 14, # N "rule20": 15, # O "rule21": 17, # Q "rule22": 18, # R "rule23": 19, # S "rule24": 20, # T "rule25": 21, # U "rule26": 22, # V "rule27": 25, # Y "rule28": 26, # Z "rule29": 28, # AB "rule30": 29, # AC "rule31": 32, # AF "rule32": 33, # AG "rule33": 35, # AI "rule34": 36, # AJ "rule35": 47, # AU "rule36": 48, # AV "rule37": 49, # AW "rule38": 51, # AY "rule39": 52, # AZ "rule40": 55, # BC "rule41": 56, # BD "rule42": 58, # BF "rule43": 59, # BG "rule44": 62, # BJ "rule45": 63, # BK "rule46": 65, # BM "rule47": 66, # BN "rule48": 69, # BQ "rule49": 70, # BR "rule50": 72, # BT "rule51": 73, # BU "rule52": 76, # BX "rule53": 77, # BY "rule54": 79, # CA "rule55": 80, # CB "rule56": 81, # CC "rule57": 82, # CD "rule58": 83, # CE "rule59": 84, # CF } # 定义特定颜色 self.COLOR_CRIMSON = "FFE8A9A9" # 猩红 self.COLOR_STEEL_BLUE = "FFCBDDED" # 钢蓝 self.COLOR_CHOCOLATE = "FFF6E5C6" # 巧克力黄 self.HEADER_ROW = 3 # 表头固定在第三行 self.DATA_START_ROW = 4 # 数据从第四行开始 def get_fill_color(self, cell): """获取单元格填充颜色的字符串表示""" try: # 检查是否无填充 if self.color_detector.is_no_fill(cell): return None # 尝试获取前景色 if hasattr(cell.fill, 'fgColor') and cell.fill.fgColor: if hasattr(cell.fill.fgColor, 'rgb') and cell.fill.fgColor.rgb: if isinstance(cell.fill.fgColor.rgb, str): return cell.fill.fgColor.rgb.upper() else: try: # 尝试获取RGB对象的字符串表示 return str(cell.fill.fgColor.rgb).upper() except: return None return None except Exception as e: logger.error(f"获取填充颜色失败: {str(e)}") return None def is_specific_color(self, cell, target_color): """检查单元格是否为特定颜色""" cell_color = self.get_fill_color(cell) return cell_color == target_color def contains_keyword(self, text): """检查文本是否包含任意关键词(不区分大小写)""" if not text: return False text = str(text).strip().lower() for keyword in self.keywords: if keyword.lower() in text: return True return False def process_scl_file(self, file_path): """ 处理单个SCL文件并返回所有统计结果 返回: (results, missing_data) - results: 规则统计结果 - missing_data: 缺失数据表 [{'row': 行号, 'col': 号, 'col_name': 名, 'message': 错误信息}, ...] """ results = {} missing_data = [] # 存储缺失数据信息 try: logger.info(f"开始处理SCL文件: {file_path}") # 加载SCL文件 scl_wb = openpyxl.load_workbook(file_path) scl_sheet = scl_wb.active logger.info(f"工作表加载成功: {scl_sheet.title}, 总行数: {scl_sheet.max_row}") # 检查是否有足够的数据行 if scl_sheet.max_row < self.DATA_START_ROW: logger.info("文件没有数据行,跳过处理") return results, missing_data # 初始化统计结果 stats = { "diff_no_fill": [], # 规则1: 変更内容无颜色填充 "diff_fill": [], # 规则2: 変更内容有颜色填充 "diff_add_no_fill": [], # 规则3: 差分种别="追加"且无颜色填充 "diff_add_fill": [], # 规则4: 差分种别="追加"且有颜色填充 "diff_change_no_fill": [], # 规则5: 差分种别="変更"且无颜色填充 "diff_change_fill": [], # 规则6: 差分种别="変更"且有颜色填充 "diff_delete_no_fill": [], # 规则7: 差分种别="削除"且无颜色填充 "diff_delete_fill": [], # 规则8: 差分种别="削除"且有颜色填充 "valid_yes_no_fill": [], # 规则9: 判断="有意"且无颜色填充 "valid_yes_fill": [], # 规则10: 判断="有意"且有颜色填充 "valid_no_no_fill": [], # 规则11: 判断="無効"且无颜色填充 "valid_no_fill": [], # 规则12: 判断="無効"且有颜色填充 "valid_yes_reason_no_fill": [], # 规则13: 判断="有意"且理由无颜色填充 "valid_yes_reason_fill": [], # 规则14: 判断="有意"且理由有颜色填充 "valid_no_reason_no_fill": [], # 规则15: 判断="無効"且理由无颜色填充 "valid_no_reason_fill": [], # 规则16: 判断="無効"且理由有颜色填充 "background_no_fill": [], # 规则17: 背景无颜色填充 "background_fill": [], # 规则18: 背景有颜色填充 # 规则19-26 "rule19": 0, # 规则19: 包含关键词且无颜色填充 "rule20": 0, # 规则20: 不包含关键词且无颜色填充 "rule21": 0, # 规则21: 包含关键词且猩红填充 "rule22": 0, # 规则22: 不包含关键词且猩红填充 "rule23": 0, # 规则23: 包含关键词且钢蓝填充 "rule24": 0, # 规则24: 不包含关键词且钢蓝填充 "rule25": 0, # 规则25: 包含关键词且巧克力黄填充 "rule26": 0, # 规则26: 不包含关键词且巧克力黄填充 # 规则27-34 "rule27": 0, # L="追加"且无颜色填充且M包含关键词 "rule28": 0, # L="追加"且无颜色填充且M不包含关键词 "rule29": 0, # L="追加"且有颜色填充且M包含关键词 "rule30": 0, # L="追加"且有颜色填充且M不包含关键词 "rule31": 0, # L="変更"且无颜色填充且M包含关键词 "rule32": 0, # L="変更"且无颜色填充且M不包含关键词 "rule33": 0, # L="変更"且有颜色填充且M包含关键词 "rule34": 0, # L="変更"且有颜色填充且M不包含关键词 "rule35": 0, # L="差分無し"的计数 # 规则36-43 "rule36": 0, # N="有意"且无颜色填充且M包含关键词 "rule37": 0, # N="有意"且无颜色填充且M不包含关键词 "rule38": 0, # N="有意"且有颜色填充且M包含关键词 "rule39": 0, # N="有意"且有颜色填充且M不包含关键词 "rule40": 0, # N="無効"且无颜色填充且M包含关键词 "rule41": 0, # N极="無効"且无颜色填充且M不包含关键词 "rule42": 0, # N="無効"且有颜色填充且M包含关键词 "rule43": 0, # N="無効"且有颜色填充且M不包含关键词 # 规则44-51 "rule44": 0, # N="有意"且O无颜色填充且M包含关键词 "rule45": 0, # N="有意"且O无颜色填充且M不包含关键词 "rule46": 0, # N="有意"且O有颜色填充且M包含关键词 "rule47": 0, # N="有意"且O有颜色填充且M不包含关键词 "rule48": 0, # N="無効"且O无颜色填充且M包含关键词 "rule49": 0, # N="無効"且O无颜色填充且M不包含关键词 "rule50": 0, # N="無効"且O有颜色填充且M包含关键词 "rule51": 0, # N="無効"且O有颜色填充且M不包含关键词 # 规则52-59 "rule52": 0, # P无颜色填充且M包含关键词 "rule53": 0, # P无颜色填充且M不包含关键词 "rule54": 0, # P颜色为猩红且M包含关键词 "rule55": 0, # P颜色为猩红且M不包含关键词 "rule56": 0, # P颜色为钢蓝且M包含关键词 "rule57": 0, # P颜色为钢蓝且M不包含关键词 "rule58": 0, # P颜色为巧克力黄且M包含关键词 "rule59": 0, # P颜色为巧克力黄且M不包含关键词 } # 遍历所有数据行 for row_idx in range(self.DATA_START_ROW, scl_sheet.max_row + 1): # 获取所有需要的单元格 diff_content_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["变更内容"]) diff_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["差分種別"]) note_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["备注"]) valid_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["判断"]) reason_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["判断理由"]) background_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["变更背景"]) diff_value = str(diff_cell.value).strip() if diff_cell.value else "" # 获取备注值 note_value = str(note_cell.value).strip() if note_cell and note_cell.value else None # 获取M值 m_value = str(diff_content_cell.value) if diff_content_cell.value else "" valid_value = str(valid_cell.value).strip() if valid_cell.value else "" # 检查是否包含关键词 contains_keyword = self.contains_keyword(m_value) # 获取单元格颜色状态 - 使用统一的方法 l_no_fill = self.color_detector.is_no_fill(diff_cell) # L无填充 m_no_fill = self.color_detector.is_no_fill(diff_content_cell) # M无填充 n_no_fill = self.color_detector.is_no_fill(valid_cell) # N无填充 o_no_fill = self.color_detector.is_no_fill(reason_cell) # O无填充 p_no_fill = self.color_detector.is_no_fill(background_cell) # P无填充 p_crimson = self.is_specific_color(background_cell, self.COLOR_CRIMSON) p_steel_blue = self.is_specific_color(background_cell, self.COLOR_STEEL_BLUE) p_chocolate = self.is_specific_color(background_cell, self.COLOR_CHOCOLATE) # 规则1-18处理(使用统一的方法) # 规则1: 変更内容无颜色填充 if self.color_detector.is_no_fill(diff_content_cell) and note_value: stats["diff_no_fill"].append(note_value) # 规则2: 変更内容有颜色填充 if not self.color_detector.is_no_fill(diff_content_cell) and note_value: stats["diff_fill"].append(note_value) # 规则3: 差分种别="追加"且无颜色填充 if (diff_value == "追加" and l_no_fill and note_value): stats["diff_add_no_fill"].append(note_value) # 规则4: 差分种别="追加"且有颜色填充 if (diff_value == "追加" and not l_no_fill and note_value): stats["diff_add_fill"].append(note_value) # 规则5: 差分种别="変更"且无颜色填充 if (diff_value == "変更" and l_no_fill and note_value): stats["diff_change_no_fill"].append(note_value) # 规则6: 差分种别="変更"且有颜色填充 if (diff_value == "変更" and not l_no_fill and note_value): stats["diff_change_fill"].append(note_value) # 规则7: 差分种别="削除"且无颜色填充 if (diff_value == "削除" and l_no_fill and note_value): stats["diff_delete_no_fill"].append(note_value) # 规则8: 差分种别="削除"且有颜色填充 if (diff_value == "削除" and not l_no_fill and note_value): stats["diff_delete_fill"].append(note_value) # 规则9: 判断="有意"且无颜色填充 if (valid_value == "有意" and n_no_fill and note_value): stats["valid_yes_no_fill"].append(note_value) # 规则10: 判断="有意"且有颜色填充 if (valid_value == "有意" and not n_no_fill and note_value): stats["valid_yes_fill"].append(note_value) # 规则11: 判断="無効"且无颜色填充 if (valid_value == "無効" and n_no_fill and note_value): stats["valid_no_no_fill"].append(note_value) # 规则12: 判断="無効"且有颜色填充 if (valid_value == "無効" and not n_no_fill and note_value): stats["valid_no_fill"].append(note_value) # 规则13: 判断="有意"且理由无颜色填充 if (valid_value == "有意" and o_no_fill and note_value): stats["valid_yes_reason_no_fill"].append(note_value) # 规则14: 判断="有意"且理由有颜色填充 if (valid_value == "有意" and not o_no_fill and note_value): stats["valid_yes_reason_fill"].append(note_value) # 规则15: 判断="無効"且理由无颜色填充 if (valid_value == "無効" and o_no_fill and note_value): stats["valid_no_reason_no_fill"].append(note_value) # 规则16: 判断="無効"且理由有颜色填充 if (valid_value == "無効" and not o_no_fill and note_value): stats["valid_no_reason_fill"].append(note_value) # 规则17: 背景无颜色填充 if p_no_fill and note_value: stats["background_no_fill"].append(note_value) # 规则18: 背景有颜色填充 if not p_no_fill and note_value: stats["background_fill"].append(note_value) # 规则19-59处理(使用统一的方法) # ...(规则19-59的处理代码保持不变)... # 规则19-26处理 if contains_keyword and m_no_fill: stats["rule19"] += 1 if not contains_keyword and m_no_fill: stats["rule20"] += 1 if contains_keyword and self.is_specific_color(diff_content_cell, self.COLOR_CRIMSON): stats["rule21"] += 1 if not contains_keyword and self.is_specific_color(diff_content_cell, self.COLOR_CRIMSON): stats["rule22"] += 1 if contains_keyword and self.is_specific_color(diff_content_cell, self.COLOR_STEEL_BLUE): stats["rule23"] += 1 if not contains_keyword and self.is_specific_color(diff_content_cell, self.COLOR_STEEL_BLUE): stats["rule24"] += 1 if contains_keyword and self.is_specific_color(diff_content_cell, self.COLOR_CHOCOLATE): stats["rule25"] += 1 if not contains_keyword and self.is_specific_color(diff_content_cell, self.COLOR_CHOCOLATE): stats["rule26"] += 1 # 规则27-34处理 if diff_value == "追加": if l_no_fill and contains_keyword: stats["rule27"] += 1 if l_no_fill and not contains_keyword: stats["rule28"] += 1 if not l_no_fill and contains_keyword: stats["rule29"] += 1 if not l_no_fill and not contains_keyword: stats["rule30"] += 1 if diff_value == "変更": if l_no_fill and contains_keyword: stats["rule31"] += 1 if l_no_fill and not contains_keyword: stats["rule32"] += 1 if not l_no_fill and contains_keyword: stats["rule33"] += 1 if not l_no_fill and not contains_keyword: stats["rule34"] += 1 # 规则35: L="差分無し"的计数 if diff_value == "差分無し": stats["rule极35"] += 1 # 规则36-43处理 if valid_value == "有意": if n_no极_fill and contains_keyword: stats["rule36"] += 1 if n_no_fill and not contains_keyword: stats["rule37"] += 1 if not n_no_fill and contains_keyword: stats["rule38"] += 1 if not n_no_fill and not contains_keyword: stats["rule39"] += 1 if valid_value == "無効": if n_no_fill and contains_keyword: stats["rule40"] += 1 if n_no_fill and not contains_keyword: stats["rule41"] += 1 if not n_no_fill and contains_keyword: stats["rule42"] += 1 if not n_no_fill and not contains_keyword: stats["rule43"] += 1 # 规则44-51处理 if valid_value == "有意": if o_no_fill and contains_keyword: stats["rule44"] += 1 if o_no_fill and not contains_keyword: stats["rule45"] += 1 if not o_no_fill and contains_keyword: stats["rule46"] += 1 if not o_no_fill and not contains_keyword: stats["rule47"] += 1 if valid_value == "無効": if o_no_fill and contains_keyword: stats["rule48"] += 1 if o_no_fill and not contains_keyword: stats["rule49"] += 1 if not o_no_fill and contains_keyword: stats["rule50"] += 1 if not o_no_fill and not contains_keyword: stats["rule51"] += 1 # 规则52-59处理 if p_no_fill and contains_keyword: stats["rule52"] += 1 if p_no_fill and not contains_keyword: stats["rule53"] += 1 if p_crimson and contains_keyword: stats["rule54"] += 1 if p_crimson and not contains_keyword: stats["rule55"] += 1 if p_steel_blue and contains_keyword: stats["rule56"] += 1 if p_steel_blue and not contains_keyword: stats["rule57"] += 1 if p_chocolate and contains_keyword: stats["rule58"] += 1 if p_chocolate and not contains_keyword: stats["rule59"] += 1 # 处理统计结果 for rule, count in stats.items(): # 对于规则1-18,输出备注值表的长度 if rule in ["diff_no_fill", "diff_fill", "diff_add_no_fill", "diff_add_fill", "diff_change_no_fill", "diff_change_fill", "diff_delete_no_fill", "diff_delete_fill", "valid_yes_no_fill", "valid_yes_fill", "valid_no_no_fill", "valid_no_fill", "valid_yes_reason_no_fill", "valid_yes_reason_fill", "valid_no_reason_no_fill", "valid_no_reason_fill", "background_no_fill", "background_fill"]: results[rule] = str(len(count)) else: # 对于规则19-59,直接输出计数值 results[rule] = str(count) logger.info(f"{rule}: 计数 {results[rule]}") return results, missing_data except Exception as e: error_msg = f"处理SCL文件失败: {str(e)}" logger.exception(f"处理SCL文件失败: {file_path} - {str(e)}") # 返回错误信息 return {rule: f"错误: {str(e)}" for rule in self.target_columns}, [{ 'row': 0, 'col': 0, 'col_name': '错误', 'message': error_msg }] 数据统计这里有点问题,规则1-18应该输出备注的值,例如符合规则的行的备注里面有3个14,2个15,3个2,4那么输出应该是2,3(换行)4,3(换行)14,3(换行)15,2,识别到x,x类的数据,应该两个数据计数都加1,但是现在只有被标红的那一是这么统计的,别的都是直接标的行数
最新发布
08-08
class SCLRuleProcessor: """SCL规则处理器,包含详细的颜色映射逻辑""" def __init__(self, color_detector=None): self.color_detector = color_detector or EnhancedColorDetector(tolerance=30) # 定义特定颜色 self.COLOR_CRIMSON = "E54C5E" # 猩红 self.COLOR_STEEL_BLUE = "B5C6EA" # 钢蓝 self.COLOR_CHOCOLATE = "F9CBAA" # 巧克力黄 # 固定位置 self.COLUMN_MAPPING = { "差分種別": 12, # L "变更内容": 13, # M "判断": 14, # N "判断理由": 15, # O "变更背景": 16, # P "备注": 17 # Q } # 新增规则的关键词 self.keywords = [ "波形図延長、非機能変更と判定されました。", "選択肢的补充说明,不属于功能变更。", "空白行追加され、非機能変更と判定された", "空行削除され、非機能変更と判定された", "无效更改,判定为无功能变更。", "書式変更で機能変更ではないと判断されました。", "仅修改了背景色,不影响软件设计,判定为无功能变更。" ] # 规则映射到目标 self.RULE_MAPPING = { # 规则1-18: 备注值统计 "diff_no_fill": 16, # P "diff_fill": 23, # W "diff_add_no_fill": 27, # AA "diff_add_fill": 30, # AD "diff_change_no_fill": 34, # AH "diff_change_fill": 37, # AK "diff_delete_no_fill": 42, # AP "diff_delete_fill": 45, # AS "valid_yes_no_fill": 50, # AX "valid_yes_fill": 53, # BA "valid_no_no_fill": 57, # BE "valid_no_fill": 60, # BH "valid_yes_reason_no_fill": 62, # BL "valid_yes_reason_fill": 65, # BO "valid_no_reason_no_fill": 71, # BS "valid_no_reason_fill": 74, # BV "background_no_fill": 78, # BZ "background_fill": 85, # CG, # 规则19-59: 计数统计 "rule19": 14, # N "rule20": 15, # O "rule21": 17, # Q "rule22": 18, # R "rule23": 19, # S "rule24": 20, # T "rule25": 21, # U "rule26": 22, # V "rule27": 25, # Y "rule28": 26, # Z "rule29": 28, # AB "rule30": 29, # AC "rule31": 32, # AF "rule32": 33, # AG "rule33": 35, # AI "rule34": 36, # AJ "rule35": 47, # AU "rule36": 48, # AV "rule37": 49, # AW "rule38": 51, # AY "rule39": 52, # AZ "rule40": 55, # BC "rule41": 56, # BD "rule42": 58, # BF "rule43": 59, # BG "rule44": 62, # BJ "rule45": 63, # BK "rule46": 65, # BM "rule47": 66, # BN "rule48": 69, # BQ "rule49": 70, # BR "rule50": 72, # BT "rule51": 73, # BU "rule52": 76, # BX "rule53": 77, # BY "rule54": 79, # CA "rule55": 80, # CB "rule56": 81, # CC "rule57": 82, # CD "rule58": 83, # CE "rule59": 84, # CF } self.HEADER_ROW = 3 # 表头固定在第三行 self.DATA_START_ROW = 4 # 数据从第四行开始 def get_cell_color_status(self, cell): """ 获取单元格的颜色状态 返回: (颜色名称, 颜色HEX值, 是否无填充) """ try: # 检查是否无填充 if self.color_detector.is_no_fill(cell): return "无填充", None, True # 获取单元格颜色 hex_color = self.color_detector.get_cell_color(cell) if not hex_color: return "未知", None, False # 检查是否为特定颜色 if self.color_detector.is_specific_color(cell, self.COLOR_CRIMSON): return "猩红", self.COLOR_CRIMSON, False if self.color_detector.is_specific_color(cell, self.COLOR_STEEL_BLUE): return "钢蓝", self.COLOR_STEEL_BLUE, False if self.color_detector.is_specific_color(cell, self.COLOR_CHOCOLATE): return "巧克力黄", self.COLOR_CHOCOLATE, False # 匹配最接近的已知颜色 closest_name = self.color_detector.match_color_name(hex_color) return closest_name, hex_color, False except Exception as e: logger.error(f"获取单元格颜色状态失败: {str(e)}") return "错误", None, False def contains_keyword(self, text): """检查文本是否包含任意关键词(不区分大小写)""" if not text: return False text = str(text).strip().lower() for keyword in self.keywords: if keyword.lower() in text: return True return False def split_note_values(self, note_value): """拆分备注值,支持多种分隔符""" if not note_value: return [] # 支持的分隔符:中文顿号、全角逗号、半角逗号、分号、空格 separators = ['、', ',', ',', ';', ';', ' '] # 替换所有分隔符为统一的分隔符 normalized = str(note_value) for sep in separators: normalized = normalized.replace(sep, '|') # 分割并过滤空值 values = [v.strip() for v in normalized.split('|') if v.strip()] return values def format_note_stats(self, data_dict): """格式化备注统计结果,确保每个值一行""" try: # 尝试按数值排序 sorted_items = sorted( data_dict.items(), key=lambda x: int(x[0]) if x[0].isdigit() else x[0] ) except Exception: # 如果无法转换为数字,则按字符串排序 sorted_items = sorted(data_dict.items()) # 格式化为每行一个值 return "\n".join([f"{value},{count}" for value, count in sorted_items]) def process_file(self, file_path): """ 处理单个SCL文件并返回所有统计结果 返回: (results, color_report) - results: 规则统计结果 - color_report: 颜色分析报告 """ results = {} missing_data = [] # 存储缺失数据信息 try: logger.info(f"开始处理SCL文件: {file_path}") # 加载SCL文件 scl_wb = openpyxl.load_workbook(file_path) scl_sheet = scl_wb.active logger.info(f"工作表加载成功: {scl_sheet.title}, 总行数: {scl_sheet.max_row}") # 检查是否有足够的数据行 if scl_sheet.max_row < self.DATA_START_ROW: logger.info("文件没有数据行,跳过处理") return results, "", missing_data # 初始化统计结果 stats = { # 规则1-18: 备注值统计 "diff_no_fill": defaultdict(int), # 规则1: 変更内容无颜色填充 "diff_fill": defaultdict(int), # 规则2: 変更内容有颜色填充 "diff_add_no_fill": defaultdict(int), # 规则3: 差分种别="追加"且无颜色填充 "diff_add_fill": defaultdict(int), # 规则4: 差分种别="追加"且有颜色填充 "diff_change_no_fill": defaultdict(int), # 规则5: 差分种别="変更"且无颜色填充 "diff_change_fill": defaultdict(int), # 规则6: 差分种别="変更"且有颜色填充 "diff_delete_no_fill": defaultdict(int), # 规则7: 差分种别="削除"且无颜色填充 "diff_delete_fill": defaultdict(int), # 规则8: 差分种别="削除"且有颜色填充 "valid_yes_no_fill": defaultdict(int), # 规则9: 判断="有意"且无颜色填充 "valid_yes_fill": defaultdict(int), # 规则10: 判断="有意"且有颜色填充 "valid_no_no_fill": defaultdict(int), # 规则11: 判断="無効"且无颜色填充 "valid_no_fill": defaultdict(int), # 规则12: 判断="無効"且有颜色填充 "valid_yes_reason_no_fill": defaultdict(int), # 规则13: 判断="有意"且理由无颜色填充 "valid_yes_reason_fill": defaultdict(int), # 规则14: 判断="有意"且理由有颜色填充 "valid_no_reason_no_fill": defaultdict(int), # 规则15: 判断="無効"且理由无颜色填充 "valid_no_reason_fill": defaultdict(int), # 规则16: 判断="無効"且理由有颜色填充 "background_no_fill": defaultdict(int), # 规则17: 背景无颜色填充 "background_fill": defaultdict(int), # 规则18: 背景有颜色填充, # 规则19-59: 计数统计 "rule19": 0, # 规则19: 包含关键词且无颜色填充 "rule20": 0, # 规则20: 不包含关键词且无颜色填充 "rule21": 0, # 规则21: 包含关键词且猩红填充 "rule22": 0, # 规则22: 不包含关键词且猩红填充 "rule23": 0, # 规则23: 包含关键词且钢蓝填充 "rule24": 0, # 规则24: 不包含关键词且钢蓝填充 "rule25": 0, # 规则25: 包含关键词且巧克力黄填充 "rule26": 0, # 规则26: 不包含关键词且巧克力黄填充 "rule27": 0, # L="追加"且无颜色填充且M包含关键词 "rule28": 0, # L="追加"且无颜色填充且M不包含关键词 "rule29": 0, # L="追加"且有颜色填充且M包含关键词 "rule30": 0, # L="追加"且有颜色填充且M不包含关键词 "rule31": 0, # L="変更"且无颜色填充且M包含关键词 "rule32": 0, # L="変更"且无颜色填充且M不包含关键词 "rule33": 0, # L="変更"且有颜色填充且M包含关键词 "rule34": 0, # L="変更"且有颜色填充且M不包含关键词 "rule35": 0, # L="差分無し"的计数 "rule36": 0, # N="有意"且无颜色填充且M包含关键词 "rule37": 0, # N="有意"且无颜色填充且M不包含关键词 "rule38": 0, # N="有意"且有颜色填充且M包含关键词 "rule39": 0, # N="有意"且有颜色填充且M不包含关键词 "rule40": 0, # N="無効"且无颜色填充且M包含关键词 "rule41": 0, # N="無効"且无颜色填充且M不包含关键词 "rule42": 0, # N="無効"且有颜色填充且M包含关键词 "rule43": 0, # N="無効"且有颜色填充且M不包含关键词 "rule44": 0, # N="有意"且O无颜色填充且M包含关键词 "rule45": 0, # N="有意"且O无颜色填充且M不包含关键词 "rule46": 0, # N="有意"且O有颜色填充且M包含关键词 "rule47": 0, # N="有意"且O有颜色填充且M不包含关键词 "rule48": 0, # N="無効"且O无颜色填充且M包含关键词 "rule49": 0, # N="無効"且O无颜色填充且M不包含关键词 "rule50": 0, # N="無効"且O有颜色填充且M包含关键词 "rule51": 0, # N="無効"且O有颜色填充且M不包含关键词 "rule52": 0, # P无颜色填充且M包含关键词 "rule53": 0, # P无颜色填充且M不包含关键词 "rule54": 0, # P颜色为猩红且M包含关键词 "rule55": 0, # P颜色为猩红且M不包含关键词 "rule56": 0, # P颜色为钢蓝且M包含关键词 "rule57": 0, # P颜色为钢蓝且M不包含关键词 "rule58": 0, # P颜色为巧克力黄且M包含关键词 "rule59": 0, # P颜色为巧克力黄且M不包含关键词 } # 遍历所有数据行 for row_idx in range(self.DATA_START_ROW, scl_sheet.max_row + 1): # 获取所有需要的单元格 diff_content_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["变更内容"]) diff_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["差分種別"]) note_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["备注"]) valid_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["判断"]) reason_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["判断理由"]) background_cell = scl_sheet.cell(row_idx, self.COLUMN_MAPPING["变更背景"]) # 获取单元格值 diff_value = str(diff_cell.value).strip() if diff_cell.value else "" note_value = str(note_cell.value).strip() if note_cell.value else "" valid_value = str(valid_cell.value).strip() if valid_cell.value else "" # 获取备注值并处理多值情况 note_values = self.split_note_values(note_value) # 获取M值 m_value = str(diff_content_cell.value) if diff_content_cell.value else "" # 检查是否包含关键词 contains_keyword = self.contains_keyword(m_value) # 获取单元格颜色状态 l_color_name, l_color_hex, l_no_fill = self.get_cell_color_status(diff_cell) m_color_name, m_color_hex, m_no_fill = self.get_cell_color_status(diff_content_cell) n_color_name, n_color_hex, n_no_fill = self.get_cell_color_status(valid_cell) o_color_name, o_color_hex, o_no_fill = self.get_cell_color_status(reason_cell) p_color_name, p_color_hex, p_no_fill = self.get_cell_color_status(background_cell) # 记录颜色信息用于调试 logger.debug(f"行 {row_idx} 颜色状态: " f"L={l_color_name}, " f"M={m_color_name}, " f"N={n_color_name}, " f"O={o_color_name}, " f"P={p_color_name}") # 规则1-18处理 # 规则1: 変更内容无颜色填充 if m_no_fill and note_values: for nv in note_values: stats["diff_no_fill"][nv] += 1 # 规则2: 変更内容有颜色填充 if not m_no_fill and note_values: for nv in note_values: stats["diff_fill"][nv] += 1 # 规则3: 差分种别="追加"且无颜色填充 if diff_value == "追加" and l_no_fill and note_values: for nv in note_values: stats["diff_add_no_fill"][nv] += 1 # 规则4: 差分种别="追加"且有颜色填充 if diff_value == "追加" and not l_no_fill and note_values: for nv in note_values: stats["diff_add_fill"][nv] += 1 # 规则5: 差分种别="変更"且无颜色填充 if diff_value == "変更" and l_no_fill and note_values: for nv in note_values: stats["diff_change_no_fill"][nv] += 1 # 规则6: 差分种别="変更"且有颜色填充 if diff_value == "変更" and not l_no_fill and note_values: for nv in note_values: stats["diff_change_fill"][nv] += 1 # 规则7: 差分种别="削除"且无颜色填充 if diff_value == "削除" and l_no_fill and note_values: for nv in note_values: stats["diff_delete_no_fill"][nv] += 1 # 规则8: 差分种别="削除"且有颜色填充 if diff_value == "削除" and not l_no_fill and note_values: for nv in note_values: stats["diff_delete_fill"][nv] += 1 # 规则9: 判断="有意"且无颜色填充 if valid_value == "有意" and n_no_fill and note_values: for nv in note_values: stats["valid_yes_no_fill"][nv] += 1 # 规则10: 判断="有意"且有颜色填充 if valid_value == "有意" and not n_no_fill and note_values: for nv in note_values: stats["valid_yes_fill"][nv] += 1 # 规则11: 判断="無効"且无颜色填充 if valid_value == "無効" and n_no_fill and note_values: for nv in note_values: stats["valid_no_no_fill"][nv] += 1 # 规则12: 判断="無効"且有颜色填充 if valid_value == "無効" and not n_no_fill and note_values: for nv in note_values: stats["valid_no_fill"][nv] += 1 # 规则13: 判断="有意"且理由无颜色填充 if valid_value == "有意" and o_no_fill and note_values: for nv in note_values: stats["valid_yes_reason_no_fill"][nv] += 1 # 规则14: 判断="有意"且理由有颜色填充 if valid_value == "有意" and not o_no_fill and note_values: for nv in note_values: stats["valid_yes_reason_fill"][nv] += 1 # 规则15: 判断="無効"且理由无颜色填充 if valid_value == "無効" and o_no_fill and note_values: for nv in note_values: stats["valid_no_reason_no_fill"][nv] += 1 # 规则16: 判断="無効"且理由有颜色填充 if valid_value == "無効" and not o_no_fill and note_values: for nv in note_values: stats["valid_no_reason_fill"][nv] += 1 # 规则17: 背景无颜色填充 if p_no_fill and note_values: for nv in note_values: stats["background_no_fill"][nv] += 1 # 规则18: 背景有颜色填充 if not p_no_fill and note_values: for nv in note_values: stats["background_fill"][nv] += 1 # 规则19-59处理 # 规则19: 包含关键词且无颜色填充 if contains_keyword and m_no_fill: stats["rule19"] += 1 # 规则20: 不包含关键词且无颜色填充 if not contains_keyword and m_no_fill: stats["rule20"] += 1 # 规则21: 包含关键词且猩红填充 if contains_keyword and m_color_name == "猩红": stats["rule21"] += 1 # 规则22: 不包含关键词且猩红填充 if not contains_keyword and m_color_name == "猩红": stats["rule22"] += 1 # 规则23: 包含关键词且钢蓝填充 if contains_keyword and m_color_name == "钢蓝": stats["rule23"] += 1 # 规则24: 不包含关键词且钢蓝填充 if not contains_keyword and m_color_name == "钢蓝": stats["rule24"] += 1 # 规则25: 包含关键词且巧克力黄填充 if contains_keyword and m_color_name == "巧克力黄": stats["rule25"] += 1 # 规则26: 不包含关键词且巧克力黄填充 if not contains_keyword and m_color_name == "巧克力黄": stats["rule26"] += 1 # 规则27: L="追加"且无颜色填充且M包含关键词 if diff_value == "追加" and l_no_fill and contains_keyword: stats["rule27"] += 1 # 规则28: L="追加"且无颜色填充且M不包含关键词 if diff_value == "追加" and l_no_fill and not contains_keyword: stats["rule28"] += 1 # 规则29: L="追加"且有颜色填充且M包含关键词 if diff_value == "追加" and not l_no_fill and contains_keyword: stats["rule29"] += 1 # 规则30: L="追加"且有颜色填充且M不包含关键词 if diff_value == "追加" and not l_no_fill and not contains_keyword: stats["rule30"] += 1 # 规则31: L="変更"且无颜色填充且M包含关键词 if diff_value == "変更" and l_no_fill and contains_keyword: stats["rule31"] += 1 # 规则32: L="変更"且无颜色填充且M不包含关键词 if diff_value == "変更" and l_no_fill and not contains_keyword: stats["rule32"] += 1 # 规则33: L="変更"且有颜色填充且M包含关键词 if diff_value == "変更" and not l_no_fill and contains_keyword: stats["rule33"] += 1 # 规则34: L="変更"且有颜色填充且M不包含关键词 if diff_value == "変更" and not l_no_fill and not contains_keyword: stats["rule34"] += 1 # 规则35: L="差分無し"的计数 if diff_value == "差分無し": stats["rule35"] += 1 # 规则36: N="有意"且无颜色填充且M包含关键词 if valid_value == "有意" and n_no_fill and contains_keyword: stats["rule36"] += 1 # 规则37: N="有意"且无颜色填充且M不包含关键词 if valid_value == "有意" and n_no_fill and not contains_keyword: stats["rule37"] += 1 # 规则38: N="有意"且有颜色填充且M包含关键词 if valid_value == "有意" and not n_no_fill and contains_keyword: stats["rule38"] += 1 # 规则39: N="有意"且有颜色填充且M不包含关键词 if valid_value == "有意" and not n_no_fill and not contains_keyword: stats["rule39"] += 1 # 规则40: N="無効"且无颜色填充且M包含关键词 if valid_value == "無効" and n_no_fill and contains_keyword: stats["rule40"] += 1 # 规则41: N="無効"且无颜色填充且M不包含关键词 if valid_value == "無効" and n_no_fill and not contains_keyword: stats["rule41"] += 1 # 规则42: N="無効"且有颜色填充且M包含关键词 if valid_value == "無効" and not n_no_fill and contains_keyword: stats["rule42"] += 1 # 规则43: N="無効"且有颜色填充且M不包含关键词 if valid_value == "無効" and not n_no_fill and not contains_keyword: stats["rule43"] += 1 # 规则44: N="有意"且O无颜色填充且M包含关键词 if valid_value == "有意" and o_no_fill and contains_keyword: stats["rule44"] += 1 # 规则45: N="有意"且O无颜色填充且M不包含关键词 if valid_value == "有意" and o_no_fill and not contains_keyword: stats["rule45"] += 1 # 规则46: N="有意"且O有颜色填充且M包含关键词 if valid_value == "有意" and not o_no_fill and contains_keyword: stats["rule46"] += 1 # 规则47: N="有意"且O有颜色填充且M不包含关键词 if valid_value == "有意" and not o_no_fill and not contains_keyword: stats["rule47"] += 1 # 规则48: N="無効"且O无颜色填充且M包含关键词 if valid_value == "無効" and o_no_fill and contains_keyword: stats["rule48"] += 1 # 规则49: N="無効"且O无颜色填充且M不包含关键词 if valid_value == "無効" and o_no_fill and not contains_keyword: stats["rule49"] += 1 # 规则50: N="無効"且O有颜色填充且M包含关键词 if valid_value == "無効" and not o_no_fill and contains_keyword: stats["rule50"] += 1 # 规则51: N="無効"且O有颜色填充且M不包含关键词 if valid_value == "無効" and not o_no_fill and not contains_keyword: stats["rule51"] += 1 # 规则52: P无颜色填充且M包含关键词 if p_no_fill and contains_keyword: stats["rule52"] += 1 # 规则53: P无颜色填充且M不包含关键词 if p_no_fill and not contains_keyword: stats["rule53"] += 1 # 规则54: P颜色为猩红且M包含关键词 if p_color_name == "猩红" and contains_keyword: stats["rule54"] += 1 # 规则55: P颜色为猩红且M不包含关键词 if p_color_name == "猩红" and not contains_keyword: stats["rule55"] += 1 # 规则56: P颜色为钢蓝且M包含关键词 if p_color_name == "钢蓝" and contains_keyword: stats["rule56"] += 1 # 规则57: P颜色为钢蓝且M不包含关键词 if p_color_name == "钢蓝" and not contains_keyword: stats["rule57"] += 1 # 规则58: P颜色为巧克力黄且M包含关键词 if p_color_name == "巧克力黄" and contains_keyword: stats["rule58"] += 1 # 规则59: P颜色为巧克力黄且M不包含关键词 if p_color_name == "巧克力黄" and not contains_keyword: stats["rule59"] += 1 # 处理统计结果 for rule, data in stats.items(): # 对于规则1-18,输出备注值及其出现次数 if rule in ["diff_no_fill", "diff_fill", "diff_add_no_fill", "diff_add_fill", "diff_change_no_fill", "diff_change_fill", "diff_delete_no_fill", "diff_delete_fill", "valid_yes_no_fill", "valid_yes_fill", "valid_no_no_fill", "valid_no_fill", "valid_yes_reason_no_fill", "valid_yes_reason_fill", "valid_no_reason_no_fill", "valid_no_reason_fill", "background_no_fill", "background_fill"]: # 检查是否有数据 if not data: # 字典为空 results[rule] = "/" logger.info(f"{rule}: 无数据,输出 '/'") continue # 格式化备注统计结果 results[rule] = self.format_note_stats(data) # 优化日志输出:分行显示 logger.info(f"{rule}: 结果:") for line in results[rule].split('\n'): logger.info(f" {line}") else: # 对于规则19-59,直接输出计数值 results[rule] = str(data) logger.info(f"{rule}: 结果 {results[rule]}") # 生成颜色报告 color_report = self.color_detector.generate_color_report() logger.info("\n" + color_report) return results, color_report, missing_data except Exception as e: error_msg = f"处理SCL文件失败: {str(e)}" logger.exception(f"处理SCL文件失败: {file_path} - {str(e)}") # 返回错误信息 return {rule: f"错误: {str(e)}" for rule in self.RULE_MAPPING}, f"错误: {error_msg}", [{ 'row': 0, 'col': 0, 'col_name': '错误', 'message': error_msg }] 两个问题 第一个:只有M和P要判断特殊颜色,别的只用判断有无填充 第二个:日志里2025-08-06 23:14:41 - SCLProcessor - DEBUG - 行 4 颜色状态: L=无填充, M=猩红, N=无填充, O=无填充, P=无填充 但是我查看原文件,该单元格的填充颜色为钢蓝,色号为B4C6E7,并且基本上所有的钢蓝色号都被错误的判断成了猩红,真正的猩红反而判断不出来
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值