2014-07-16 6 views
1

Je développe actuellement un composant pour notre application qui nous permet de générer une feuille Excel sans que les clients aient à posséder Excel. Donc Open XML est venu à l'esprit.Office Open XML Date de non-fonctionnement

Ce qui ne fonctionne pas actuellement est l'analyse des dates.

Ceci est mon feuille:

<?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> 

Ceci est mon stylesheet:

<?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> 

Voici le code que j'utilise pour obtenir mes dates.

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

Le résultat est pas ce que je veux, je vais la valeur double de la date et non la date dans la feuille de style que j'ai créé.

Je vais cette 40651,67778 au lieu de 18-4-2011 16:16

+0

Vous essayez d'écrire la date sur un fichier Excel? Si oui, la valeur 40651.67778 n'est-elle pas correcte? – petelids

+0

Oui J'essaie d'écrire la date dans un fichier Excel, il semble que la valeur 40651.67778 est correcte. Excel gère les dates comme des valeurs doubles, mais cette valeur double doit être formatée en Date dans une feuille Excel. J'ai donc fait ce NumberingFormat "jj-mm-aa hh: mm". Mais ça ne marche pas !! –

Répondre

0

Il ressemble à votre feuille de style styles.xml manque l'élément cellStyles. J'ai écrit du code pour créer un fichier similaire au vôtre et sans cet élément le style n'a pas été appliqué. L'élément tout sur le mien ressemble à ceci:

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

Le code je pour générer le fichier est ci-dessous. Remarque: Je ne génère qu'une seule cellule de date mais l'ajout des autres cellules est trivial.

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(); 

Le XML généré à partir de cela pour la feuille de calcul était:

<?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> 

Et le code XML généré à partir de cela pour la feuille de style était:

<?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> 

I sortie t="d" sur ma cellule qui dénote que la cellule est une date mais je ne pense pas que ce soit nécessaire.

Une excellente ressource pour les feuilles de style (entre autres éléments OpenXML) se trouve à http://polymathprogrammer.com/2009/11/09/how-to-create-stylesheet-in-excel-open-xml/

+0

Cela ne l'a pas résolu pour moi, mais quand j'ai changé mon type de données en nombre, il a été corrigé. –

+0

Désolé, il ne l'a pas résolu pour vous mais je suis content que vous ayez trouvé le problème. – petelids

+0

Eh bien, j'ai utilisé votre code, mais j'avais seulement besoin de changer le type de données de date en numéro. –

Questions connexes