programing

EPLUS 사용 시 Column Type 설정 방법

mailnote 2023. 5. 16. 22:52
반응형

EPLUS 사용 시 Column Type 설정 방법

사용 중EPPlus생성하기 위해Excel파일, 내가 채우는 DAL에서.DataTable테이블에 데이터를 채우고 테이블을 프레젠테이션 계층으로 전달합니다.내가 사용하는 거기서LoadFromDataTable()생성 방법Excel파일.

열 유형 중 하나를 다음으로 설정하려는 경우를 제외하고는 모두 정상적으로 작동합니다.Date열 유형을 설정하려고 했습니다.DataTable로.Date그리고 지나가기 전에DataTable프레젠테이션 계층으로 이동하지만EPPlus무시했거나 인식하지 못했습니다. 왜냐하면 내가 열 때 생성되었기 때문입니다.Excel파일, 셀의 유형은Number.

셀을 수동으로 포맷하고 유형을 다음으로 설정하는 경우Date,Excel에는 정확한 날짜가 나와 있습니다.어떻게 하면 이를 달성할 수 있을까요?

데이터 테이블 열에 올바른 유형이 있어야 하지만 열 또는 셀의 스타일도 수정해야 합니다.숫자 형식.속성을 포맷합니다.

당신이 가지고 있다고 말합니다.ExcelWorksheet이름 지어진ws:

ws.Column(1).Style.Numberformat.Format  = "yyyy-mm-dd"; 
//OR "yyyy-mm-dd h:mm" if you want to include the time!

이 토론을 기반으로 (epplus.codeplex.com/discussions/349927) ) 열 형식을 현재 날짜로 설정할 수도 있습니다.

worksheet_1.Cells[row, 3].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;

열이 이동할 가능성이 높거나(최종 사용자가 변덕스러운 경향이 있음을 알 수 있음) 스프레드시트에 여러 개의 날짜 열이 흩어져 있는 경우에는 좀 더 일반적인 것을 작성하는 것이 좋습니다.여기 제가 방금 쓴 것이 있습니다.POCO에서 모든 DateTime 유형의 위치를 찾은 다음 열 형식을 설정하는 데 사용하는 목록을 만듭니다.데이터 테이블은 0 기반이지만 Excel은 그렇지 않습니다.

        ws.Cells.LoadFromDataTable(tbl, true);
        var dPos = new List<int>();
        for (var i = 0; i < tbl.Columns.Count; i++)
            if (tbl.Columns[i].DataType.Name.Equals("DateTime"))
                dPos.Add(i);
        foreach (var pos in dPos)
        {
            ws.Column(pos+1).Style.Numberformat.Format = "mm/dd/yyyy hh:mm:ss AM/PM";
        }

둘 이상의 데이터 테이블을 수행하는 경우에는 데이터 테이블을 함수로 재팩터링할 수 있습니다.

그리고 여기 사은품이 있습니다...이 코드는 신용할 수 없습니다.POCO 목록을 가져와서 데이터 테이블로 변환합니다.그것은 제 '도구 키트'에 넣어두는 것으로 제 삶을 더 편하게 해주었습니다.즐거운 시간 되세요.

        public DataTable ConvertToDataTable<T>(IList<T> data)
    {
        var properties =
           TypeDescriptor.GetProperties(typeof(T));
        var table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            var row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }

다음은 헤더와 올바른 날짜 형식으로 컬렉션에서 로드하는 데 도움이 되는 C# 확장 방법입니다.

(열 제목에 대한 설명 속성으로 속성을 장식합니다.)

public static class EpPlusExtensions
{
    public static void Load<T>(this ExcelWorksheet worksheet, IEnumerable<T> collection)
    {
        worksheet.Cells["A1"].LoadFromCollection(collection, true);

        var properties = typeof(T).GetProperties();

        for (var i = 0; i < properties.Length; i++)
        {
            if (new []{typeof(DateTime), typeof(DateTime?)}.Contains(properties[i].PropertyType)) 
            {
                worksheet.Column(i + 1).Style.Numberformat.Format = "m/d/yyyy";
            }
        }
    } 
}

엑셀 형식으로 빌드를 사용하려면 올바른 문자열을 에 전달해야 합니다.

sheet.Cells[1, 1].Style.Numberformat.Format 

소유물.

실행 중 나중에, 아마도 직렬화 중에, EP Plus는 이 형식 속성을 워크북의 현재 스타일 사전과 일치시키려고 시도할 것입니다.정확한 라이브러리 버전에 따라 다를 수 있지만, 예를 들어 EPPlust 4.1.0.0의 경우 짧은 날짜 키는 "mm-dd-yyy"입니다.

4.1.0.0의 경우 다음과 같은 형식으로 빌드할 모든 하드 코드 및 키를 찾을 수 있습니다.

  1. Excel FormatXml FormatXml.cs ,internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) 코드들은 워크북에 은 하드코드화되어 있습니다.
  2. 하여 디거사및용확인을 합니다.Workbook.Styles.NumberFormats로 사용)ExcelNumberFormatXml.Format)
  3. 하여 디거사및용확인을 합니다.Workbook.Styles.NumberFormats. 멤버 (비공개구성원)구원성▁(비_dic정확한 열쇠를 위하여

언급URL : https://stackoverflow.com/questions/9859610/how-to-set-column-type-when-using-epplus

반응형