J'ai besoin de lire et d'écrire des données à partir d'une feuille de calcul Excel. Existe-t-il une méthode pour déterminer le nombre de lignes/colonnes d'une certaine feuille de calcul avec ExcelPackage? J'ai le code suivant:
FileInfo newFile = new FileInfo(@"C:\example.xlsx");
using (ExcelPackage xlPackage = new ExcelPackage(newFile))
{
ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];
}
Je dois parcourir chaque cellule de cette feuille de calcul et la cracher dans un tableau assez grand, mais je ne veux pas imprimer de cellules vides ou obtenir une exception. Existe-t-il une méthode ressemblant à worksheet.rowNum
ou colNum
?
Vous pouvez obtenir le nombre de lignes et de colonnes à l'aide d'ExcelPackage (EPPlus.dll version 3.0.0.2) comme ci-dessous:
var rowCnt = worksheet.Dimension.End.Row;
var colCnt = worksheet.Dimension.End.Column;
C'est ce que je fais:
Pour obtenir le tableau de valeurs dans le classeur:
object[,] valueArray = sheet.Cells.GetValue<object[,]>();
pour obtenir la plage, procédez comme suit:
int rangeMaxRows = sheet.Dimension.End.Row;
int rangeMaxColumns = sheet.Dimension.End.Column;
Je commencerais par la propriété UsedRange, puis pour chaque cellule de la dernière ligne de UsedRange do Cell.End (xlUp). Cela devrait vous donner la cellule finale pour chaque colonne, la cellule qui a l'index de ligne maximum est la dernière cellule de votre vraie plage utilisée.
La propriété UsedRange peut apparaître incorrecte car lorsque les cellules sont effacées mais pas supprimées, la propriété UsedRange n'est pas mise à jour. Pour rendre la propriété UsedRange à nouveau valide, il suffit de sélectionner toutes les lignes et colonnes après votre dernière cellule (donc toutes les cellules vides) et d'aller modifier-> supprimer.
int row = _excelSheet.Rows.CurrentRegion.EntireRow.Count;
int col = _excelSheet.Columns.CurrentRegion.EntireColumn.Count;
Je viens de faire la boucle suivante pour résoudre le problème. Cela ne fonctionne bien que si vous savez combien de colonnes il y aura à l'avance. Sinon, il faudrait une autre itération de boucle.
int totalCells = 0;
int totalRows = -1;
do
{
totalRows++;
} while (worksheet.Cell(totalRows + 1, 1).Value != @"");
totalCells = totalRows * 12;
J'utilisais sheet.UsedRange seul mais j'ai remarqué que certaines cellules à la fin de la plage étaient vides mais toujours incluses dans la plage.
Cela fonctionne, mais pour plus d'efficacité, vous pourriez mieux regarder à partir de la dernière ligne de la plage et compter à rebours pour voir où se terminent vos données (par opposition à cet extrait qui commence à partir de la première ligne!)
int count = 0;
E.Range excelRange = sheet.UsedRange;
object[,] valueArray = (object[,])excelRange.get_Value(E.XlRangeValueDataType.xlRangeValueDefault);
if (valueArray.GetUpperBound(0) > 1)
{
for (int i = 0; i < valueArray.GetUpperBound(0) + 2; i++)
{
if (valueArray[i + 2, 1] == null)
break;
else
count++;
}
}
J'ai recherché quelques sites Web en utilisant la bibliothèque ExcelPackage.
De plus, la page sur le codeplex a une question sur - comment obtenir le nombre de lignes/colonnes?
Il semble qu'il n'y ait pas d'appui. Désolé, la documentation n'est pas également disponible.
Vous devrez itérer sur les lignes/colonnes (en gardant à l'esprit le nombre maximum de lignes/colonnes que la feuille de calcul peut contenir) et vérifier si la cellule contient une valeur.
Voir ce lien - http://web.archive.org/web/20110123164144/http://nayyeri.net/use-excelpackage-to-manipulate-open-xml-Excel-files (original lien mort)
La meilleure façon d'obtenir le total des lignes et des colonnes est avec ces méthodes:
int col = sheet.Dimension.Columns;
int row = sheet.Dimension.Rows;