Преобразовать столбец со смешанными данными в строку - PullRequest
1 голос
/ 23 января 2020

У меня есть файл Excel с 1 столбцом, столбец содержит смешанные данные, int & string. 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}]";
    }

Я проверяю эту ссылку , но ничего не работает, то же самое isue

1 Ответ

1 голос
/ 25 января 2020

TypeGuessRows в строке подключения не является свойством строки подключения, по крайней мере, я не в курсе. Это ключ реестра:

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

Так что я не думаю, что он делает то, что вы думаете ... или что-то в этом роде.

Если вы не можете контролировать реестр или содержимое файла, мое единственное предложение - изменить свойство заголовка в строке подключения (HDR=YES) на «нет», чтобы оно читало первую запись в как текст ... тогда вы можете эффективно обработать sh первый ряд.

Это не очень хорошее решение, но оно должно делать то, что вы ищете.

В качестве альтернативы, вы можете попробовать прочитать содержание, использующее DbDataReader вместо использования адаптера данных:

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

Исходя из моих выводов о том, что вы пытаетесь сделать, программа чтения данных может фактически предложить и другие преимущества.

...