m0_68143210 2024-09-18 22:45 采纳率: 0%
浏览 6
已结题

关于#c##的问题:在读取xlsx文件时报错:对象需为bool值,只在读取个别行时出现

unity在读取xlsx文件时出现字符串无法被识别为合法的bool值,但是代码中并未出现关于bool值的要求
以下为代码片段

using (ExcelPackage excelpackage = new ExcelPackage(fileInfo))
        {
            if (excelpackage == null)
            {
                Debug.LogError("Failed to open Excel package.");
                return;
            }

            ExcelWorksheet worksheet = excelpackage.Workbook.Worksheets["sheet1"];
            
            for (int row = worksheet.Dimension.Start.Column + 3; row <= worksheet.Dimension.End.Row; row++)
            {
                LevelItem levelItem = new LevelItem();
                Type type = typeof(LevelItem);
                for (int j = worksheet.Dimension.Start.Row; j <= worksheet.Dimension.End.Column; j++)
                {
                    try
                    {
                        string fieldName = worksheet.Cells[2, j].Text;
                        if (string.IsNullOrEmpty(fieldName))
                        {
                            continue; // 跳过空字段名
                        }

                        FieldInfo variable = type.GetField(fieldName);
                        if (variable == null)
                        {
                            Debug.LogWarning("Field not found: " + fieldName);
                            continue; // 跳过找不到的字段
                        }

                        string tableValue = worksheet.Cells[row, j].Text.ToString();
                        

                        object value = Convert.ChangeType(tableValue, variable.FieldType);
                        Debug.Log(row+"  "+j+"  "+variable.FieldType);
                        variable.SetValue(levelItem, value);
                    }
                    catch (Exception ex)
                    {
                        Debug.LogError("Error processing row " + row + ", column " + j + ": " + ex.Message);
                        
                    }
                }
                levelData.levelDataList.Add(levelItem);
            }
        }

报错如下:
Error processing row 4, column 6: String was not recognized as a valid Boolean.
UnityEngine.Debug:LogError (object)
Startup:.cctor () (at Assets/Editor/ReadTable.cs:69)
UnityEditor.EditorAssemblies:ProcessInitializeOnLoadAttributes (System.Type[])

测试表格如下:

img

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-18 22:46
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的代码和报错信息来看,错误发生在试图将某个字符串转换为布尔值时。Unity中的Convert.ChangeType方法尝试将字符串转换为指定的类型,但如果字符串无法被解析为有效的布尔值,就会抛出异常。在你的情况下,看起来是在尝试将某些字段(如"是否属于波次")从字符串转换为布尔值时出现的问题。

    在Excel表格中,"是否属于波次"这一列的值可能包含一些非标准的字符串,例如“可能”,“也许”等,这些字符串无法被Convert.ChangeType方法识别为有效的布尔值。你需要确保这一列的值只包含"true"和"false",或者1和0(取决于你的程序如何解析这些值)。

    你可以修改你的代码,在尝试将字符串转换为布尔值之前,先检查字符串是否可以转换为布尔值。如果无法转换,可以设置一个默认值或者跳过这个字段。这里是一个示例:

    string tableValue = worksheet.Cells[row, j].Text.ToString();
    if (bool.TryParse(tableValue, out bool valueAsBool)) 
    {
        // 如果字符串可以转换为布尔值,使用转换的值
        variable.SetValue(levelItem, valueAsBool);
    } 
    else 
    {
        // 如果字符串无法转换为布尔值,设置一个默认值或者跳过这个字段
        Debug.LogWarning("无法将字段 " + fieldName + " 的值 " + tableValue + " 转换为布尔值。使用默认值或跳过此字段。");
        // 可以设置一个默认值,例如:
        // variable.SetValue(levelItem, false); // 或者 true,根据你的需求
    }
    

    这样,如果某个字段的值无法转换为布尔值,你的程序会打印一条警告信息,并使用一个默认值或者跳过这个字段,而不是抛出异常。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月24日
  • 创建了问题 9月18日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?