Файл форумчане столбцы в Excel


Я ищу способы, чтобы улучшить этот код (более читабельным, менее избыточным и может быть чище/быстрее).

Проблему мне нужно решить:

Я был назначен, чтобы реализовать программное обеспечение, которое будет проверять столбец 96 Excel файл и если там нет ошибок, создайте XML-файл из него. В случае возникновения ошибки в файле Excel у меня есть для отображения их пользователю и указывает, где возникла проблема.

Как я пытался решить проблему:

Поскольку я знал, что номера столбцов, я думал о том, чтобы класс, который представляет собой ячейку файла Excel и содержать строковое свойство, чтобы провести, возможно, описание ошибки, делая, что это сделает его легким для отображения журнала ошибок. Поэтому я собственно и создал 2 коллекции моего класса, который называется сотовый. Одной коллекции для хранения всех значений ячеек в Excel, и другое-ошибки в журнале одном.

Вот клетка код класса:

public class Cell
{
    public string Value { get; set; }
    public int Row { get; set; }
    public int Column { get; set; }
    public string ErrorDescription { get; set; }
}

Это клеткаколлекция:

Range worksheetCells = sheet.get_Range(firstCell, lastCell);
private List<Cell> Cells = new List<Cell>();

foreach (Range item in worksheetCells)
{
     Cells.Add(new Cell{ Value = item.Text, Row = item.Row, Column = item.Column});             
}

Для удобочитаемости целей, я могу создать еще 96 сборники ячейки, по одному для каждого столбца:

var Name = Cells.Where(c => c.Column == 1);
....

Я создал 96 способы проверки одного столбца/коллекция:

private void NameValidation(IEnumerable<Cell> excelColumn, List<Cell> log)
{
    foreach (Cell item in excelColumn)
    {
        if (string.IsNullOrEmpty(item.Value))
        {
            item.ErrorDescription = "You need to fill up this Cell.";
        }
        else
        {
            if (item.Value.Length > 27)
            {
                item.ErrorDescription = "The MAX length of this field is 27 characters.";
            }
        }

        if (!string.IsNullOrEmpty(item.ErrorDescription))
        {
            log.Add(item);
        }
    }
}

В основном это то, что у меня сейчас. Я не касаюсь XML-файл творения, но причина, почему я создал мой код, как это, что я могу использовать способ проверки для создания XML, вместо того, чтобы сделать еще 96 по каждому элементу высказывания. Я бы только создать XML-файл, когда после вызова всех методов проверки, если войти.граф возвращает 0, так что это ОК, чтобы создать файл.

Что тревожит мой ум:

Мне действительно нужно сделать 96 все время?

в 60% валидация методов мне нужно проверить строку.IsNullOrEmpty(пункт.Значение) и скопировать и вставить убивает меня, это заставляет меня чувствовать, что я делаю что-то неправильно, понимаешь?

В некоторые из этих методов, пункт.значение является обязательным только если другая ячейка заполнена. Если это так, то текущая ячейка является обязательным. Вот почему я не один метод, чтобы проверить, если поле является обязательным, потому что это зависит от других вещей. В 30% из методов проверки, я должен проверять товар.Значение.Длина > "что-то".

У вас есть какие-либо идеи о том, как некоторые из тех, если/еще выходит?



15487
14
задан 13 августа 2011 в 07:08 Источник Поделиться
Комментарии
3 ответа

Если вы окажетесь повторяя методы, которые часто, тогда да, вам нужно найти шаблон, который значительно упрощает вашу работу. Что сказал, Я думаю, было бы лучшим решением, чем загрузка наборы ячеек в Столбцах.

Взгляните на этот образец: проверить лист Excel

Согласен, пример кода на другом конце связи-это проверка таблицы Excel перед вставкой в хранилище данных SQL. Но суть та же.

Я бы запрос и держать в объект DataTable. Свойства могут быть заданы для каждого столбца, которые позволяют гораздо проще валидации данных. Кроме того, вам не придется писать код для управления коллекциями.

