OpenXml相对于用MS提供的COM组件来生成WORD,有如下优势:
1.相对于MS 的COM组件,因为版本带来的不兼容问题,及各种会生成WORD半途会崩溃的问题.
2.对比填满一张30多页的WORD来说(包含图,表等),用COM组件来生成会占用20秒,Openxml1秒.
3.MS Word软件太贵了,你的客户装的是开源WORD,如LibreOffice,OpenOffice.这样你就只能用Openxml生成的WORD文档,各种支持MS Word都能打开,避免客户机器上安装MS Word.
简单来说OpenXml的各个操作.
首先用OpenXml打开一张报表.
public void CreateOpenXMLFile(string filePath)
{
using (WordprocessingDocument objWordDocument = WordprocessingDocument.Create(filePath, WordprocessingDocumentType.Document))
{
MainDocumentPart objMainDocumentPart = objWordDocument.AddMainDocumentPart();
objMainDocumentPart.Document = new Document(new Body());
Body objBody = objMainDocumentPart.Document.Body;
//创建一些需要用到的样式,如标题3,标题4,在OpenXml里面,这些样式都要自己来创建的
//ReportExport.CreateParagraphStyle(objWordDocument);
SectionProperties sectionProperties = new SectionProperties();
PageSize pageSize = new PageSize();
PageMargin pageMargin = new PageMargin();
Columns columns = new Columns() { Space = "220" };//720
DocGrid docGrid = new DocGrid() { LinePitch = 100 };//360
//创建页面的大小,页距,页面方向一些基本的设置,如A4,B4,Letter,
//GetPageSetting(PageSize,PageMargin);
//在这里填充各个Paragraph,与Table,页面上第一级元素就是段落,表格.
objBody.Append(new Paragraph());
objBody.Append(new Table());
objBody.Append(new Paragraph());
//我会告诉你这里的顺序很重要吗?下面才是把上面那些设置放到Word里去.(大家可以试试把这下面的代码放上面,会不会出现打开openxml文件有误,因为内容有误)
sectionProperties.Append(pageSize, pageMargin, columns, docGrid);
objBody.Append(sectionProperties);
//如果有页眉,在这里添加页眉.
if (IsAddHead)
{
//添加页面,如果有图片,这个图片和上面添加在objBody方式有点不一样,这里搞了好久.
//ReportExport.AddHeader(objMainDocumentPart, image);
}
objMainDocumentPart.Document.Save();
}
}
发现上面有点注解说错,那个顺序不影响Word,但是影响如LibreOffice软件打开后看到的格式不正确.改里面太麻烦,直接在这说了.
从这个总纲里,把上面的各个步骤再来仔细说下.
首先是在Openxml创建标题3,标题4.
// 为文档创建段落样式
public static void CreateParagraphStyle(WordprocessingDocument doc)
{
// 进入文档控制样式部分
StyleDefinitionsPart styleDefinitionsPart;
styleDefinitionsPart = doc.MainDocumentPart.AddNewPart<StyleDefinitionsPart>();
Styles root = new Styles();
root.Save(styleDefinitionsPart);
Styles styles = styleDefinitionsPart.Styles;
if (styles == null)
{
styleDefinitionsPart.Styles = new Styles();
styleDefinitionsPart.Styles.Save();
}
Style style3 = CreateTitleStyle(3);
Style style4 = CreateTitleStyle(4);
// 把样式添加入文档中
styles.Append(style3);
styles.Append(style4);
}
private static Style CreateTitleStyle(int titleIndex)
{
string titleID = titleIndex.ToString();
string rsid = string.Empty;
string before = string.Empty;
string after = string.Empty;
string line = string.Empty;
string val = string.Empty;
int outline = titleIndex - 1;
if (titleIndex == 3)
{
rsid = "00BA1E98";
before = "130";//"260"
after = "0";
line = "286";//"416"
val = "32";
}
else if (titleIndex == 4)
{
rsid = "00BA1E98";
before = "88";
after = "0";
line = "288";//"376"
val = "28";
}
Style style2 = new Style() { Type = StyleValues.Paragraph, StyleId = titleID };
StyleName styleName2 = new StyleName() { Val = "heading " + titleID };
BasedOn basedOn1 = new BasedOn() { Val = "a" };
NextParagraphStyle nextParagraphStyle1 = new NextParagraphStyle() { Val = "a" };
LinkedStyle linkedStyle1 = new LinkedStyle() { Val = titleID + "Char" };
UIPriority uIPriority1 = new UIPriority() { Val = 9 };
PrimaryStyle primaryStyle2 = new PrimaryStyle();
Rsid rsid2 = new Rsid() { Val = rsid };
style2.Append(styleName2);
style2.Append(basedOn1);
style2.Append(nextParagraphStyle1);
style2.Append(linkedStyle1);
style2.Append(uIPriority1);
style2.Append(primaryStyle2);
style2.Append(rsid2);
StyleParagraphProperties styleParagraphProperties2 = new StyleParagraphProperties();
KeepNext keepNext1 = new KeepNext();
KeepLines keepLines1 = new KeepLines();
SpacingBetweenLines spacingBetweenLines1 = new SpacingBetweenLines() { Before = before, After = after, Line = line, LineRule = LineSpacingRuleValues.Auto };
OutlineLevel outlineLevel1 = new OutlineLevel() { Val = outline };
styleParagr