- Pour obtenir l'index de la dernière colonne/ligne non vide, la fonction Excel
Find
peut être utilisé. Voir GetLastIndexOfNonEmptyCell
.
- Ensuite, le Fonction de la feuille de calcul Excel
CountA
est utilisé pour déterminer si les cellules sont vides et syndicat l'ensemble des lignes/colonnes à une plage de lignes/colonnes.
- Ces plages sont définitivement supprimées d'un coup.
public void Yahfoufi(string excelFile)
{
var exapp = new Microsoft.Office.Interop.Excel.Application {Visible = true};
var wrb = exapp.Workbooks.Open(excelFile);
var sh = wrb.Sheets["Sheet1"];
var lastRow = GetLastIndexOfNonEmptyCell(exapp, sh, XlSearchOrder.xlByRows);
var lastCol = GetLastIndexOfNonEmptyCell(exapp, sh, XlSearchOrder.xlByColumns);
var target = sh.Range[sh.Range["A1"], sh.Cells[lastRow, lastCol]];
Range deleteRows = GetEmptyRows(exapp, target);
Range deleteColumns = GetEmptyColumns(exapp, target);
deleteColumns?.Delete();
deleteRows?.Delete();
}
private static int GetLastIndexOfNonEmptyCell(
Microsoft.Office.Interop.Excel.Application app,
Worksheet sheet,
XlSearchOrder searchOrder)
{
Range rng = sheet.Cells.Find(
What: "*",
After: sheet.Range["A1"],
LookIn: XlFindLookIn.xlFormulas,
LookAt: XlLookAt.xlPart,
SearchOrder: searchOrder,
SearchDirection: XlSearchDirection.xlPrevious,
MatchCase: false);
if (rng == null)
return 1;
return searchOrder == XlSearchOrder.xlByRows
? rng.Row
: rng.Column;
}
private static Range GetEmptyRows(
Microsoft.Office.Interop.Excel.Application app,
Range target)
{
Range result = null;
foreach (Range r in target.Rows)
{
if (app.WorksheetFunction.CountA(r.Cells) >= 1)
continue;
result = result == null
? r.EntireRow
: app.Union(result, r.EntireRow);
}
return result;
}
private static Range GetEmptyColumns(
Microsoft.Office.Interop.Excel.Application app,
Range target)
{
Range result = null;
foreach (Range c in target.Columns)
{
if (app.WorksheetFunction.CountA(c.Cells) >= 1)
continue;
result = result == null
? c.EntireColumn
: app.Union(result, c.EntireColumn);
}
return result;
}
Les deux fonctions permettant d'obtenir des plages vides de lignes/colonnes pourraient être refactorisées en une seule fonction, quelque chose comme ceci :
private static Range GetEntireEmptyRowsOrColumns(
Microsoft.Office.Interop.Excel.Application app,
Range target,
Func<Range, Range> rowsOrColumns,
Func<Range, Range> entireRowOrColumn)
{
Range result = null;
foreach (Range c in rowsOrColumns(target))
{
if (app.WorksheetFunction.CountA(c.Cells) >= 1)
continue;
result = result == null
? entireRowOrColumn(c)
: app.Union(result, entireRowOrColumn(c));
}
return result;
}
Et ensuite, appelez-le :
Range deleteColumns = GetEntireEmptyRowsOrColumns(exapp, target, (Func<Range, Range>)(r1 => r1.Columns), (Func<Range, Range>)(r2 => r2.EntireColumn));
Range deleteRows = GetEntireEmptyRowsOrColumns(exapp, target, (Func<Range, Range>)(r1 => r1.Rows), (Func<Range, Range>)(r2 => r2.EntireRow));
deleteColumns?.Delete();
deleteRows?.Delete();
Note : pour plus d'informations, consultez par exemple le site suivant cette question SO .
Modifier
Essayez d'effacer simplement le contenu de toutes les cellules qui se trouvent après la dernière cellule utilisée.
public void Yahfoufi(string excelFile)
{
var exapp = new Microsoft.Office.Interop.Excel.Application {Visible = true};
var wrb = exapp.Workbooks.Open(excelFile);
var sh = wrb.Sheets["Sheet1"];
var lastRow = GetLastIndexOfNonEmptyCell(exapp, sh, XlSearchOrder.xlByRows);
var lastCol = GetLastIndexOfNonEmptyCell(exapp, sh, XlSearchOrder.xlByColumns);
// Clear the columns
sh.Range(sh.Cells(1, lastCol + 1), sh.Cells(1, Columns.Count)).EntireColumn.Clear();
// Clear the remaining cells
sh.Range(sh.Cells(lastRow + 1, 1), sh.Cells(Rows.Count, lastCol)).Clear();
}
0 votes
Essayez-vous de supprimer la ligne 17 vers le haut, ou les lignes 7,8,13 ?
0 votes
Je viens d'essayer de créer une feuille de calcul avec 10000 lignes, une ligne sur deux était vide. La suppression des 5000 lignes vides a pris 38 secondes.
0 votes
@Phil j'essaie d'obtenir la dernière ligne contenant des données pour supprimer tous les blancs supplémentaires (après cette ligne, ou colonne).
3 votes
Eh bien, je suis confus maintenant. Qu'est-ce qui doit être supprimé ? Veuillez modifier la question et ajouter une image qui montrera le résultat attendu. Les lignes 7, 8 et 13 doivent-elles être supprimées ? Et les colonnes
H
etE
être supprimé ?0 votes
@dee je veux supprimer toutes les lignes après
17
et toutes les colonnes aprèsJ
pour les autres blancs, les lignes (7,8,13) et les colonnes (E,H), la réponse dans le lien fourni fonctionne bien.0 votes
@dee ces lignes sont vides mais elles sont réservées dans excel, nous devons donc les supprimer. Si vous importez le fichier vers d'autres sources, vous aurez parfois plus de 100000 lignes vides.
1 votes
@Yahfoufi j'ai édité la réponse, veuillez y jeter un coup d'oeil.
1 votes
"si vous importez le fichier vers d'autres sources, vous aurez parfois plus de 100000 lignes vides" - Voilà la vraie question : Comment désinfecter une feuille de calcul afin que son
UsedRange
ne comprend que des données (texte ou chiffres) ? Les lignes et les colonnes de cette plage peuvent-elles être vides ?0 votes
@TnTinMn plusieurs fois
UsedRange
retourner des lignes et des colonnes vides supplémentaires.