EPPlus 사용시 Column Type 설정 방법
파일 EPPlus
을 생성 하는 데 사용 하고있는 Excel
DAL에서 DataTable
데이터를 채우고 테이블에 데이터를 채우고 테이블을 프레젠테이션 레이어로 전달하고 있습니다. 거기에서 파일 LoadFromDataTable()
을 생성 하는 방법을 사용하고 Excel
있습니다.
열 유형 중 하나를 설정하는 것을 제외하고는 모든 것이 잘 작동합니다 Date
. 내 세트 열 유형에 노력 DataTable
을 Date
하고 패스보다는 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의 경우 다음 형식으로 빌드 할 하드 코딩 된 코드와 키를 모두 사용할 수 있습니다.
- ExcelNumberFormatXml.cs,
internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats)
-여기서 모든 코드는 통합 문서에 포함되어 모두 하드 코딩됩니다. - 디버거를 사용하고
Workbook.Styles.NumberFormats
열거를 확인하십시오 (키 사용으로ExcelNumberFormatXml.Format
) - 디버거를 사용하고 정확한 키를 확인하십시오
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
'ProgramingTip' 카테고리의 다른 글
DOM 요소의 모든 이벤트를 어떻게 바인딩 할 수 있습니까? (0) | 2020.11.30 |
---|---|
Excel에서 1 시간 추가 (0) | 2020.11.30 |
SSRS에서 새 보고서를 사용했을 때 "같은 키가있는 항목이 이미 추가되었습니다"라는 오류가 발생하는 이유는 무엇입니까? (0) | 2020.11.30 |
x $ ed의 R 오류 : $ 연산자가 원자 벡터에 유효하지 않습니다. (0) | 2020.11.30 |
C ++로 파일 만들기 (0) | 2020.11.30 |