Дата Office Open XML не работает

В настоящее время я разрабатываю компонент для нашего приложения, который позволяет нам создавать лист Excel без необходимости владения Excel клиентами. Так что на ум пришел Open XML.

Что не работает на данный момент, так это парсинг дат.

Это мой рабочий лист:

<?xml version="1.0" encoding="UTF-8"?>
 <x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
 <x:cols>
  <x:col min="1" max="1" width="42.42" customWidth="1" />
  <x:col min="2" max="2" width="42.56" customWidth="1" />
  <x:col min="3" max="3" width="16.27" customWidth="1" />
</x:cols>
<x:sheetData>
  <x:row r="1">
     <x:c r="A1">
        <x:v>FF kijken hoe dit werkt snap er geen fu** van</x:v>
     </x:c>
     <x:c r="B1">
        <x:v>This is some really, really long text to display.</x:v>
     </x:c>
     <x:c r="C1" s="0">
        <x:v>40651.6777777778</x:v>
     </x:c>
  </x:row>
</x:sheetData>
</x:worksheet>

Это моя таблица стилей:

<?xml version="1.0" encoding="UTF-8"?>
<x:styleSheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
   <x:numFmts count="1">
  <x:numFmt numFmtId="164" formatCode="dd-mm-yy hh:mm" />
   </x:numFmts>
   <x:fonts count="1">
  <x:font>
 <x:sz val="11" />
 <x:name val="Arial" />
      </x:font>
   </x:fonts>

<x:cellXfs count="1">
<x:xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0"` applyNumberFormat="1" />   
</x:cellXfs>
</x:styleSheet>

Это код, который я использую для получения своих дат.

cell.StyleIndex = 0;  .
string columnValue = date.ToOADate().ToString().Replace(",", ".");
//string columnValue =  date.ToOADate().ToString().
Replace(CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator, ".");
cell.CellValue = new CellValue(columnValue);

Результат не тот, что я хочу. Я получу двойное значение с даты, а не с даты в созданной мной таблице стилей.

Я получу это 40651,67778 вместо 18-4-2011 16:16


person Maurice van Lieshout    schedule 16.07.2014    source источник
comment
Вы пытаетесь записать дату в файл excel? Если да, то значение 40651.67778 неверно?   -  person petelids    schedule 16.07.2014
comment
Да, я пытаюсь записать дату в файл Excel, кажется, что значение 40651.67778 верное. Excel обрабатывает даты как двойные значения, но это двойное значение необходимо отформатировать как дату на листе Excel. Поэтому я сделал этот формат нумерации дд-мм-гг чч:мм. Но это не работает!!   -  person Maurice van Lieshout    schedule 17.07.2014


Ответы (1)


Похоже, что в вашей таблице стилей styles.xml отсутствует элемент cellStyles. Я написал код для создания файла, похожего на ваш, и без этого элемента стиль не применялся. Весь элемент у меня выглядит так:

<x:cellStyles count="1"><x:cellStyle xfId="0" builtinId="0" /></x:cellStyles>

Код, который я использовал для создания файла, приведен ниже. Примечание. Я вывожу только одну ячейку даты, но добавление других ячеек тривиально.

string fileName = @"D:\Test\formatting.xlsx";

SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(fileName, SpreadsheetDocumentType.Workbook);

// Add a WorkbookPart to the document.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
Stylesheet styleSheet = new Stylesheet();

uint iExcelIndex = 164;
CellFormats cfs = new CellFormats();
NumberingFormats nfs = new NumberingFormats();

NumberingFormat nf;
nf = new NumberingFormat();
nf.NumberFormatId = iExcelIndex++;
nf.FormatCode = "dd-mm-yyyy hh:mm:ss";
nfs.Append(nf);

CellFormat cf = new CellFormat();
cf.NumberFormatId = nf.NumberFormatId;
cf.FontId = 0;
cf.FillId = 0;
cf.BorderId = 0;
cf.FormatId = 0;
cf.ApplyNumberFormat = true;
cfs.Append(cf);

styleSheet.CellFormats = cfs;
styleSheet.NumberingFormats = nfs;
styleSheet.Borders = new Borders();
Border border = new Border();
styleSheet.Borders.Append(border);
styleSheet.Fills = new Fills();
Fill fill = new Fill();
styleSheet.Fills.Append(fill);

styleSheet.Fonts = new Fonts();
Font font = new Font();
styleSheet.Fonts.Append(font);

// **** This code is the code I think you are missing: ****
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);
//**** end of your suspected missing code ****

workbookpart.Workbook = new Workbook();
workbookpart.AddNewPart<WorkbookStylesPart>();

// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());

// Add Sheets to the Workbook.
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

// Append a new worksheet and associate it with the workbook.
Sheet sheet = new Sheet()
{
    Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
    SheetId = 1,
    Name = "mySheet"
};
sheets.Append(sheet);
Worksheet worksheet = new Worksheet();
SheetData sheetData = new SheetData();

Row row = new Row();

Cell cell = new Cell();

cell.StyleIndex = 0;
cell.DataType = CellValues.Date;
string columnValue = DateTime.FromOADate(40651.67778).ToOADate().ToString().Replace(",", ".");
cell.CellValue = new CellValue(columnValue);

row.Append(cell);
sheetData.Append(row);
worksheet.Append(sheetData);
worksheetPart.Worksheet = worksheet;
workbookpart.WorkbookStylesPart.Stylesheet = styleSheet;

// Close the document.
spreadsheetDocument.Close();

XML, сгенерированный из этого для рабочего листа, был:

<?xml version="1.0" encoding="utf-8"?>
<x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:sheetData>
        <x:row>
            <x:c s="0" t="d">
                <x:v>40651.67778</x:v>
            </x:c>
        </x:row>
    </x:sheetData>
</x:worksheet>

И XML, сгенерированный из этого для таблицы стилей, был:

<?xml version="1.0" encoding="utf-8"?>
<x:styleSheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:numFmts>
        <x:numFmt numFmtId="164" formatCode="dd-mm-yyyy hh:mm:ss" />
    </x:numFmts>
    <x:fonts>
        <x:font />
    </x:fonts>
    <x:fills>
        <x:fill />
    </x:fills>
    <x:borders>
        <x:border />
    </x:borders>
    <x:cellXfs>
        <x:xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1" />
    </x:cellXfs>
    <x:cellStyles count="1">
        <x:cellStyle xfId="0" builtinId="0" />
    </x:cellStyles>
</x:styleSheet>

Я вывожу t="d" в свою ячейку, что означает, что ячейка является датой, но я не думаю, что это требуется.

Отличный ресурс для таблиц стилей (среди других элементов OpenXML) можно найти по адресу http://polymathprogrammer.com/2009/11/09/how-to-create-stylesheet-in-excel-open-xml/.

person petelids    schedule 17.07.2014
comment
На самом деле это не помогло мне, но когда я изменил свой тип данных на число, это было исправлено. - person Maurice van Lieshout; 18.07.2014
comment
Извините, это не помогло вам, но я рад, что вы нашли проблему. - person petelids; 18.07.2014
comment
Ну, я использовал ваш код, но мне нужно было только изменить тип данных с даты на число. - person Maurice van Lieshout; 28.07.2014