ProgramingTip

EPPlus 사용시 Column Type 설정 방법

bestdevel 2020. 11. 30. 19:25
반응형

EPPlus 사용시 Column Type 설정 방법


파일 EPPlus을 생성 하는 사용 하고있는 ExcelDAL에서 DataTable데이터를 채우고 테이블에 데이터를 채우고 테이블을 프레젠테이션 레이어로 전달하고 있습니다. 거기에서 파일 LoadFromDataTable()을 생성 하는 방법을 사용하고 Excel있습니다.

열 유형 중 하나를 설정하는 것을 제외하고는 모든 것이 잘 작동합니다 Date. 내 세트 열 유형에 노력 DataTableDate하고 패스보다는 DataTable것 같다 테이션에 레이어,하지만 그런 것 같다 EPPlus하나, 그것을 형태하거나, 내가 생성 할 때 때, 인식하지 않은 Excel파일을 할 때, 그것을 인식하지 않습니다 Number.

나는 수동으로 세포 및 세트 형 포맷하면 Date, Excel쇼 날짜를. 그래서 어디에서 어떻게합니까?


올바른 유형을 가지려면 DataTable 열이 필요하지만 열 또는 셀의 Style.Numberformat.Format 속성도 수정해야합니다.

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

Excel 형식으로 빌드를 사용하는 올바른 선호를

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

특성.

이제 나중에 실행 중, 아마도 일련 화 중에 EPPlus는이 형식 속성을 통합 문서의 현재 사전과 일치 시키려고합니다. EPPlust 4.1.0.0의 짧은 날짜 키는 "mm-dd-yy"입니다.

4.1.0.0의 경우 다음 형식으로 빌드 할 하드 코딩 된 코드와 키를 모두 사용할 수 있습니다.

  1. ExcelNumberFormatXml.cs, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats)-여기서 모든 코드는 통합 문서에 포함되어 모두 하드 코딩됩니다.
  2. 디버거를 사용하고 Workbook.Styles.NumberFormats열거를 확인하십시오 (키 사용으로 ExcelNumberFormatXml.Format)
  3. 디버거를 사용하고 정확한 키를 확인하십시오 Workbook.Styles.NumberFormats.(비공개 구성원) _dic.

다음은 헤더 및 적절한 날짜 형식을 사용하여 컬렉션에서로드하는 데 도움이되는 멋진 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";
            }
        }
    } 
}

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

반응형