2014-07-16 78 views
1

我目前正在爲我們的應用程序開發一個組件,它允許我們生成一個Excel工作表,而客戶端不必擁有Excel。所以開放的XML浮現在腦海。Office 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); 

結果不是我想要的,我會從日期中得到double值,而不是我創建的樣式表中的日期。

我會得到這個40651,67778,而不是18-4-2011 16:16

+0

可以找到你想要寫的日期出到Excel文件?如果不是40651.67778的值是正確的? – petelids

+0

是的我想寫出一個Excel文件的日期,似乎值40651.67778是正確的。 Excel將日期處理爲雙精度值,但是此雙精度值需要格式化爲Excel工作表中的日期。所以我製作了這個NumberingFormat「dd-mm-yy hh:mm」。但是,這是行不通的! –

回答

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> 

I輸出t="d"它表示細胞是一個日期,但我不認爲這是必需的。

的樣式表(其他OpenXML的元素之間的)一個巨大的資源可以在http://polymathprogrammer.com/2009/11/09/how-to-create-stylesheet-in-excel-open-xml/

+0

這實際上並沒有爲我修復它,但是當我將我的數據類型更改爲數字時,它已被修復。 –

+0

對不起,它沒有解決它,但我很高興你找到了問題。 – petelids

+0

那麼我用你的代碼,但我只需要將數據類型從日期更改爲數字。 –