Проверьте, если имя столбца с данными является именем столбца по умолчанию C # - PullRequest
1 голос
/ 27 сентября 2019

Мне нужно было скопировать данные Excel в DataTable пример, скопированный из этого. Если имя столбца является пустой строкой, когда данные попадают в DataTable, пустое имя преобразуется в динамическое имякак F1, F3, F22.Если имя столбца имеет допустимое значение, это нормально, но когда я пытаюсь получить имя столбца с пустым именем столбца, динамическое имя F22 получает.F22 не существует в листе Excel, я должен сообщить пользователю, что у него есть пустое имя столбца, которое недопустимо.

Итак, вопрос в том, как определить, является ли имя столбца динамически установленным OLEDB?

DataColumnCollection excelDataColumns;
....
for (int i = 3; i < excelDataColumns.Count; i++) {
    var columnName = excelDataColumns[i].ColumnName;

    // Check if column name is blank
    if (IsExcelDefaultColumnName(excelDataColumns[i], i))
    {
        invalidEntries.Add("Blank column name");
    }
    else
    {
        var result = IsValidData(GetFullData(columnName));
        if (!result.Item1 && !columnName.Any(char.IsDigit))
        {
             invalidEntries.Add(columnName);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

если вы можете использовать взаимодействие Excel.Application, то при выборе и проверке первой строки будет показано, что в столбцах столбцов отсутствует имя, например:

    public  void CheckExcelColumnName(string sourceFile)
    {
            if (!System.IO.File.Exists(sourceFile))
            {
            throw new System.ArgumentException("source file is missing");
            }

        try
        {
            Type excelType = Type.GetTypeFromProgID("Excel.Application");
            dynamic excel = Activator.CreateInstance(excelType);

            if (excel == null)
            {
                throw new System.Exception("Excel is missing");
            }

            excel.Workbooks.Open(sourceFile);
            try
            {
                dynamic workbook = excel.Workbooks[1];
                dynamic worksheets = workbook.Sheets;
                dynamic worksheet = worksheets[1];
                dynamic cells = worksheet.Cells;

                int xlCellTypeLastCell = 11;
                dynamic lastfilledcell = cells.SpecialCells(xlCellTypeLastCell, Type.Missing);
                int lastcolumn = lastfilledcell.Column;

                dynamic range = worksheet.Range("A1", "A1");//
                var v = range.EntireRow.Value;
                for(int c=1;c<= lastcolumn;c++)
                {
                    if ( v[1,c]==null)
                    {
                        Console.WriteLine("excel sheet is missing column name for column #" + c);
                        break;
                    }
                }

                workbook.Close();

                lastfilledcell = null;
                cells = null;
                range = null;
                worksheet = null;
                worksheets = null;
                workbook = null;

            }
            catch {; }

            excel.Quit();
            //try { System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); } catch {; }
            try { System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excel); } catch {; }
            excel = null;

        }
        catch(Exception ex)
        {

        }
    }
0 голосов
/ 27 сентября 2019

Попробуйте использовать EPPLUS. Вы можете решить свою проблему с помощью Epplus очень легко.

0 голосов
/ 27 сентября 2019

Мне кажется, я понимаю этот вопрос, так как вам нужно прочитать схему базы данных, чтобы определить, есть ли имя столбца в таблице?(это правильно?)

Если у вас есть доступ к базе данных SQL Server через строку подключения, у меня есть инструмент, который читает схему базы данных.

Это пример из моего проекта с открытым исходным кодомDataTier.Net https://github.com/DataJuggler/DataTier.Net (конечный плагин)

Используется пакет Nuget: DataJuggler.Net

// read database schema
database = sqlConnector.LoadDatabaseSchema(database);

База данных имеет коллекцию таблиц, а каждая таблица имеет коллекцию Fields.

Класс SQL Database Connector выполняет LoadDatabaseSchema:

Код пакета Nuget находится здесь: https://github.com/DataJuggler/DataJuggler.Net

Или версия Dot Net Core: https://github.com/DataJuggler/DataJuggler.Net.Core

Приведенный выше пакет Nuget также используется в DB Compare для сравнения схемы базы данных двух баз данных SQL Server и сообщения о любых различиях:

https://github.com/DataJuggler/DBCompare

Надеемся, что никто не считает этот спам Iотдайте все это бесплатно, и я только пытаюсь ответить на вопрос «Как вы читаете схему базы данных», чтобы в этом случае он мог определить, является ли имя столбца реальным именем столбца.Я думаю, что я правильно истолковал этот вопрос, если не объясните, что вам нужно лучше, пожалуйста.

...