特定のディレクトリ内のすべてのスプレッドシートから、「データ」と呼ばれるワークシートにデータを含む行をカウントするために、まったく恐ろしいコードと見なす必要があるものを作成しました。これがコードです
private const string _ExcelLogDirectoryPath = @"..\..\..\..\Model\ExcelLogs\";
static void Main()
{
var excelLogPaths = Directory.GetFiles(_ExcelLogDirectoryPath, "*.xl*");
var excel = new Microsoft.Office.Interop.Excel.Application();
var excelRowCounts = new Dictionary<string, int>();
foreach (var filePath in excelLogPaths)
{
var spreadsheet = excel.Workbooks.Open(Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "/" + filePath);
var worksheet = spreadsheet.Sheets["Data"] as Worksheet;
if (worksheet != null)
{
// var rowCount = UsedRange.Rows.Count - 1; DOES NOT WORK, THE number is bigger than the 'real' answer
var rowCount = 0;
for (var i = 1 ; i < 1000000000; i++)
{
var cell = worksheet.Cells[i, 1].Value2; // "Value2", great name for a property, thanks guys
if (cell != null && cell.ToString() != "") // Very fragile (e.g. skipped rows will break this)
{
rowCount++;
}
else
{
break;
}
}
var name = spreadsheet.Name.Substring(spreadsheet.Name.IndexOf('p'), spreadsheet.Name.IndexOf('.') - spreadsheet.Name.IndexOf('p'));
excelRowCounts.Add(name, rowCount - 1);
}
}
これがこれを行う正しい方法だとは信じられません。非常に遅くValue2
、パブリック API の意図された部分とは思えないような名前のプロパティへの呼び出しが含まれます。しかし、他の場所で提案された方法は、行数 (データを含む) を劇的に報告します。
Excelワークシートからデータを含む行を数えるのは何が正しいですか?
========== 編集 1 ==========
両方UsedRange.Rows.Count
とSid の ACE.OLEDB ソリューションが行数を報告する理由は、一部の列に適用されるピンクの背景色のように見えます (ただし、行 7091 までしか拡張されません)。表示色に関係なく、データを含む行 (つまり、null 以外のセル値を持つ行) をカウントするシンプルでエレガントな方法はありますか?
========== 編集 2 ===========
Sid の ACE.OLEDB ソリューションに、tSQL 行が読み取れるように彼が提案する追加機能を追加
var sql = "SELECT COUNT (*) FROM [" + sheetName + "$] WHERE NOT F1 IS NULL";
動作します。それを答えとしてマークします。