sourcecode

Open XML 워크시트에 날짜를 삽입하려면 어떻게 해야 합니까?

codebag 2023. 4. 23. 10:19
반응형

Open XML 워크시트에 날짜를 삽입하려면 어떻게 해야 합니까?

Microsoft Open XML SDK 2를 사용하고 있는데 셀에 날짜를 삽입하는 것이 매우 어렵습니다.설정함으로써 문제없이 숫자를 삽입할 수 있습니다.Cell.DataType = CellValues.Number하지만 데이트할 때도 마찬가지입니다.Cell.DataType = CellValues.DateExcel 2010 크래시(2007년도)

세팅을 시도했습니다.Cell.TextExcel의 날짜/숫자 형식뿐만 아니라 많은 날짜 형식으로 값을 매길 수 없습니다.또, 타입 속성을 배제하고, 벽에 던졌던 다른 많은 피자들도 사용해 보았습니다.

워크시트에 날짜를 삽입하는 예를 들어줄 사람 있나요?

Andrew J가 제공한 코드를 사용했지만DataType CellValues.Date손상된 xlsx 파일을 생성했습니다.

DataType CellValues.Number정상적으로 동작했습니다(설정하는 것을 잊지 말아 주세요).

cell.DataType = new EnumValue<CellValues>(CellValues.Number);

내 전체 코드:

DateTime valueDate = DateTime.Now;
string valueString = valueDate.ToOADate().ToString();
CellValue cellValue = new CellValue(valueString);

Cell cell = new Cell();
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
cell.StyleIndex = yourStyle; //StyleIndex of CellFormat cfBaseDate -> See below
cell.Append(cellValue);

스타일시트에서 이 셀의 내 CellFormat은 다음과 같습니다.

CellFormat cfBaseDate = new CellFormat() { 
 ApplyNumberFormat = true,
 NumberFormatId = 14, //14 is a localized short Date (d/m/yyyy) -> See list below
 //Some further styling parameters
}; 

다른 방법으로 날짜를 포맷하고 싶다면 모든 기본 Excel 목록을 참조하십시오.

ID 형식 코드0 일반1   02   0.003   #,##04   #,##0.009   0%10  0.00%11 0.00E+0012  # ?/?
13  # ??/??
14 d/m/yyy15 d-sq-yy16 d-module17mm-yy18시간:mm tt19시간:mm:ss tt20시간:mm21 H:mm:ss22 m/d/yyy H:mm37  #,##0 ;(#,##0)38#,#0;[빨간색](#,#0)39  #,##0.00;(#,##0.00)40  #,##0.00;[빨간색] (#,##0.00)45 mm:ss46 [h]:mm:ss47 mmss.0
48  ##0.0E+049  @

목록 출처: https://github.com/ClosedXML/ClosedXML/wiki/NumberFormatId-Lookup-Table

이 목록은 ClosedXML에서 가져온 것이지만 OpenXML에서도 동일합니다.

신규 작성 시SpreadsheetDocument처음부터, 을 처음부터Date동작하도록 포맷, 최소Stylesheet생성되어야 합니다.

중요한 것은 다음과 같은 몇 줄입니다.

new CellFormat
{
    NumberFormatId = 14,
    ApplyNumberFormat = true
})

가득한Stylesheet클래스:

using (var spreadSheet = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook))
{
    // Workbook
    var workbookPart = spreadSheet.AddWorkbookPart();
    workbookPart.Workbook =
        new Workbook(new Sheets(new Sheet { Name = "Sheet1", SheetId = (UInt32Value) 1U, Id = "rId1" }));

    // Add minimal Stylesheet
    var stylesPart = spreadSheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
    stylesPart.Stylesheet = new Stylesheet
    {
        Fonts = new Fonts(new Font()),
        Fills = new Fills(new Fill()),
        Borders = new Borders(new Border()),
        CellStyleFormats = new CellStyleFormats(new CellFormat()),
        CellFormats =
            new CellFormats(
                new CellFormat(),
                new CellFormat
                {
                    NumberFormatId = 14,
                    ApplyNumberFormat = true
                })
    };

    // Continue creating `WorksheetPart`...

끝나고Stylesheet추가되어 있습니다.DateTime포맷 가능:

if (valueType == typeof(DateTime))
{
    DateTime date = (DateTime)value;
    cell.CellValue = new CellValue(date.ToOADate().ToString(CultureInfo.InvariantCulture));

    // "StyleIndex" is "1", because "NumberFormatId=14"
    // is in the 2nd item of `CellFormats` array.
    cell.StyleIndex = 1; 
}

주의:StyleIndex값은 순서에 따라 다르다CellFormat의 아이템CellFormats어레이 또는Stylesheet물건.이 예에서는NumberFormatId = 14배열의 두 번째 항목에 있는 항목입니다.

변환해야 합니다.DateTime로.double사용함수ToOADate예:

DateTime dtValue = DateTime.Now;
string strValue = dtValue.ToOADate().ToString(CultureInfo.InvariantCulture);

로 설정하다CellValue

Cell cell;
cell.DataType = new EnumValue<CellValues>(CellValues.Date);
cell.CellValue = new CellValue(strValue);

잊지 말고 다음 명령을 사용하여 셀을 포맷하십시오.DateTime포맷하지 않을 경우,double날짜가 아니라 값입니다.

OpenXml에 날짜를 저장하는 방법에는 두 가지가 있습니다. 숫자 쓰기(사용)ToOADate를 설정한다.DataType로.Number또는 ISO 8601 형식의 날짜를 작성하고DataType로.Date디폴트는DataTypeNumber따라서 첫 번째 옵션을 선택하면 이 옵션을 설정할 필요가 없습니다.DataType.

어떤 방법을 선택하든 Excel이 두 방법을 동일하게 표시하므로 스타일을 설정해야 합니다., 를 쓰다, 예를 들어주세요.Number을 하는 경우와 하지 않는 경우)DataTypeISO 8601 형 iso iso iso iso iso iso iso iso iso iso.

