【转】【OpenXml】OpenXml操作Word的一些操作总结

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值