programing

Eplus를 사용하여 수정된 엑셀의 실제 사용 범위를 어떻게 얻을 수 있습니까?

goodsources 2023. 8. 24. 22:00
반응형

Eplus를 사용하여 수정된 엑셀의 실제 사용 범위를 어떻게 얻을 수 있습니까?

저는 EPLUS를 사용하여 엑셀에서 데이타블까지 데이터를 읽고 있습니다.

10줄의 레코드가 있는 엑셀 시트를 읽은 후 기존 데이터를 삭제하여 엑셀 시트를 수정하고 1줄의 데이터만 보관하였습니다.그러나 수정된 Excel을 읽을 때 데이터 테이블에 10개의 행(1개의 값이 있고 null 필드로 남아 있음)을 계속 읽습니다.

어떻게 이것을 제한할 수 있습니까?저는 엑셀을 읽기 위해 아래의 코드를 사용하고 있습니다.

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

제가 엑셀을 읽기 위해 인터op 엑셀을 사용했을 때, 같은 문제가 해결되었습니다.clearformat()같은 방법

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

Eplus open xml에 이와 동등한 것이 있습니까?수정된 엑셀의 실제 사용 범위를 어떻게 얻을 수 있습니까?

일부 셀의 데이터만 삭제할 때 행을 고려하지 않아야 함을 나타내는 기본 제공 방식은 없습니다.

Dimension가능한 한 가깝지만 행이 포함되어 있습니다.Dimension열에 데이터가 포함되어 있거나 위 또는 아래 행에 데이터가 포함되어 있는 경우.

그러나 for 루프에서 행을 건너뛰어야 하는지 확인할 수 있습니다.예를 들어, 항상 처음 4개 열의 데이터만 삭제하는 경우 다음을 시도할 수 있습니다.

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

설명에 행을 건너뛰는 기준이 표시되어 있지 않지만, 이해할 수 있습니다.

우선, 저는 C# 프로그래머는 아니지만 Excel VBA 스크립트를 사용하여 작동하는 솔루션을 가지고 있다고 생각합니다.이 Excel VBA 코드를 C로 실행하거나 C+로 동일한 작업을 수행하는 방법에 대한 통찰력을 얻을 수 있습니다.

문제는 Excel이 워크시트의 작업 크기를 처리하는 방식과 관련이 있습니다.백만 번째 행에 데이터를 입력한 다음 해당 셀을 삭제해도 Excel은 워크시트에 백만 개의 행이 있는 것으로 계속 표시됩니다.

이 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 워크북 크기도 재설정됩니다.

언급URL : https://stackoverflow.com/questions/34089677/how-can-i-get-actual-used-range-for-modified-excels-using-epplus

반응형