当前位置: 移动技术网 > IT编程>开发语言>c# > OpenXml合并Table单元格代码实例

OpenXml合并Table单元格代码实例

2019年09月09日  | 移动技术网IT编程  | 我要评论
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或者为“”,都能正常合并)

以上就是全部知识点内容,感谢大家的阅读和对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网