5
ответ дан 13 августа 2011 в 08:08 Источник Поделиться

Рассмотрите возможность использования пользовательских атрибутов.
Вот возможный вариант:
Создать класс, представляющий данные из файла Excel и украсить его атрибутами.

    public class ExcelData
{
[ExcelColumn("Name")]
[Required]
[MaxLength(27)]
public string Name { get; set; }

[ExcelColumn("NextColumn")]
[Required]
public string NextColumn { get; set; }
//...another 94 property.
}

Затем создайте класс, который получает Excel и возвращает список этих данных с помощью атрибута ExcelColumn.

    public class ExcelParser
{
public IEnumerable<ExcelData> Parse(string fileName)
{
//Get file and return ExcelData, using ExcelColumn attribute.
}
}

Затем создайте класс для преобразования этих данных в формат XML.

public class ExcelDataToXmlConverter
{
private ExcelDataValidator _validator = new ExcelDataValidator();

public XDocument Convert(IEnumerable<ExcelData> excelData)
{
foreach (var data in excelData)
{
var errors = new Dictionary<string, List<string>>();
if (_validator.IsValid(data, out errors))
{
//Convert the row to XML
}
else
{
//Do something with errors.
}
}
}
}

public class ExcelDataValidator
{
//errors - is a list of errors where the key is the name of the field and value is the list of errors.
public bool IsValid(ExcelData excelData, out Dictionary<string, List<string>> errors)
{
//Validate using different attributes: Required, MaxLength and so on.
}
}

Возможно, вы сможете использовать атрибуты для фактического преобразования данных в XML.
Конечно, это всего лишь очень грубый набросок, и только некоторые ее части могут быть полезны для вас, но я надеюсь, ты уловил идею.

5
ответ дан 13 августа 2011 в 09:08 Источник Поделиться

Редактировать: вы, возможно, желаете нам библиотеки и функции, чтобы возвратить строку, а не bool как вы заявили, Вы хотите описательный проверке, вместо того, чтобы просто если для boolean значение true, вы сделали бы если в AllCellsAreValid, вы бы если(!строку.IsNullOrEmpty(columnValidatorMap[cellToValidate.Колонки](cellToValidate)))

Снова редактировать: также, вы создаете 96 листов-вы сказали, что я думаю? просто создать один список с каждой клетке независимо от столбца, и когда вы вручите этот список, чтобы валидатор, который проверяет все ячейки, это будет просто использовать элемент столбца ячейки, чтобы найти правильный валидатор в словаре.

Попробуйте это создать метод проверки для различных типов проверки вы будете делать и сопоставить их со столбцами вроде так:

    public static Func<Cell, bool> LengthValidator(int minLength, int maxLength)
{
return (Func<Cell, bool>)((cellParam) => { return (cellParam.Value.Length > minLength) && (cellParam.Value.Length < maxLength); });
}

public static Func<Cell, bool> NullnessValidator(bool shouldBeNull)
{
return (Func<Cell, bool>)((cellParam) => { return ((cellParam == null) == shouldBeNull); });
}

public static Func<Cell, bool> MultipleValidators(params Func<Cell, bool>[] validatorPredicates)
{
return (Func<Cell, bool>)((cellParam) =>
{
foreach(Func<Cell,bool> validator in validatorPredicates)
{
if(!validator(cellParam))
{
return false;
}
}
return true;
});
}

public static Dictionary<int, Func<Cell, bool>> columnValidatorMap = new Dictionary<int, Func<Cell, bool>>()
{
{ 1, MultipleValidators(LengthValidator(1, 27), NullnessValidator(false)) },
{ 2, MultipleValidators(LengthValidator(1, 27), NullnessValidator(false)) }
};

public bool AllCellsAreValid(IEnumerable<Cell> cellsToValidate)
{
foreach(Cell cellToValidate in cellsToValidate)
{
if (!columnValidatorMap[cellToValidate.Column](cellToValidate))
{
return false; // or return some information if you want
}
}

return true;
}

2
ответ дан 13 августа 2011 в 09:08 Источник Поделиться