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 文档插入不可见的额外版权信息