Используйте 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";


Работает. Я отмечу это как ответ.

696   2  

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;
}

Возможно, есть еще более быстрый способ восстановления только количества строк, но я знаю, что это работает.

Если вы используете interop, почему бы не использовать UsedRange?

_Worksheet.UsedRange.Rows.Count

Comments

    Ничего не найдено.