SmStrobleの回答が示すとおり、これまでにも言及しました。 ExcelファイルのTOPから空の行を削除すると、行を削除して他の行を上に移動すると索引付けの問題が発生し、ループ内の行の索引付けがスローされます。 for
ループコードでは、その変数はi
です。この方法を使用すると、空の行が欠落し、空でない行が削除される可能性があります。
SmStrobleの答えがこの問題を解決する正しい方法ですが、いくつか問題があります。まず最初にコメントしたように、下から上に行を削除したいので、SmStrobleの解決策は、行をループして空の行の行インデックスを見つけ、List<int>
に配置することです。ここでの唯一の問題は、ここでforeach
ループを使用すると、最後のリストではなくリストに置かれた最初のアイテムから開始されることです。
2番目の問題は実行時間です。 Excelの行をループすることはコストがかかることがあります。あなたはfor
ループの中で、次のMySheet.UsedRange
ラインを使用する場合:
for (int i = 1; i < MySheet.UsedRange.Rows.Count; i++) {…
この行は高価です。シートに多数の行がある場合、これにはかなりの時間がかかります。このため、他のソリューションがあります。しかし、簡単な解決策は、単純に行数を保持し、以下のようなfor
ループ内でそれを使用するint
変数を作ることです。
int totalRows = MySheet.UsedRange.Rows.Count;
for (int i = 1; i < totalRows; i++) {
この小さな変更は大きく依存して実行を高速化しますスプレッドシートの行数。 730 +行のテストシートを使用すると、for
ループではUsedRange
、for
ループ外のときは1118ミリ秒で2447ミリ秒かかりました。お役に立てれば。
string filePath = @"C:\YourPathToExcelFile\YourExcelFile.xls";
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.Visible = true;
Workbooks wbs = ExcelApp.Workbooks;
Workbook xlWorkbook = wbs.Open(filePath, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Excel._Worksheet MySheet = xlWorkbook.Sheets[1];
const int aCol = 1;
const int bCol = 2;
const int cCol = 3;
List<int> rowsToDelete = new List<int>();
int totalRows = MySheet.UsedRange.Rows.Count;
for (int i = totalRows; i > 0; i--) {
if ((MySheet.Cells[i, aCol].Value ?? "").ToString() == "" &&
(MySheet.Cells[i, bCol].Value ?? "").ToString() == "" &&
(MySheet.Cells[i, cCol].Value ?? "").ToString() == "") {
rowsToDelete.Add(i);
}
}
foreach (int row in rowsToDelete) {
((Range)(MySheet.Rows[row])).Delete(XlDirection.xlUp);
}
xlWorkbook.Save();
xlWorkbook.Close();
ExcelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
Console.WriteLine("Fished processing! Press any key to exit");
Console.ReadKey();
EDIT:トップにExcelファイルの底部からループに上記のコードを変更しました。これにより、rowsToDelete
のリストを元に戻す必要がなくなります。
私はそれを試しましたが、何らかの理由で空の行が削除されません。 –
.Valueを.Value2に切り替えてみてください。セルには、空白の既定値を持つ型を返すような(日付/時刻などの)書式設定がいくつかあります。 – SMStroble
@JohnGあなたの権利を盗む。私はその変更をしたことを誓う、私はそれが私の答えにそれをしなかったと思う。一定。 – SMStroble