/// <summary> /// Ecrit une ligne démarrant à la cellule courante. /// Les valeurs de cellules sont lues dans l'ordre des propriétés du bean <code>row</code>. /// </summary> /// <typeparam name="TRow">Type de la ligne.</typeparam> /// <param name="row">Bean de la ligne.</param> /// <returns>Le builder.</returns> public ExcelTemplateBuilder WriteRow <TRow>(TRow row) { var def = BeanDescriptor.GetDefinition(row); var initialColumn = _currentCell.ColumnName; /* Parcourt des propriétés du bean. */ foreach (var propDesc in def.Properties) { /* Valeur de la propriété pour le bean. */ object value = propDesc.GetValue(row); var cellValue = CellValues.SharedString; /* Cas d'une cellule vide. */ var strValue = value == null ? string.Empty : value.ToString(); /* Cas d'un decimal. */ if (propDesc.PrimitiveType == typeof(decimal)) { cellValue = CellValues.Number; strValue = strValue.Replace(" ", string.Empty).Replace(",", "."); } /* Ecrit dans la cellule courante. */ WriteCellCore(strValue, cellValue); /* Passe à la colonne suivante. */ _currentCell = _currentCell.ShiftColumn(1); } /* On retourne à la cellule initiale de la ligne. */ _currentCell = _currentCell.ChangeColumn(initialColumn); return(this); }
/// <summary> /// Récupère la liste des lignes du tableau excel sous le format du type passé en paramètre. /// </summary> /// <typeparam name="TRow">Le type de l'objet de retour.</typeparam> /// <returns>La liste des lignes du fichier Excel.</returns> public ICollection <TRow> ReadRows <TRow>() where TRow : new() { var initialRow = _currentCell.RowIndex; var rows = new List <TRow>(); /* Parcourt les lignes. */ while (true) { /* On lit la ligne. */ var row = ReadRow <TRow>(); if (row == null) { break; } rows.Add(row); /* Passe à la ligne suivante. */ _currentCell = _currentCell.ShiftRow(1); } /* Retourne à la première ligne. */ _currentCell = _currentCell.ChangeRow(initialRow); return(rows); }
/// <summary> /// Récupère une ligne du tableau excel du type passé en paramètre de la méthode générique. /// </summary> /// <typeparam name="TRow">Le type de l'objet de retour.</typeparam> /// <returns>Une ligne du fichier excel.</returns> public TRow ReadRow <TRow>() where TRow : new() { var row = new TRow(); var def = BeanDescriptor.GetDefinition(row); var initialColumn = _currentCell.ColumnName; var emptyCellsNb = 0; /* Parcourt des propriétés du bean. */ foreach (var propDesc in def.Properties) { var value = ReadCellCore(propDesc.PrimitiveType); // On suppose que la première ligne vide correspond à la fin du document. if (value == null) { emptyCellsNb++; if (emptyCellsNb == def.Properties.Count) { return(default(TRow)); } } propDesc.SetValue(row, value); /* Passe à la colonne suivante. */ _currentCell = _currentCell.ShiftColumn(1); } /* On retourne à la cellule initiale de la ligne. */ _currentCell = _currentCell.ChangeColumn(initialColumn); return(row); }
/// <summary> /// Indique si la cellule fusionnée contient une cellule donnée. /// </summary> /// <param name="cell">Cellule à vérifier.</param> /// <returns><code>True</code> si la cellule est contenue.</returns> public bool Contains(ExcelCell cell) { return (_startCell.ColumnIndex <= cell.ColumnIndex && cell.ColumnIndex <= _endCell.ColumnIndex && _startCell.RowIndex <= cell.RowIndex && cell.RowIndex <= _endCell.RowIndex); }
/// <summary> /// Déplace le focus sur une cellule donnée. /// </summary> /// <param name="cellName">Nom de la cellule.</param> /// <returns>Le builder.</returns> public ExcelTemplateBuilder SetFocus(string cellName) { if (string.IsNullOrEmpty(cellName)) { throw new ArgumentNullException("cellName"); } _currentCell = ExcelCell.Create(this, cellName); return(this); }
/// <summary> /// Obtient la cellule fusionnée qui contient une cellule, si elle existe. /// </summary> /// <param name="cell">Cellule à rechercher.</param> /// <returns>Cellule fusionnée.</returns> internal ExcelMergeCell GetMergCell(ExcelCell cell) { foreach (var excelMergeCell in _mergeCells) { if (excelMergeCell.Contains(cell)) { return(excelMergeCell); } } return(null); }
/// <summary> /// Lit la liste des cellules fusionnées du tableau. /// </summary> private void ReadMergeCells() { var mergedCells = _worksheet.GetFirstChild <MergeCells>(); if (mergedCells == null) { return; } foreach (MergeCell mergeCell in mergedCells) { var arr = mergeCell.Reference.Value.Split(':'); var start = arr[0]; var end = arr[1]; var excelMergeCell = new ExcelMergeCell(ExcelCell.Create(this, start), ExcelCell.Create(this, end)); _mergeCells.Add(excelMergeCell); } }
/// <summary> /// Ecrit une liste de lignes démarrant à la cellule courante. /// Les valeurs de cellules sont lues dans l'ordre des propriétés du bean <code>row</code>. /// Les lignes sont écrites dans l'ordre de la collection. /// </summary> /// <typeparam name="TRow">Type de la ligne.</typeparam> /// <param name="rows">Liste des beans de ligne.</param> /// <returns>Le builder.</returns> public ExcelTemplateBuilder WriteRows <TRow>(ICollection <TRow> rows) { var initialRow = _currentCell.RowIndex; /* Parcourt les lignes. */ foreach (var row in rows) { /* Ecrit la ligne. */ WriteRow(row); /* Passe à la ligne suivante. */ _currentCell = _currentCell.ShiftRow(1); } /* Retourne à la première ligne. */ _currentCell = _currentCell.ChangeRow(initialRow); return(this); }
// Given a worksheet, a column name, and a row index, // gets the cell at the specified column and private Cell GetCell(ExcelCell excelCell) { /* Obtient la ligne. */ Row row = GetRow(excelCell.RowIndex); if (row == null) { return(null); } /* Obtient la cellule. */ string cellName = excelCell.Name; Cell cell = row.Elements <Cell>() .Where(c => string.Compare(c.CellReference.Value, cellName, true) == 0) .FirstOrDefault(); // if (cell == null) { // throw new NotSupportedException("Cellule introuvable : " + cellName); // } return(cell); }
/// <summary> /// Créé une nouvelle cellule fusionnée. /// </summary> /// <param name="startCell">Début de la plage.</param> /// <param name="endCell">Fin de la plage.</param> public ExcelMergeCell(ExcelCell startCell, ExcelCell endCell) { _endCell = endCell; _startCell = startCell; }
/// <summary> /// Déplace le focus vers la même colonne et delta lignes plus bas. /// </summary> /// <param name="delta">Le delta.</param> /// <returns>Le builder.</returns> public ExcelTemplateBuilder ShiftRow(uint delta) { _currentCell = _currentCell.ShiftRow(delta); return(this); }