引言
在一篇博客中给大家介绍了如何自动生成word文件,其中我们替换的都是一些字段,但是有时候我们需要将页面中的表格中的数据嵌入到我们的表格中,像我们的一些账单明细,或者是我们项目中用到的一些非常详细打分表等,这些数据都是进过我们非常复杂的计算得到的结果,所以我们在采用报表实现的时候会比较困难,那么我就给大家介绍如何在.doc文件中嵌入table。
1、制作word模板
我们需要制作一个模板,然后在模板中确定我们的表格嵌入的位置,就像我们替换变量一样,我们制作出模板以后,需要在我们嵌入模板的位置插入书签。如下图:
书签中的table这个名称就是我们在代码中决定表格插入的位置。
2、插入代码
#region 获取招标文件制作模板 //获得程序集根目录 string rootPath = AppDomain.CurrentDomain.BaseDirectory; //招标文件模板路径 var mainDocPath = rootPath + "/Content/得分统计/" + "得分统计表.doc"; Aspose.Words.Document docMain = new Aspose.Words.Document(mainDocPath); DocumentBuilder builder = new DocumentBuilder(docMain); #endregion #region 替换模板中的内容常用字段 //获取系统当前时间 DateTime now = DateTime.Now; //替换招标编号 docMain.Range.Replace("{BidProjectId}", BidProjectId, false, false); //替换评标报告生成日期 docMain.Range.Replace("{Now}", now.Year + "年" + now.Month + "月" + now.Day + "日", false, false); #endregion #region 嵌入评委打分表格表头 //开始添加值 builder.MoveToBookmark("table"); //添加表头数据 ArrayList tableHeadArray = new ArrayList(); //添加固定的前两列表头信息 tableHeadArray.Add("序号"); //builder.RowFormat.CellSpacing = 50; tableHeadArray.Add("供应商"); tableHeadArray.Add("报价得分"); //根据招标编号,获取所对应的所有评分项信息,评分名称作为第二列之后的表头信息 //获取评委打分项 List<BidJudgeViewModel> listBidJudge = iBidJudgeService.GetBidJudge(BidProjectId); //去除报价得分选项 for (int i = 0; i < listBidJudge.Count; i++) { if (listBidJudge[i].JudgeItemName == "报价得分") { listBidJudge.Remove(listBidJudge[i]); } } foreach (var item in listBidJudge) { TableHeaderViewModel JudgeHeader = new TableHeaderViewModel(); //将查到的评分项名称作为字段名 JudgeHeader.FieldText = item.JudgeItemName; //将评分项加载为表头 tableHeadArray.Add(JudgeHeader.FieldText); } //最后一列“总分” tableHeadArray.Add("总分"); for (int j = 0; j < tableHeadArray.Count; j++) { //插入单元格 builder.InsertCell(); //设置单元格边框样式及颜色 builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; //设置单元格宽度 builder.CellFormat.Width = 80; builder.Write(tableHeadArray[j].ToString()); } builder.EndRow(); #endregion
#region 遍历集合中的每个对象,作为表格的一行 for (int n = 0; n < UserInfo.Count; n++)//控制行数 { //将每个评分值去除 for (int m = 0; m < test[n].Count; m++)//控制列数 { //取出集合中的每一个对象 builder.InsertCell();// 添加一个单元格 builder.CellFormat.Borders.LineStyle = LineStyle.Single; builder.CellFormat.Borders.Color = System.Drawing.Color.Black; //builder.CellFormat.Width = widthList[j]; builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None; builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中对齐 builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中对齐 builder.Write(test[n][m].ToString()); } builder.EndRow(); } //将替换后的评标报告保存在以下路径 string outputPath = rootPath + "/Content/得分统计表.doc"; //生成的评标报告的名称 string filename = "得分统计表" + now.ToString("yyyy年mm月dd日") + ".doc"; //保存文件 docMain.Save(outputPath); //将文件返回给视图 return File(outputPath, "application/msword", filename); } } } #endregion
3、代码讲解
在插入表格的过程中我们的所有的数据都是动态添加的,不论是表头还是表格的内容,也就说我们的行和列都是不固定的,这样就需要我们通过循环来控制我们的行数和列数。 builder.Write(test[n][m].ToString());在我们往表格中写入数据的时候我们只能以行为一个整体来添加数据,所以在添加数据的时候需要将每一行中的所有列的值作为一个list来控制写入,这样我们就能很好的控制我们写入的数据是正确的。
小结
在实现功能时候我们会遇到很多的问题不论是技术上还是逻辑上面的,这时候我们需要静下心来好好的思考一下我们应该怎样来实现比较简单的,我的一个习惯就是当遇到很复杂的逻辑的时候喜欢静下心来拿起笔画画她们之间的关系,这样我们在思考的过程中会一点一点的突破,最后实现我们的伟大逻辑。当我拿到专家评分的逻辑的时候我就大概用了一下午的时间在纸上面写逻辑,最后轻松搞定。所以在这个浮躁的社会需要静下心来实现一些东西。。。。