UFO ET IT

EPLUS C#에서 테이블 확장

ufoet 2023. 6. 22. 23:10
반응형

EPLUS C#에서 테이블 확장

C#의 EPLUS에서 기존 테이블을 확장할 수 있는 방법이 있습니까?제 프로그램의 작동 방식은 2개의 행만 있는 테이블을 만들고 계속해서 추가하는 것입니다.나는 단지 어떤 종류의 크기 조정 방법이 방법을 찾을 수 없는 것 같습니다.ExcelTable이를 위한 전용 방법이 있습니까, 아니면 다른 방법을 사용해야 합니까?

편집: 자, 이제 이것을 명확히 하겠습니다.저는 이미 EPLUS에서 Excel Table을 만들고 있습니다. 제 질문은: 기존 ExcelTable을 더 크게(행을 더 추가) 만들려면 어떻게 해야 합니까?

유감스럽게도, 직접적인 방법은 없습니다.왜 그런지는 잘 모르겠지만 EPLUS의 개발자들은 다음을 만들기로 결정했습니다.ExcelTable.Address준비물만 있습니다.따라서 가장 확실한 선택은 새 테이블을 만들고 필요한 속성을 모두 알고 있다고 가정하여 모든 속성을 복사한 후 이전 속성을 삭제하는 것입니다.뭔가를 놓칠 수 있기 때문에 그다지 이상적이지 않습니다.

하지만 저는 두 개의 다른 것을 봅니다. 다음으로 정확하게 예쁘거나 복사/삭제보다 더 낫습니다.다음과 같은 표를 가정합니다.

enter image description here

옵션 1 EPLUS 소스 코드를 포크하여 필요한 속성을 읽기/쓰기할 수 있습니다.당신은 파일에서 이것을 할 것입니다.ExcelTable.cs변경 방법:

    public ExcelAddressBase Address
    {
        get
        {
            return _address;
        }
        internal set  //REMOVE internal KEYWORD
        {
            _address = value;
            SetXmlNodeString("@ref",value.Address);
            WriteAutoFilter(ShowTotal);
        }
    }

를 제거함으로써internal키워드하지만 물론 조심해야 할 것입니다. 그렇게 하는 것이 도중에 다른 것을 깨뜨리지 않도록 말입니다.이를 통해 다음과 같은 작업을 수행할 수 있습니다.

var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx");

using (var pck = new ExcelPackage(fileInfo))
{
    var workbook = pck.Workbook;
    var worksheet = workbook.Worksheets.First();

    //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows)
    worksheet.Cells["A12"].Value = 10;
    worksheet.Cells["B12"].Value = 100;
    worksheet.Cells["C12"].Value = Path.GetRandomFileName();

    var tbl = worksheet.Tables["TestTable1"];
    var oldaddy = tbl.Address;
    var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column);

    tbl.Address = newaddy;

    pck.Save();
}

옵션 2가 더 안전한 옵션이지만 XML에서 문자열 대체를 사용하여 가장 "더러운" 옵션입니다.예를 들어 AutoFilter(자동 필터)가 켜져 있을 수 있으므로 주소에 대한 참조가 하나만 있다고 가정할 수 없습니다.다음은 Excel에서 테이블을 만들 때 기본 XML의 모양입니다(주소에 대한 두 가지 참조).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="3" name="TestTable1" displayName="TestTable1" ref="A1:C11" totalsRowShown="0">
    <autoFilter ref="A1:C11" />
    <tableColumns count="3">
        <tableColumn id="1" name="Col1" />
        <tableColumn id="2" name="Col2" />
        <tableColumn id="3" name="Col3" />
    </tableColumns>
    <tableStyleInfo name="TableStyleMedium2" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0" />
</table>

따라서 다음과 같이 문자열 교체를 수행할 수 있습니다.

var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx");

using (var pck = new ExcelPackage(fileInfo))
{
    var workbook = pck.Workbook;
    var worksheet = workbook.Worksheets.First();

    //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows)
    worksheet.Cells["A12"].Value = 10;
    worksheet.Cells["B12"].Value = 100;
    worksheet.Cells["C12"].Value = Path.GetRandomFileName();

    var tbl = worksheet.Tables["TestTable1"];
    var oldaddy = tbl.Address;
    var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column);

    //Edit the raw XML by searching for all references to the old address
    tbl.TableXml.InnerXml = tbl.TableXml.InnerXml.Replace(oldaddy.ToString(), newaddy.ToString());

    pck.Save();
}

이 질문은 약 1년 전의 것이지만, 누군가가 여전히 답을 필요로 하기를 바라며, EEPlux의 버그 때문에 완전하지는 않지만 직접적인 해결책이 있습니다(v4.1로 작업 중입니다).

Excel 워크시트에는 InsertRow(Int32, Int32, Int32) 메서드가 있습니다.표의 일부인 영역에 행을 삽입하면 표도 확장됩니다.주소 속성을 사용하여 경계를 가져옵니다.표의 첫 번째 행과 마지막 행 사이에 삽입하십시오.

셀 유효성 검사와 관련하여 알고 있는 결함이 있습니다. 기존 행에서 스타일을 복사할 수 있는 오버로드를 사용하더라도 유효성 검사가 복사되지 않습니다.더 나쁜 것은 유효성 검사가 원래 있던 위치에 남아 있고 셀과 함께 이동하지 않는다는 점입니다.테스트하지 않았지만 유효성 검사에 셀이 대상이 아닌 범위가 있으면 해당 범위에 행을 삽입하면 해당 범위도 확장된다고 생각합니다.

워크시트에서 준비된 데이터에 대한 표를 확장하려는 경우에는 도움이 되지 않지만 행을 이동할 수는 있습니다.그리고 테이블이 여러 개 나란히 있을 때도 마찬가지입니다(이것은 악몽입니다).

저도 같은 문제를 겪었고 SQL DataTable을 Excel Table에 덤프하는 매우 빠른 방법을 찾았습니다.

단 04.2초 만에 18004행 달성

내 템플릿에는 테이블을 확장할 때 새 행으로 상속되는 수식이 포함되어 있습니다.

템플릿.xlsx

enter image description here

Report_with_Eplus.xlsx

enter image description here

public void xlsEpplus()
    {
        try
        {
            TimeSpan stop;
            TimeSpan start = new TimeSpan(DateTime.Now.Ticks);

            Database DB = new Database();
            DB.msConect();

            string sql = "SELECT * FROM table_test";
            DataTable dt_tab = DB.xSqlMs(sql);

            string Template = "D:\\Plantillas\\Template.xlsx";
            string filePath = "D:\\Plantillas\\Report_with_Epplus.xlsx";
            File.Copy(Template, filePath, true);


            ExcelPackage pck = new ExcelPackage();

            pck.Load(new FileStream(Template, FileMode.OpenOrCreate));

            ExcelWorksheet ws = pck.Workbook.Worksheets.First();

            var a = ws.Cells["A1"].Value;


            int i = 2;
            ws.InsertRow(i, dt_tab.Rows.Count);
            ws.Cells["A2"].LoadFromDataTable(dt_tab, true);

            pck.SaveAs(new FileInfo(filePath));

            stop = new TimeSpan(DateTime.Now.Ticks);
            Console.WriteLine("xlsEpplus_While:" + stop.Subtract(start));
        }
        catch (Exception ex)
        {
            //
            Console.WriteLine("ERROR: " + ex.Message);
        }
    }

언급URL : https://stackoverflow.com/questions/34549597/expand-a-table-in-epplus-c-sharp

반응형