OpenXml合并Table单元格(合并性别列)

Posted dzw159

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenXml合并Table单元格(合并性别列)相关的知识,希望对你有一定的参考价值。

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using OpenXML.Model;
using System;
using System.Collections.Generic;

namespace OpenXML

    class Program
    
        //表格数据
        public static List<List<string>> _tabData;

        public Program(List<List<string>> tabData) 
            _tabData = tabData;
        

        static void Main(string[] args)
        
            List<string> dataTitle = new List<string>()  "序号","姓名","性别";
            List<string> data1 = new List<string>()  "1", "张三", "" ;
            List<string> data2 = new List<string>()  "2", "王五", "" ;
            List<string> data3 = new List<string>()  "3", "李四", "" ;

            _tabData = new List<List<string>>();
            _tabData.Add(dataTitle);
            _tabData.Add(data1);
            _tabData.Add(data2);
            _tabData.Add(data3);
            CreateTable(_tabData, @"C:\\Users\\dzw159\\Desktop\\WT\\VS\\OpenXMLFile\\openXMLTest.docx",300);

            //CreateOpenXMLFile(@"C:\\Users\\dzw159\\Desktop\\WT\\VS\\OpenXMLFile\\openXMLTest.docx");
            Console.WriteLine("Hello World!");
            Console.Read();
        

        /// <summary>
        /// 创建Word
        /// </summary>
        /// <param name="filePath"></param>
        public static 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();
            
        

        /// <summary>
        /// 创建Tab
        /// </summary>
        /// <param name="tabData"></param>
        /// <param name="filePath"></param>
        /// <param name="width"></param>
        public static void CreateTable(List<List<string>> tabData, string filePath,int width)
        
            //打开Word文件
            using (WordprocessingDocument d = WordprocessingDocument.Open(filePath,true))
            
                //声明表格
                Table tab = new Table();
                //表格样式
                TableProperties tblProp = new TableProperties(new TableBorders(
                    new TableBorders(
                        new TopBorder()  Val = new EnumValue<BorderValues>(BorderValues.Single),Size = 4,
                         new BottomBorder()  Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 ,
                        new LeftBorder()  Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 ,
                        new RightBorder()  Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 ,
                        new InsideHorizontalBorder()  Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 ,
                        new InsideVerticalBorder()  Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 
                    )
                ));

                //设置表格宽度
                tblProp.TableWidth = new TableWidth()  Width = width.ToString(), Type = TableWidthUnitValues.Dxa ;
                //样式添加
                tab.Append(tblProp);

                int j = 0;
                //循环生成单元格
                foreach (var item in tabData)
                
                    //声明Tab行
                    TableRow row = new TableRow();
                    for (var i = 0; i < item.Count; i++)
                    
                        //申明单元格
                        TableCell cell = new TableCell();

                        TableCellProperties tableCellProperties = new TableCellProperties();
                        //单元格样式设置
                        TableCellMargin margin = new TableCellMargin();
                        margin.LeftMargin = new LeftMargin() 
                            Width="100",
                            Type = TableWidthUnitValues.Dxa
                        ;
                        margin.RightMargin = new RightMargin()
                        
                            Width = "100",
                            Type = TableWidthUnitValues.Dxa
                        ;
                        tableCellProperties.Append(margin);

                        Paragraph par = new Paragraph();
                        Run run = new Run();


                        //如果同一列的参数相同(合并单元格)
                        if (j < (tabData.Count - 1) && item[i] == tabData[j + 1][i])
                        
                            VerticalMerge verticalMerge = new VerticalMerge() 
                                Val = MergedCellValues.Restart
                            ;
                            //RunProperties rpr = new RunProperties();
                            //rpr.Append(new Bold());
                            //run.Append(rpr);
                            //verticalMerge.Val = MergedCellValues.Restart;
                            //Text t = new Text(item[i]);
                            //t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve);

                            //run.Append(t);

                            TableCellProperties tableCellProperties2 = new TableCellProperties();
                            tableCellProperties2.Append(verticalMerge);
                            cell.Append(tableCellProperties2);
                            Text t = new Text(item[i]);
                            t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve);
                            run.Append(t);
                        
                        //和上一行比较(合并单元格)
                        else if (j>0 && j < (tabData.Count) && item[i] == tabData[j -1][i])
                        

                            VerticalMerge verticalMerge = new VerticalMerge()
                            
                                Val = MergedCellValues.Continue
                            ;
                            TableCellProperties tableCellProperties2 = new TableCellProperties();
                            tableCellProperties2.Append(verticalMerge);
                            cell.Append(tableCellProperties2);
                            Text t = new Text(item[i]);
                            t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve);
                            run.Append(t);
                        
                        else
                        
                            //RunProperties rPr = new RunProperties();
                            //rPr.Append(new Bold());
                            //run.Append(rPr);

                            //单元格内容添加(由内向外顺序)
                            Text t = new Text(item[i]);
                            t.Space = new EnumValue<SpaceProcessingModeValues>(SpaceProcessingModeValues.Preserve);
                            run.Append(t);
                        
                        par.Append(run);
                        cell.Append(tableCellProperties);
                        cell.Append(par);
                        row.Append(cell);

                    
                    j++;
                    //表格添加行
                    tab.Append(row);
                
                //objBody.Append(new Paragraph());
                //objBody.Append(new Table());
                

                d.MainDocumentPart.Document.Body.Append(new Paragraph(new Run(tab)));
                d.MainDocumentPart.Document.Save();
            

        
        

    

技术图片

 

注:他们有的说,标记为MergedCellValues.Continue的纵向单元格一定要给值!(这个我试着给赋值null或者为“”,都能正常合并)

 

 

参阅:https://ask.csdn.net/questions/186351

https://blog.csdn.net/u011394397/article/details/78142860

谢谢!

 

以上是关于OpenXml合并Table单元格(合并性别列)的主要内容,如果未能解决你的问题,请参考以下文章

在使用openXML生成word文档时,试图合并表格单元格。

Angular mat-table:是不是可以按列合并单元格?

dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息

table合并单元格

dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息

dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息