Используйте interop и c# для подсчета строк на листе электронной таблицы Excel с данными в
Я только что написал то, что должно считаться совершенно отвратительным кодом для подсчета строк, содержащих данные в листах, называемых "данными", из всех электронных таблиц в данном каталоге. Вот код
private const string _ExcelLogDirectoryPath = @"........ModelExcelLogs";
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, и туз Сида.Решение OLEDB над отчетом количество строк выглядит как розовый цвет фона, который применяется к некоторым столбцам (но распространяется только на строку 7091). Существует ли простой / элегантный способ подсчета строк с данными в них (т. е. с ненулевыми значениями ячеек) независимо от цвет дисплея?
========== править 2 ===========
Туз Сида.OLEDB решение с добавлением он предлагает так, что строка tSQL читает
var sql = "SELECT COUNT (*) FROM [" + sheetName + "$] WHERE NOT F1 IS NULL";
Работает. Я отмечу это как ответ.
2 ответов:
Это должно сделать трюк. Вы можете вызвать его с каждым именем файла, чтобы получить количество строк.
private string GetNumberOfRows(string filename, string sheetName) { string connectionString; string count = ""; if (filename.EndsWith(".xlsx")) { connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Mode=ReadWrite;Extended Properties=\"Excel 12.0;HDR=NO\""; } else if (filename.EndsWith(".xls")) { connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=NO;\""; } string SQL = "SELECT COUNT (*) FROM [" + sheetName + "$]"; using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); using (OleDbCommand cmd = new OleDbCommand(SQL, conn)) { using (OleDbDataReader reader = cmd.ExecuteReader()) { reader.Read(); count = reader[0].ToString(); } } conn.Close(); } return count; }Возможно, есть еще более быстрый способ восстановления только количества строк, но я знаю, что это работает.
Comments