22

Microsoft Open XML SDK 2を使用していますが、セルに日付を挿入するのに非常に苦労しています。を設定することで問題なく数字を挿入できますCell.DataType = CellValues.Numberが、日付で同じようにすると(Cell.DataType = CellValues.Date)Excel 2010がクラッシュします(2007も)。

値を多くの日付形式に設定し、Cell.TextExcelの日付/数値形式を無効に設定してみました。また、スタイルを使用して、type属性を削除したり、壁に投げた他の多くのピザを使用したりしました…</ p>

ワークシートに日付を挿入する例を誰かに教えてもらえますか?

4

7 に答える 7

35

Andrew Jから提供されたコードを使用しましたがDataType CellValues.Date、破損したxlsxファイルが生成されました。

私にとってはDataType CellValues.Numberうまくいきました(設定することを忘れないでくださいNumberFormatId

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

別の方法で日付をフォーマットしたい場合は、ここにすべてのデフォルトのExcelNumberFormatIdのリストがあります

IDフォーマットコード
0一般
1 0
2 0.00
3#、## 0
4#、## 0.00
9 0%
10 0.00%
11 0.00E + 00
12#?/?
13#?? / ??
14 d / m / yyyy
15 d-mmm-yy
16 d-mmm
17 mmm-yy
18時間:mm tt
19 h:mm:ss tt
20 H:mm
21 H:mm:ss
22 m / d / yyyy H:mm
37#、## 0;(#、## 0)
38#、## 0; [赤](#、## 0)
39#、## 0.00;(#、## 0.00)
40#、## 0.00; [赤](#、## 0.00)
45 mm:ss
46 [h]:mm:ss
47 mmss.0
48 ## 0.0E + 0
49 @

リストのソース:https ://github.com/ClosedXML/ClosedXML/wiki/NumberFormatId-Lookup-Table

このリストはClosedXMLのものですが、OpenXMLでも同じです。

于 2013-01-24T10:36:59.667 に答える
24

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の順序に依存することに注意してください。この例では、配列の2番目のアイテムのアイテムです。CellFormatCellFormatsStylesheetNumberFormatId = 14

于 2015-08-07T09:49:24.303 に答える
16

関数DateTimeを使用して変換する必要があります。doubleToOADate

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、日付ではなく値が表示されます。

于 2010-05-31T07:37:10.303 に答える
4

OpenXmlに日付を保存する方法は2つあります。ToOADate(を使用して)数値を書き込み、にを設定DataTypeするNumberか、ISO 8601形式の日付を書き込み、をに設定DataTypeDateます。DataTypeデフォルトではNumber、最初のオプションを使用する場合は、を設定する必要がないことに注意してくださいDataType

どちらの方法を選択しても、Excelは両方の方法を同じように表示するため、スタイルを設定する必要があります。Number次のコードは、形式(明示的に設定する場合としない場合DataType)を使用し、ISO8601形式を使用して日付を書き込む例を示しています。

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();
}
于 2017-06-20T19:36:59.827 に答える
0

共有文字列を使用する:

// 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);
于 2012-06-07T20:37:42.027 に答える
0

以下は私たちのために働いた:

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

DataTypeをCellValues.Numberに設定してから、CellFormatsの適切なスタイルインデックスを使用してセルをフォーマットしてください。この例では、ワークシート内にスタイルシートを作成し、StyleDateはスタイルシートのCellFormatsへのインデックスです。

于 2012-10-01T19:28:03.203 に答える
0

a)Excel 2007、Excel 2007 Viewerなどとの互換性を取得します。b)1.1.1900より前のDateTimeは文字列として書き込みます。

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());
}
于 2019-01-07T06:51:39.320 に答える