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

1

В настоящее время я разрабатываю компонент для нашего приложения, который позволяет нам создавать листы 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

  • 0
    Вы пытаетесь записать дату в файл Excel? Если да, то не правильное ли значение 40651.67778?
  • 0
    Да, я пытаюсь записать дату в файл Excel, кажется, значение 40651.67778 является правильным. Excel обрабатывает даты как двойные значения, но это двойное значение необходимо отформатировать в Date в листе Excel. Поэтому я сделал этот формат нумерации "дд-мм-гг чч: мм". Но это не работает !!
Теги:
openxml-sdk
openxml

1 ответ

0
Лучший ответ

Похоже, что в вашей таблице стилей 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/

  • 0
    Это на самом деле не исправило это для меня, но когда я изменил свой тип данных на число, это было исправлено.
  • 0
    Извините, это не устранило вас, но я рад, что вы нашли проблему.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню