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

谢谢!

原文地址:https://www.cnblogs.com/dzw159/p/11337357.html

时间: 2024-10-08 05:13:53

OpenXml合并Table单元格(合并性别列)的相关文章

js合并table单元格实例

这里展示js合并table的单元格,代码亲测可行 后台采用springmvc搭建 Record实体类 public class Record {     public String isp;     public String large_area;     public String province;     public String name;     public String age;       ......   //省略get和set方法  } action方法         

js 按相同行合并table单元格

查到的合并的代码 1 function combineRows(tableid) { 2 var tab = document.getElementById(tableid); 3 var maxcol = 4, count, value, start; 4 for (var col = maxcol; col >= 0; col--) { 5 count = 1; 6 value = ""; 7 for (var i = 1; i < tab.rows.length; i

js合并table单元格(拼table的时候并不知道具体几行几列)

Sys.Application.add_load(function () { var tab = document.getElementById("ctl00_ContentPlaceHolder1_viewcontrolTT_Repeater1_ctl00_viewcontrolTT_grid"); //要合并的tableID if (!tab) { alert("未获取到表格!"); } else { //从第二行开始,排除标题行 var startRow =

Javascript 动态合并table单元格

废话不说直接上代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&quo

JTable 单元格合并 【转】

单元格合并 一.单元格合并.(1)我们可以使用Jtable的三个方法:getCellRect(),columnAtPoint(),and rowAtPoint().第一个方法返回一个单元格的边界(Rectangle类),第二.三个方法分别返回屏幕指定位置的列和行.为了实现单元格合并,我们需要重载(overwrite)这三个方法. (2)另外我们需要找出渲染Jtable的ComponentUI对象,并且修改它以达到我们的目的. (3)创建新的类记录单元格合并情况的数据模型,它要包涵一个方法来取得单

关于table动态添加数据 单元格合并 数组合并

var newArr = [ {"BranchID":1,"BranchName":"城二","BranchFullName":"城二分公司","IssueTypeID":101,"IssueTypeName":"宏蜂窝连片弱覆盖","Total":242,"WithoutDemand":139,"

模拟Excel同一列相同值的单元格合并

背景 项目中有一个查询工作量,可以将查询的结果导出到Excel表中.在Excel工具中,有一个合并居中功能,可以将选中的单元格合并成一个大的单元格.现在需要在程序中直接实现查询结果的汇总, 问题分析 话不多说,上图分析: 如图,对于第一列,前三行的值都为A,那么就是需要执行合并.与此同时,1-3行后面的列采取同样的措施,约定前6列(下标0-5). 手动对1-3列进行分析的结果,如图,有点花哨!!! 可以看到结果中,对于整个1-3行后继的列操作依然如此. 这里要突出讲一下第3列(值为R),该列全部

自定义控件:DataGridView 单元格合并和二维表头

DataGridView单元格合并和二维表头应用: //DataGridView绑定数据 DataTable dt = new DataTable(); dt.Columns.Add("1"); dt.Columns.Add("2"); dt.Columns.Add("3"); dt.Columns.Add("4"); dt.Rows.Add("中国", "上海", "5000

ExtJS 4.2 Grid组件的单元格合并

ExtJS 4.2 Grid组件本身并没有提供单元格合并功能,需要自己实现这个功能. 目录 1. 原理 2. 多列合并 3. 代码与在线演示 1. 原理 1.1 HTML代码分析 首先创建一个Grid组件,然后查看下的HTML源码. 1.1.1 Grid组件 1.1.2 HTML代码 从这些代码中可以看出,Grid组件可分为grid-header和grid-body 两块区域(若含有工具栏和分页栏,它们都会含有各自的独立区域). 其中grid-body包含了许多tr元素,每一个tr都是代表Gri