将具有混合数据的列转换为字符串

Convert column with mixed data to string

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


从 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,但没有任何效果,同样的问题

您的连接字符串中的 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" 以便它以文本形式读取第一条记录...然后您可以有效地丢弃第一行。

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

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

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

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