Как я могу получить фактический диапазон использования для модифицированных улучшений с помощью Epplus?

Я читаю данные от excel до datable с использованием EPPlus.

После чтения листа excel с 10 строками записи я изменил лист excel, удалив существующие данные и сохранил данные только для одной строки. Но когда я читаю модифицированное excel, он все еще считывает 10 строк (1 со значением и остается как пустые поля) в таблицу данных.

Как это можно ограничить? Я использую следующий код для чтения Excel.

using (var pck = new OfficeOpenXml.ExcelPackage())
{
    using (var stream = File.OpenRead(FilePath))
    {
        pck.Load(stream);
    }
    var ws = pck.Workbook.Worksheets.First();                   
    bool hasHeader = true; // adjust it accordingly(this is a simple approach)
    foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
    {
        DSClientTransmittal.Tables[0].Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
    }
    var startRow = hasHeader ? 2 : 1;
    for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
    {
        //var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
        var wsRow = ws.Cells[rowNum, 1, rowNum, DSClientTransmittal.Tables[0].Columns.Count];
        var row = DSClientTransmittal.Tables[0].NewRow();
        foreach (var cell in wsRow)
        {
            try
            {
                object cellValue = cell.Value;
                //row[cell.Start.Column - 1] = cell.Text;
                row[cell.Start.Column - 1] = cellValue.ToString().Trim();
                //cell.Style.Numberformat.Format = "@";
                //row[cell.Start.Column - 1] = cell.Text;
            }
            catch (Exception ex) { }
        }
        DSClientTransmittal.Tables[0].Rows.Add(row);
    }
    pck.Dispose();
}   

Когда я использовал Interop excel для чтения excel, эта же проблема была преодолена clearformat() метод, подобный

ws.Columns.ClearFormats();
xlColCount = ws.UsedRange.Columns.Count;

Есть ли какой-либо эквивалент для этого в раскрывающемся xml? Как я могу получить фактический диапазон использования для модифицированных улучшений?

Ответ 1

Нет встроенного способа указывать, что строка не должна учитываться при удалении данных только в некоторых ячейках.

Dimension находится так близко, как вы можете получить, но строки включены в Dimension, если какой-либо столбец содержит данные, или если какая-либо строка выше или ниже содержит данные.

Однако вы можете попытаться выяснить, следует ли пропустить строку в цикле for. Например, если вы всегда удаляете данные только в первых 4 столбцах, вы можете попробовать:

if(!ws.Cells[rowNum, 1, rowNum, 4].All(c => c.Value == null))
{
    //Continue adding the row to the table
}

Описание не указывает критерии для пропусков строки, но вы получаете идею.

Ответ 2

Для начала я не программист на С#, но я думаю, что у меня есть решение, которое работает с помощью Excel VBA script. Вы можете запустить этот код Excel VBA с помощью C или получить представление о том, как сделать то же самое с С++.

Проблема, с которой вы сталкиваетесь, связана с тем, как Excel обрабатывает рабочий размер рабочего листа. Если вы вводите данные в 1-миллионную строку и затем удаляете эту ячейку, Excel по-прежнему показывает рабочий лист как имеющий 1 миллион строк.

Я проверил этот код Excel VBA и успешно удалил все строки, которые были полностью пустыми, а затем reset размер листа.

Sub DelEmptyRowsResizeWorksheet()
  Dim i As Long, iLimit As Long
    iLimit = ActiveSheet.UsedRange.Rows.Count
  For i = iLimit To 1 Step -1
    If Application.CountA(Cells(i, 1).EntireRow) = 0 Then
       Cells(i, 1).EntireRow.Delete
    End If
  Next i
   iLimit = ActiveSheet.UsedRange.Rows.Count   ' resize the worksheet based on the last row with data
End Sub

Чтобы сделать это вручную без script, сначала удалите все пустые строки внизу (или столбцы справа) рабочего листа, сохраните его, затем закройте и снова откройте книгу. Я обнаружил, что это также сбрасывает размер книги Excel.