假如我们需要在一个word文档的某个位置插入一张表格,而且要对这一张表格中的单元格做拆分合并,之类的。
先看下效果,先不管表格是否合理,总之就是要这样的统计文档,但是人数,班级数都是不确定的,也就是表格是根 据数据动态生成的,
这样我们就很难用之前的替换方式来实现,也就是要动态来创建表格。
班级成绩统计单
班级 | 姓名 | 成绩 | 人数总计 | 班主任 |
一班 | 张三 | 498 | 1 | 小李 |
二班 | 李四 | 354 | 2 | 陈飞 |
小红 | 502 | |||
三班 | 丁爽 | 566 | 1 | 王林 |
1、用单元格拆分的方式实现,也就是根据有多少班级,则增加多少行,针对于其中的学生信息再对单元格进行拆分。
/// <summary>
/// 数据实体类
/// </summary>
public class Student
{
public string Name;//姓名
public int Score;//成绩
public string StuClass;//班级
public string Leader;//班主任
}
/// <summary>
/// 动态创建table到word
/// </summary>
protected void CreateTableToExcel()
{
Word.Application app = null;
Word.Document doc = null;
try
{
//构造数据
List<Student> datas = new List<Student>();
datas.Add(new Student{ Leader="小李", Name="张三", Score=498, StuClass="一班"});
datas.Add(new Student{ Leader="陈飞", Name="李四", Score=354, StuClass="二班"});
datas.Add(new Student{ Leader="陈飞", Name="小红", Score=502, StuClass="二班"});
datas.Add(new Student{ Leader="王林", Name="丁爽", Score=566, StuClass="三班"});
var cate = datas.GroupBy(s=>s.StuClass);
int rows = cate.Count()+1;//表格行数加1是为了标题栏
int cols = 5;//表格列数
object oMissing = System.Reflection.Missing.Value;
app = new Word.Application();//创建word应用程序
doc = app.Documents.Add();//添加一个word文档
//输出大标题加粗加大字号水平居中
app.Selection.Font.Bold = 700;
app.Selection.Font.Size = 16;
app.Selection.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
app.Selection.Text = "班级成绩统计单";
//换行添加表格
object line = Word.WdUnits.wdLine;
app.Selection.MoveDown(ref line, oMissing, oMissing);
app.Selection.TypeParagraph();//换行
Word.Range range = app.Selection.Range;
Word.Table table = app.Selection.Tables.Add(range, rows, cols, ref oMissing, ref oMissing);
//设置表格的字体大小粗细
table.Range.Font.Size = 10;
table.Range.Font.Bold=0;
//设置表格标题
int rowIndex = 1;
table.Cell(rowIndex, 1).Range.Text = "班级";
table.Cell(rowIndex, 2).Range.Text = "姓名";
table.Cell(rowIndex, 3).Range.Text = "成绩";
table.Cell(rowIndex, 4).Range.Text = "人数";
table.Cell(rowIndex, 5).Range.Text = "班主任";
//循环数据创建数据行
rowIndex++;
foreach (var i in cate)
{
table.Cell(rowIndex, 1).Range.Text = i.Key;//班级
table.Cell(rowIndex, 4).Range.Text = i.Count().ToString();//人数
table.Cell(rowIndex, 5).Range.Text = i.First().Leader;//班主任
table.Cell(rowIndex,2).Split(i.Count(), 1);//分割名字单元格
table.Cell(rowIndex,3).Split(i.Count(), 1);//分割成绩单元格
//对表格中的班级、姓名,成绩单元格设置上下居中
table.Cell(rowIndex, 1).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
table.Cell(rowIndex, 4).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
table.Cell(rowIndex, 5).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
//构建姓名,成绩数据
foreach (var x in i)
{
table.Cell(rowIndex, 2).Range.Text = x.Name;
table.Cell(rowIndex, 3).Range.Text = x.Score.ToString();
rowIndex++;
}
}
//导出到文件
string newFile = DateTime.Now.ToString("yyyyMMddHHmmssss") + ".doc";
string physicNewFile = Server.MapPath(newFile);
doc.SaveAs(physicNewFile,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
}
catch(Exception ex)
{
}
finally
{
if (doc != null)
{
doc.Close();//关闭文档
}
if (app != null)
{
app.Quit();//退出应用程序
}
}
}
2、单元格合并的方式,即循环数据输出,然后对班级,人数,班主任列进行合并,但是合并的时候需要注意,假如某班级只有一个同学,也就是其实不需要合并的,
则必须排除在外,否则会出现”此命令无效“的异常,所以下面代码在合并的时候做了一个判断。
protected void CreateTableToExcel2()
{
Word.Application app = null;
Word.Document doc = null;
try
{
//构造数据
List<Student> datas = new List<Student>();
datas.Add(new Student { Leader = "小李", Name = "张三", Score = 498, StuClass = "一班" });
datas.Add(new Student { Leader = "陈飞", Name = "李四", Score = 354, StuClass = "二班" });
datas.Add(new Student { Leader = "陈飞", Name = "小红", Score = 502, StuClass = "二班" });
datas.Add(new Student { Leader = "王林", Name = "丁爽", Score = 566, StuClass = "三班" });
var cate = datas.GroupBy(s => s.StuClass);
int rows = datas.Count + 1;
int cols = 5;//表格列数
object oMissing = System.Reflection.Missing.Value;
app = new Word.Application();//创建word应用程序
doc = app.Documents.Add();//添加一个word文档
//输出大标题加粗加大字号水平居中
app.Selection.Font.Bold = 700;
app.Selection.Font.Size = 16;
app.Selection.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
app.Selection.Text = "班级成绩统计单";
//换行添加表格
object line = Word.WdUnits.wdLine;
app.Selection.MoveDown(ref line, oMissing, oMissing);
app.Selection.TypeParagraph();//换行
Word.Range range = app.Selection.Range;
Word.Table table = app.Selection.Tables.Add(range, rows, cols, ref oMissing, ref oMissing);
//设置表格的字体大小粗细
table.Range.Font.Size = 10;
table.Range.Font.Bold = 0;
//设置表格标题
int rowIndex = 1;
table.Cell(rowIndex, 1).Range.Text = "班级";
table.Cell(rowIndex, 2).Range.Text = "姓名";
table.Cell(rowIndex, 3).Range.Text = "成绩";
table.Cell(rowIndex, 4).Range.Text = "人数";
table.Cell(rowIndex, 5).Range.Text = "班主任";
//循环数据创建数据行
rowIndex++;
foreach (var i in cate)
{
int moveCount = i.Count() - 1;//纵向合并行数
if (moveCount.ToString() != "0")
{
table.Cell(rowIndex, 1).Merge(table.Cell(rowIndex + moveCount, 1));//合并班级
table.Cell(rowIndex, 4).Merge(table.Cell(rowIndex + moveCount, 4));//合并人数
table.Cell(rowIndex, 5).Merge(table.Cell(rowIndex + moveCount, 5));//合并班主任
}
//写入合并的数据并垂直居中
table.Cell(rowIndex, 1).Range.Text = i.Key;
table.Cell(rowIndex, 4).Range.Text = i.Count().ToString();
table.Cell(rowIndex, 5).Range.Text = i.First().Leader;
table.Cell(rowIndex, 1).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
table.Cell(rowIndex, 4).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
table.Cell(rowIndex, 5).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
//构建姓名,成绩数据
foreach (var x in i)
{
table.Cell(rowIndex, 2).Range.Text = x.Name;
table.Cell(rowIndex, 3).Range.Text = x.Score.ToString();
rowIndex++;
}
}
//导出到文件
string newFile = DateTime.Now.ToString("yyyyMMddHHmmssss") + ".doc";
string physicNewFile = Server.MapPath(newFile);
doc.SaveAs(physicNewFile,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
}
catch (Exception ex)
{
}
finally
{
if (doc != null)
{
doc.Close();//关闭文档
}
if (app != null)
{
app.Quit();//退出应用程序
}
}
}