using (SpreadsheetDocument document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
    //fluff to generate the workbook etc
    WorkbookPart workbookPart = document.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();

    var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet();

    Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());

    Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet" };
    sheets.Append(sheet);

    workbookPart.Workbook.Save();

    var sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());

    //add the style
    Stylesheet styleSheet = new Stylesheet();

    CellFormat cf = new CellFormat();
    cf.NumberFormatId = 14;
    cf.ApplyNumberFormat = true;

    CellFormats cfs = new CellFormats();
    cfs.Append(cf);
    styleSheet.CellFormats = cfs;

    styleSheet.Borders = new Borders();
    styleSheet.Borders.Append(new Border());
    styleSheet.Fills = new Fills();
    styleSheet.Fills.Append(new Fill());
    styleSheet.Fonts = new Fonts();
    styleSheet.Fonts.Append(new Font());

    workbookPart.AddNewPart<WorkbookStylesPart>();
    workbookPart.WorkbookStylesPart.Stylesheet = styleSheet;

    CellStyles css = new CellStyles();
    CellStyle cs = new CellStyle();
    cs.FormatId = 0;
    cs.BuiltinId = 0;
    css.Append(cs);
    css.Count = UInt32Value.FromUInt32((uint)css.ChildElements.Count);
    styleSheet.Append(css);

    Row row = new Row();

    DateTime date = new DateTime(2017, 6, 24);

    /*** Date code here ***/
    //write an OADate with type of Number
    Cell cell1 = new Cell();
    cell1.CellReference = "A1";
    cell1.CellValue = new CellValue(date.ToOADate().ToString());
    cell1.DataType = new EnumValue<CellValues>(CellValues.Number);
    cell1.StyleIndex = 0;
    row.Append(cell1);

    //write an OADate with no type (defaults to Number)
    Cell cell2 = new Cell();
    cell2.CellReference = "B1";
    cell2.CellValue = new CellValue(date.ToOADate().ToString());
    cell1.StyleIndex = 0;
    row.Append(cell2);

    //write an ISO 8601 date with type of Date
    Cell cell3 = new Cell();
    cell3.CellReference = "C1";
    cell3.CellValue = new CellValue(date.ToString("yyyy-MM-dd"));
    cell3.DataType = new EnumValue<CellValues>(CellValues.Date);
    cell1.StyleIndex = 0;
    row.Append(cell3);

    sheetData.AppendChild(row);

    worksheetPart.Worksheet.Save();
}

공유 문자열 사용:

// assuming it's the first item in the shared string table
SharedStringItem sharedStringItem = new SharedStringItem();
Text text = new Text();
text.Text = DateTime.Today.ToString("MM/dd/yyyy hh:mm");
sharedStringTable1.Append(sharedStringItem);

그 후 코드:

// assuming it's the first item in the shared string table
var cell = new Cell {CellReference = "A1", DataType = CellValues.SharedString};
var cellValue = new CellValue("0");
cell.Append(cellValue);

다음과 같은 이점이 있었습니다.

c.CellValue = new CellValue(datetimeValue).ToOADate().ToString());
c.DataType = CellValues.Number;
c.StyleIndex = StyleDate;

DataType을 CellValues로 설정합니다.번호를 입력한 후 CellFormats에서 적절한 유형 색인을 사용하여 셀 형식을 지정하십시오.이 경우 워크시트 내에 스타일시트를 작성하고 StyleDate는 스타일시트의 CellFormats에 대한 인덱스입니다.

a) Excel 2007, Excel 2007 Viewer 등과의 호환성을 확보합니다.b) 1.1.1900 이전 날짜 시간 문자열로 씁니다.

DateTime dat = (DateTime)dr[dc.ColumnName];

//Not working with Excel 2007
//cell.DataType = CellValues.Date;
//cell.CellValue = new CellValue(dat.ToString("s"));

double diff = (dat - new DateTime(1899, 12, 30)).TotalSeconds / 86400.0;
if (diff > 1)
{
    cell.DataType = CellValues.Number;
    cell.CellValue = new CellValue(diff.ToString().Replace(",", "."));

    if (dat.TimeOfDay == new TimeSpan(0))
    {                                
        cell.StyleIndex = 2;   //Custom Style NumberFormatId = 14 ( d/m/yyyy)
    }
    else
    {
        cell.StyleIndex = 1;   //Custom Style NumberFormatId = 22 (m/d/yyyy H:mm)
    }
}
else
{
    cell.DataType = CellValues.String;
    cell.CellValue = new CellValue(dat.ToString());
}

언급URL : https://stackoverflow.com/questions/2792304/how-to-insert-a-date-to-an-open-xml-worksheet

반응형