【问题标题】:Convert column with mixed data to string将具有混合数据的列转换为字符串
【发布时间】:2020-01-23 13:14:24
【问题描述】:

我有一个 1 列的 excel 文件,该列包含混合数据、int 和字符串。


从 excel 文件中读取数据后,我看到数据为 AZ-965 的单元格为空。 这是我的字符串连接

return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                                   + excel + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0;';");

这就是我从 Excel 文件中读取数据的方式

private static List<T> GetImportedData<T>(string sheet, OleDbConnection myConnection,
        List<string> column, ImportDataView<T> view) where T : IImportableData
    {
        var cols = string.Join( ",", column.Select(Cast));
        var formattableString = $"select {cols} from [{sheet}$]";
        using (var MyCommand = new 
            OleDbDataAdapter(formattableString, myConnection))
        {
            using (var DtSet = new DataSet())
            {
                int nbRow = 0;
                MyCommand.Fill(DtSet);
                var dt = DtSet.Tables[0];
                var rows = dt.AsEnumerable();
                var convertedList = rows
                    //.AsParallel()
                    .Select(x => GenerateImport<T>(x, column, ref nbRow, view))
                    .ToList();
                return convertedList;
            }
        }
    }

    private static string Cast(string arg)
    {
      return $"IIf(IsNull([{arg}]), '', CStr([{arg}]))";
     // return $"CStr([{arg}]) as {cleanName(arg)}";
     //return $"[{arg}]";
    }

我检查了这个link,但没有任何工作,同样的问题

【问题讨论】:

    标签: c# excel oledbconnection


    【解决方案1】:

    连接字符串中的TypeGuessRows 不是连接字符串属性,至少我不知道。这是一个注册表项:

    https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/initializing-the-microsoft-excel-driver?tabs=office-2016

    所以我不认为它在做你认为的那样......或任何事情。

    如果您无法控制注册表或文件的内容,我唯一的建议是将连接字符串 (HDR=YES) 中的 header 属性更改为“no”,以便它将第一条记录读取为text... 那么你可以有效地丢弃第一行。

    这不是一个很好的解决方案,但它应该可以满足您的需求。

    或者,您可以尝试使用DbDataReader 而不是使用数据适配器来读取内容:

    using (OleDbCommand cmd = new OleDbCommand(formattableString, conn))
    {
        using (OleDbDataReader reader = cmd.ExecuteReader())
        {
            string column = reader.IsDBNull(0) ? null : reader.GetValue(0).ToString();
        }
    }
    

    根据我对您正在尝试做的事情的推断,数据阅读器实际上可能还提供一些其他优势。

    【讨论】:

    • 我认为您将 HDR 设置为 NO 是正确的,然后删除第一行,我认为这是唯一对我有帮助的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2021-02-26
    • 2021-12-19
    相关资源
    最近更新 更多