net core根据word模板利用aspose.words(19.3)根据数据datatable生成word模板中的表格数据
模板中表格存在表头以及一行空行,自己定义模板开始行数和列数
//根据模板名称定义获取模板总列数
private int GetColumnsCount(string docname)
{
int mm = 0;
if (docname == "目录.docx")
{
mm = 7;
}
else if (docname == "1目录.docx" || docname == "1目录.docx" || docname == "3目录.docx")
{
mm = 3;
}
else
{
mm = 4;
}
return mm;
}
//根据模板名称定义获取模板数据开始行数
private int GetStartRow(string docname)
{
int mm = 0;
if (docname == "目录.docx")
{
mm = 2;
}
else
{
mm = 3;
}
return mm;
}
//根据datatable创建表格(末尾添加)
/// </summary>
/// <param name="table">当前doc中的table</param>
/// <param name="list">数据list</param>
/// <param name="doc">⽂档doc</param>
/// <param name="ntc">表格单元格格式</param>
/// <returns></returns>
public static bool CreateTable(Table table, DataTable dataTable, Document doc, List<TableCellAttribute> ntc)
{
bool mm = false;
try
{
int startr = table.Rows.Count - 1;
for (int i = 0; i < dataTable.Rows.Count; i++)
{
Row LastRow = (Row)table.Rows[startr].Clone(true);
LastRow.RowFormat.Height = table.Rows[startr].RowFormat.Height;
int ss = table.Rows.Count;
for (int j = 0; j < dataTable.Columns.Count; j++)
{
var cl = LastRow.Cells[j];
Run sr = new Run(doc, dataTable.Rows[i][j].ToString().Trim());
sr.Font.Size = table.Rows[startr - 1].Cells[0].FirstParagraph.Runs[0].Font.Size;
sr.Font.Name = table.Rows[startr - 1].Cells[0].FirstParagraph.Runs[0].Font.Name;
//Paragraph p = new Paragraph(doc);
//p.AppendChild(sr);
//cl.AppendChild(p);
//这里不用Paragraph,经测试发现用Paragraph生成的word表格会从数据开始行分页,也就是说插入的Paragraph数据前会带一个分页符号,没测出怎么回事来
cl.FirstParagraph.ChildNodes.Add(sr);
}
table.Rows.Add(LastRow);
}
//行合并
List<TableCellAttribute> mcell = ntc.Where(items => items.MergedType == "rows").ToList();
if (mcell != null && mcell.Count > 0)
{
for (int ss = 0; ss < mcell.Count; ss++)
{
if (mcell[ss].startcell != mcell[ss].endcell)
{
// 要合并这两个单元格之间的单元格范围
Cell cellStartRange = table.Rows[mcell[ss].rownum].Cells[mcell[ss].startcell - 1];
Cell cellEndRange = table.Rows[mcell[ss].rownum].Cells[mcell[ss].endcell - 1];
//将两个指定单元格之间的所有单元格合并为一个单元格
MergeCells(cellStartRange, cellEndRange);
}
}
}
//列合并
List<TableCellAttribute> ccell = ntc.Where(items => items.MergedType == "cols").ToList();
if (ccell != null && ccell.Count > 0)
{
for (int ss = 0; ss < ccell.Count; ss++)
{
if (ccell[ss].startcell != ccell[ss].endcell)
{
// 要合并这两个单元格之间的单元格范围
Cell cellStartRange = table.Rows[ccell[ss].startcell].Cells[ccell[ss].colnum - 1];
Cell cellEndRange = table.Rows[ccell[ss].endcell].Cells[ccell[ss].colnum - 1];
//将两个指定单元格之间的所有单元格合并为一个单元格
MergeCells(cellStartRange, cellEndRange);
}
}
}
//行高设置----此处不是通用,是根据模板中间需要一个二次表头取的当前表头行高
List<TableCellAttribute> hcell = ntc.Where(items => items.rowhight > 0).ToList();
if (hcell != null && hcell.Count > 0)
{
for (int i = 0; i < hcell.Count; i++)
{
table.Rows[hcell[i].rownum].RowFormat.Height = table.Rows[i].RowFormat.Height;
}
}
//行字体加粗
List<TableCellAttribute> bcell = ntc.Where(items => items.isbold == "true").ToList();
if (bcell != null && bcell.Count > 0)
{
for (int i = 0; i < bcell.Count; i++)
{
table.Rows[bcell[i].rownum].Cells[bcell[i].colnum - 1].FirstParagraph.Runs[0].Font.Bold = true;
if (bcell[i].fontsize > 10)
{
table.Rows[bcell[i].rownum].Cells[bcell[i].colnum - 1].FirstParagraph.Runs[0].Font.Size = bcell[i].fontsize;
}
}
}
//文字大小
List<TableCellAttribute> fcell = ntc.Where(items => items.fontsize > 10).ToList();
if (fcell != null && fcell.Count > 0)
{
for (int i = 0; i < fcell.Count; i++)
{
table.Rows[fcell[i].rownum].Cells[fcell[i].colnum - 1].FirstParagraph.Runs[0].Font.Size = fcell[i].fontsize;
}
}
//文字居中
List<TableCellAttribute> hccell = ntc.Where(items => items.isHorcenter== "true").ToList();
if (hccell != null && hccell.Count > 0)
{
for (int i = 0; i < hccell.Count; i++)
{
if (hccell[i].isHorcenter == "true")
{
table.Rows[hccell[i].rownum].Cells[hccell[i].colnum - 1].FirstParagraph.ParagraphFormat.Alignment = ParagraphAlignment.Center;
}
}
}
table.Rows[startr].Remove();
mm = true;
}
catch (Exception e)
{
//throw e;
}
return mm;
}
//合并单元格
internal static void MergeCells(Cell startCell, Cell endCell)
{
Table parentTable = startCell.ParentRow.ParentTable;
Point startCellPos = new Point(startCell.ParentRow.IndexOf(startCell), parentTable.IndexOf(startCell.ParentRow));
Point endCellPos = new Point(endCell.ParentRow.IndexOf(endCell), parentTable.IndexOf(endCell.ParentRow));
Rectangle mergeRange = new Rectangle(System.Math.Min(startCellPos.X, endCellPos.X), System.Math.Min(startCellPos.Y, endCellPos.Y),
System.Math.Abs(endCellPos.X - startCellPos.X) + 1, System.Math.Abs(endCellPos.Y - startCellPos.Y) + 1);
foreach (Row row in parentTable.Rows)
{
foreach (Cell cell in row.Cells)
{
Point currentPos = new Point(row.IndexOf(cell), parentTable.IndexOf(row));
if (mergeRange.Contains(currentPos))
{
if (currentPos.X == mergeRange.X)
cell.CellFormat.HorizontalMerge = CellMerge.First;
else
cell.CellFormat.HorizontalMerge = CellMerge.Previous;
if (currentPos.Y == mergeRange.Y)
cell.CellFormat.VerticalMerge = CellMerge.First;
else
cell.CellFormat.VerticalMerge = CellMerge.Previous;
}
}
}
}
//数据格式
public class WordDoc
{
public string tablenames { get; set; }//模板名称
public int tablecolumns { get; set; }//表格列数
public int startrows { get; set; }//从第几行开始
public int PageCount { get; set; }//总页数
public List<DataTable> DataItems { get; set; } //普通模板表单
public List<DataTable> TableItems { get; set; } //表格模板表单
public List<TableCellAttribute> CellAttribute { get; set; } //表格属性
}
//表格单元格属性
public class TableCellAttribute
{
public int tablenum { get; set; }//表格序号
public int rownum { get; set; }//行号
public int colnum { get; set; }//列号
public string MergedType { get; set; }//合并行、列?
public int fontsize { get; set; }//字号
public string fontname { get; set; }//字体
public Double rowhight { get; set; }//行高
public string isbold { get; set; }//字体是否加粗
public string isHorcenter { get; set; }//是否水平居中
public int startcell { get; set; }//开始合并单元格
public int endcell { get; set; }//结束合并单元格
}