Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Main() {
- var wb = LoadWorkbook(@"D:\Downloads\EU.xlsx");
- var tree1 = ProccessBlock<Premium>(wb.Worksheets["Output"], 50, 1);
- var tree2 = ProccessBlock<Premium>(wb.Worksheets["Validation"], 5, 1);
- var a = new Premium();
- tree1(wb.Worksheets["Output"], a);
- a.Dump();
- var b = new Premium();
- tree2(wb.Worksheets["Validation"], b);
- b.Dump();
- }
- Action<Worksheet, T> ProccessBlock<T>(Worksheet templateWorksheet, int topRow, int leftColumn) {
- List<Action<Worksheet, T>> actions = new List<Action<Worksheet, T>>();
- int row = topRow;
- while (true) {
- string elementName = "";
- int height = 0;
- var value = templateWorksheet[row, leftColumn].Value;
- if (value.IsEmpty) {
- break;
- } else {
- elementName = value.TextValue.RemoveWhiteSpaces();
- if (elementName.EndsWith(CollectionSuffix)) {
- var result = ParseToCollection<T>(templateWorksheet, elementName, row, leftColumn);
- height = result.Item2;
- actions.Add(result.Item1);
- } else if (elementName.EndsWith(TableSuffix)) {
- var result = ParseToTable<T>(templateWorksheet, elementName, row, leftColumn);
- height = result.Item2;
- actions.Add(result.Item1);
- } else {
- var transformation = ParseToSingleElement<T>(elementName, row, leftColumn);
- actions.Add(transformation);
- height = 1;
- }
- }
- row += height + 1; // +1 for the empty row under the collection
- }
- return (worksheet, obj) => {
- actions.ForEach(x => x(worksheet, obj));
- };
- }
- Action<Worksheet, T> ParseToSingleElement<T>(string elementName, int row, int leftColumn) {
- var property = typeof(T).GetProperty(elementName);
- return (worksheet, x) => property.SetValue(x, worksheet[row, leftColumn + 1].Value.ToString());
- }
- (Action<Worksheet, T>, int) ParseToTable<T>(Worksheet templateWorksheet, string tableName, int topRow, int leftColumn) {
- var tableBodyRow = topRow + 1;
- var property = typeof(T).GetProperty(tableName);
- var propertyType = property.PropertyType;
- //get labels from the area under table header
- var labelsColumn = templateWorksheet.Columns[leftColumn];
- List<CellValue> labels = GetColumnValuesUntilEmpty(labelsColumn, tableBodyRow);
- var totalTableHeight = labels.Count + 1; // +1 for the header of the table
- return ((worksheet, obj) => {
- var propertyValue = Activator.CreateInstance(propertyType);
- //get element properties from the column to the right of lables
- var elementColumn = worksheet.Columns[leftColumn + 1];
- propertyValue = GetElement(propertyType, labels, elementColumn, tableBodyRow);
- property.SetValue(obj, propertyValue);
- }
- , totalTableHeight);
- }
- (Action<Worksheet, T>, int) ParseToCollection<T>(Worksheet templateWorksheet, string collectionName, int topRow, int leftColumn) {
- var property = typeof(T).GetProperty(collectionName);
- var propertyType = property.PropertyType.GetGenericArguments()[0];
- Type listType = typeof(List<>).MakeGenericType(propertyType);
- var (transformation, elementsHeight) = GetCollectionElements(templateWorksheet, propertyType, topRow + 1, leftColumn);
- var totalCollectionHeight = elementsHeight + 1; // +1 for the header of the collection
- return ((worksheet, obj) => {
- var list = (IList)Activator.CreateInstance(listType);
- // get collection elements from the area under the header of the collection
- transformation(worksheet, list);
- property.SetValue(obj, list);
- }
- , totalCollectionHeight);
- }
- (Action<Worksheet, IList>, int) GetCollectionElements(Worksheet templateWorksheet, Type type, int topRow, int leftColumn) {
- var labelsColumn = templateWorksheet.Columns[leftColumn];
- List<CellValue> labels = GetColumnValuesUntilEmpty(labelsColumn, topRow);
- return ((worksheet, list) => {
- // get collection elements from the area to the right of labels column
- for (int columnIndex = leftColumn + 1; ; columnIndex++) {
- var elementColumn = worksheet.Columns[columnIndex];
- var element = GetElement(type, labels, elementColumn, topRow);
- if (element != null) {
- list.Add(element);
- } else {
- //right edge of the collection reached
- break;
- }
- }
- }
- , labels.Count);
- }
- object GetElement(Type type, List<CellValue> labels, DevExpress.Spreadsheet.Column elementColumn, int topRow) {
- var propertyValues = GetColumnValuesUntilEmpty(elementColumn, topRow);
- if (propertyValues.Count == 0) {
- return null;
- } else {
- var element = Activator.CreateInstance(type);
- for (int i = 0; i < labels.Count; i++) {
- var property = type.GetProperty(labels[i].TextValue);
- var propertyType = property.PropertyType;
- var propertyValue = Convert.ChangeType(propertyValues[i].ToObject(), propertyType);
- property.SetValue(element, propertyValue);
- }
- return element;
- }
- }
- List<CellValue> GetColumnValuesUntilEmpty(DevExpress.Spreadsheet.Column column, int topRow) {
- var values = new List<CellValue>();
- for (int row = topRow; ; row++) {
- var value = column[row].Value;
- if (value.IsEmpty) {
- //bottom reached
- break;
- } else {
- values.Add(value);
- }
- }
- return values;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement