Как я могу получить фактический используемый диапазон для модифицированных образцов, используя 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;

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам