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或者为“”,都能正常合并)

以上是 OpenXml合并Table单元格代码实例 的全部内容, 来源链接: utcz.com/z/357917.html

回到顶部