我尝试使用OpenXML从头开始创建Excel电子表格,并且我已经将一切正常工作(将实际值转储到实际单元格中),但现在我尝试将数字格式设置为列和我遇到了问题。我有styles.xml
看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<x:styleSheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:numFmts count="12">
<x:numFmt numFmtId="216" formatCode="#,###" />
<x:numFmt numFmtId="217" formatCode="$#,###" />
<x:numFmt numFmtId="218" formatCode="#0.00" />
<x:numFmt numFmtId="219" formatCode="#,###" />
<x:numFmt numFmtId="220" formatCode="#0.0%" />
<x:numFmt numFmtId="221" formatCode="#,###" />
<x:numFmt numFmtId="222" formatCode="#0.0%" />
<x:numFmt numFmtId="223" formatCode="#0.0%" />
<x:numFmt numFmtId="224" formatCode="#0.0%" />
<x:numFmt numFmtId="225" formatCode="#,###" />
<x:numFmt numFmtId="226" formatCode="#,###" />
<x:numFmt numFmtId="227" formatCode="#0.0%" />
</x:numFmts>
<x:cellXfs count="12">
<x:xf numFmtId="216" applyNumberFormat="1" />
<x:xf numFmtId="217" applyNumberFormat="1" />
<x:xf numFmtId="218" applyNumberFormat="1" />
<x:xf numFmtId="219" applyNumberFormat="1" />
<x:xf numFmtId="220" applyNumberFormat="1" />
<x:xf numFmtId="221" applyNumberFormat="1" />
<x:xf numFmtId="222" applyNumberFormat="1" />
<x:xf numFmtId="223" applyNumberFormat="1" />
<x:xf numFmtId="224" applyNumberFormat="1" />
<x:xf numFmtId="225" applyNumberFormat="1" />
<x:xf numFmtId="226" applyNumberFormat="1" />
<x:xf numFmtId="227" applyNumberFormat="1" />
</x:cellXfs>
</x:styleSheet>
但Excel似乎并不喜欢它,并在修复&#34;之后删除它。文件。我在这里错过了什么?文档在完全上有点不确定,以保持Excel的快乐。
我手动分配了numFmtId
,从我认为可能是一个合适的高数字开始。这是正确的方法吗?
另外,我知道formatCode
是重复的,但我认为Excel不会因此被绊倒,我可以在必要时合并它们。
我的列定义如下所示(在sheet.xml
中):
<x:cols>
<x:col min="1" max="1" width="7" />
<x:col min="2" max="2" width="58" />
<x:col min="3" max="3" width="16" style="0" />
<x:col min="4" max="4" width="6" style="1" />
<x:col min="5" max="5" width="17" style="2" />
<x:col min="6" max="6" width="16" style="3" />
<x:col min="7" max="7" width="18" style="4" />
<x:col min="8" max="8" width="17" style="5" />
<x:col min="9" max="9" width="20" style="6" />
<x:col min="10" max="10" width="21" style="7" />
<x:col min="11" max="11" width="21" style="8" />
<x:col min="12" max="12" width="16" style="9" />
<x:col min="13" max="13" width="16" style="10" />
<x:col min="14" max="14" width="19" style="11" />
</x:cols>
进行比较 - 这里是Excel自己创建的styles.xml
文件的片段:
<numFmts count="1">
<numFmt numFmtId="164" formatCode="#,##0\p"/> // where does 164 come from?
</numFmts>
<cellXfs count="3">
<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/> // do you always need a 0 xf entry? It isn't referenced in the sheet.xml file
<xf numFmtId="3" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/> // assuming numFmtId = 3 is a built in format??
<xf numFmtId="164" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1"/>
</cellXfs>
答案 0 :(得分:5)
回答我自己的问题,但我发现了这个帖子:
http://polymathprogrammer.com/2009/11/09/how-to-create-stylesheet-in-excel-open-xml/
这表明最小样式表需要的不仅仅是numFmts
和cellXfs
。所以我调整了他们的代码来生成一个最小的样式表,我可以插入我的单元格格式和数字格式(我在循环中做了):
private Stylesheet CreateStylesheet()
{
Stylesheet ss = new Stylesheet();
Fonts fts = new Fonts();
DocumentFormat.OpenXml.Spreadsheet.Font ft = new DocumentFormat.OpenXml.Spreadsheet.Font()
{
FontName = new FontName()
{
Val = "Calibri"
},
FontSize = new FontSize()
{
Val = 11
}
};
fts.Append(ft);
fts.Count = (uint)fts.ChildElements.Count;
Fills fills = new Fills();
fills.Append(new Fill()
{
PatternFill = new PatternFill()
{
PatternType = PatternValues.None
}
});
fills.Append(new Fill()
{
PatternFill = new PatternFill()
{
PatternType = PatternValues.Gray125
}
});
fills.Count = (uint)fills.ChildElements.Count;
Borders borders = new Borders();
Border border = new Border()
{
LeftBorder = new LeftBorder(),
RightBorder = new RightBorder(),
TopBorder = new TopBorder(),
BottomBorder = new BottomBorder(),
DiagonalBorder = new DiagonalBorder()
};
borders.Append(border);
borders.Count = (uint)borders.ChildElements.Count;
CellStyleFormats csfs = new CellStyleFormats();
CellFormat cf = new CellFormat() {
NumberFormatId = 0,
FontId = 0,
FillId = 0,
BorderId = 0
};
csfs.Append(cf);
csfs.Count = (uint)csfs.ChildElements.Count;
NumberingFormats nfs = new NumberingFormats();
CellFormats cfs = new CellFormats();
cf = new CellFormat()
{
NumberFormatId = 0,
FontId = 0,
FillId = 0,
BorderId = 0,
FormatId = 0
};
cfs.Append(cf);
ss.Append(nfs);
ss.Append(fts);
ss.Append(fills);
ss.Append(borders);
ss.Append(csfs);
ss.Append(cfs);
CellStyles css = new CellStyles();
CellStyle cs = new CellStyle()
{
Name = "Normal",
FormatId = 0,
BuiltinId = 0
};
css.Append(cs);
css.Count = (uint)css.ChildElements.Count;
ss.Append(css);
DifferentialFormats dfs = new DifferentialFormats();
dfs.Count = 0;
ss.Append(dfs);
TableStyles tss = new TableStyles()
{
Count = 0,
DefaultTableStyle = "TableStyleMedium9",
DefaultPivotStyle = "PivotStyleLight16"
};
ss.Append(tss);
return ss;
}
不是肯定的,那里没有可以放弃的东西,但我没有耐心通过反复试验来看看它是否可以变得更苗条。
除了FontId
之外,我猜单元格格式必须还有FillId
,BorderId
,FormatId
和NumberFormatId
并且为了拥有这些ID,您需要为每个ID创建至少一个条目。尽管XML Schema将它们标记为“可选”。