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