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

时间:2020-01-23 13:14:24

标签: c# excel oledbconnection

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


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

1 个答案:

答案 0 :(得分: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”,以便它读取第一条记录。作为文本输入...然后您可以有效地删除第一行。

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

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

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

根据我对您要执行的操作的推断,数据读取器实际上还可以提供其他一些优点。