OpenXml合并Table单元格代码实例
更新时间:2020年6月25日 10:36 点击:1572
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或者为“”,都能正常合并)
以上就是全部知识点内容,感谢大家的阅读和对猪先飞的支持。
上一篇: C#项目中跨文件调用公共类的实例方法
下一篇: C#获取Excel第一列的实例方法
相关文章
vue+elementui实现点击table中的单元格触发事件--弹框
这篇文章主要介绍了vue+elementui实现点击table中的单元格触发事件--弹框,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-18C# listview添加combobox到单元格的实现代码
从别处转来的,自己进行了一些小的修改,还不错,你自己先拖一个ListView1和一个ComboBox1,需要的朋友可以参考下...2020-06-25- 这篇文章主要介绍了C#采用OpenXml给word里面插入图片的方法,参考了MSDN官网的示例加以说明,是OpenXml操作Word的一个非常重要的应用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#采用OpenXml给Word文档添加表格的方法,是OpenXml操作Word的一个非常实用的技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了java实现对excel文件的处理合并单元格的操作,开头给大家介绍了依赖引入代码,表格操作的核心代码,代码超级简单,需要的朋友可以参考下...2021-07-24
- 这篇文章主要介绍了C#采用OpenXml实现给word文档添加文字的方法,包括了用法的实例分析,是非常实用的技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了DataGridView带图标的单元格的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了OpenXml读写Excel代码分享,大家参考使用...2020-06-25
- 这篇文章主要为大家详细介绍了iOS实现折叠单元格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-12-08
- 这篇文章主要介绍了C#读写EXCEL单元格的问题实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了PHPExcel合并与拆分单元格的方法,涉及PHPExcel中setCellValue与mergeCells方法的使用技巧,需要的朋友可以参考下...2016-07-25
- DataGridView单元格显示多行的设置方法,需要的朋友可以参考下...2021-09-22
- 这篇文章主要为大家详细介绍了.Net Core使用OpenXML导出、导入Excel的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 这篇文章主要介绍了java 后端生成pdf模板合并单元格表格的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31
- 这篇文章主要介绍了javascript合并表格单元格实例代码,在某些应用中需要动态的合并单元格,感兴趣的朋友可以参考一下...2016-01-07
- 这篇文章主要为大家详细介绍了iOS实现单元格折叠,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-30
ASP.NET GridView 实现课程表显示(动态合并单元格)实现步骤
GridView,ASP.NET中很常用的数据显示控件,这里,我将用这个控件来实现课程表的显示。首先说说课程表的显示与普通记录的显示有何不同?感兴趣的朋友可以了解下,或许对你有所帮助...2021-09-22- 这篇文章主要介绍了C#利用Openxml读取Excel数据的方法,包括使用中的注意点分析及疑难探讨,需要的朋友可以参考下...2020-06-25
- 因为之后的工作可能会经常用到excel,而且也不想荒废Python,出于为以后做准备以防不时之需,下面这篇文章主要给大家介绍了关于如何利用Python批量处理行、列和单元格的相关资料,需要的朋友可以参考下...2021-09-06
- 下面小编就为大家分享一篇OpenXml读取word内容的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25