2014-02-24 3 views
1

데이터 테이블에 여러 테이블이 있습니다. 각 테이블이 다른 워크 시트에있는 Excel로 내보내려고합니다. OpenXML을 사용하여 어떻게 할 수 있습니까?하지만 열의 데이터 유형 (예 : 문자열, 날짜, 숫자 등)을 유지하고 싶습니다. 현재 내가 가진 :OpenXML을 사용하여 Excel로 데이터 집합

using (SpreadsheetDocument workbook = SpreadsheetDocument.Create(fileName, 
    SpreadsheetDocumentType.Workbook)){ 
workbook.AddWorkbookPart(); 
workbook.WorkbookPart.Workbook = new Workbook {Sheets = new Sheets()}; 

uint sheetId = 1; 

var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>(); 
var sheetData = new SheetData(); 
sheetPart.Worksheet = new Worksheet(sheetData); 

var sheets = workbook.WorkbookPart.Workbook.GetFirstChild<Sheets>(); 
string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart); 

if (sheets.Elements<Sheet>().Any()) 
{ 
    sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1; 
} 

var sheet = new Sheet 
{ 
    Id = relationshipId, 
    SheetId = sheetId, 
    Name = exportedSheet 
}; 
sheets.Append(new List<OpenXmlElement> {sheet}); 

var headerRow = new Row(); 

var columns = new List<string>(); 
foreach (DataColumn column in extractedData.Columns) 
{ 
    columns.Add(column.ColumnName); 

    var cell = new Cell 
    { 
     DataType = CellValues.String, 
     CellValue = new CellValue(column.ColumnName) 
    }; 
    headerRow.AppendChild(cell); 
} 

sheetData.AppendChild(headerRow); 

foreach (DataRow dsrow in extractedData.Rows) 
{ 
    var newRow = new Row(); 
    DataRow dsrow1 = dsrow; 
    foreach (Cell cell in columns.Select(col => new Cell 
    { 
     DataType = CellValues.String, 
     CellValue = new CellValue(dsrow1[col].ToString()) 
    })) 
    { 
     newRow.AppendChild(cell); 
    } 

    sheetData.AppendChild(newRow); 
}} 
+0

열을 포맷 하시겠습니까? 또는 xlsx에서 .net으로 다시 데이터를로드 하시겠습니까? – Aron

답변

2

당신은 단지 해당 CellValues 값으로 각 열의 값을 매핑해야합니다. 여기에 대략적인 아이디어가 있습니다.

// store this somewhere (a static field?) 
var columnTypeToCellDataTypeMap = new Dictionary<Type, CellValues> 
    { 
     { typeof(Boolean), CellValues.Boolean }, 
     { typeof(Byte), CellValues.Number }, 
     { typeof(Decimal), CellValues.Number }, 
     { typeof(Char), CellValues.String }, 
     { typeof(DateTime), CellValues.Date }, 
     { typeof(Double), CellValues.Number }, 
     { typeof(Decimal), CellValues.Number }, 
     { typeof(Int16), CellValues.Number }, 
     { typeof(Int32), CellValues.Number }, 
     { typeof(Int64), CellValues.Number }, 
     { typeof(SByte), CellValues.Number }, 
     { typeof(Single), CellValues.Number }, 
     { typeof(String), CellValues.String }, 
     { typeof(UInt16), CellValues.Number }, 
     { typeof(UInt32), CellValues.Number }, 
     { typeof(UInt64), CellValues.Number }, 
    } 

// and use it like this: 
foreach (DataRow row in table.Rows) 
{ 
    foreach (DataColumn column in table.Columns) 
    { 
     // map the column type to an OpenXML SDK CellValues type 
     CellValues cellDataType; 
     if (!columnTypeToCellDataTypeMap.TryGetValue(column.DataType, out cellDataType)) 
      cellDataType = CellValues.String; 

     // get the cell value 
     object value = row[column]; 
     string cellValue = (value != null ? value.ToString() : ""); 

     // construct the cell 
     var cell = new Cell { DataType = cellDataType, CellValue = value }; 

     // etc 
     ... 
    } 
} 
관련 문제