word嵌入表格,完美解决报表

   
【背景概要】

    项目中,有很多地方涉及到需要打印各种表格,静态的,动态的,都有。而之前利用锐浪报表实现了显示表格的需求,但在进行条件筛选后,报表中的数据并不能显示了。这个问题一直搁置了很久,一直得不到解决。

   
【问题解决】

    在放下报表问题实现其它需求期间,偶然发现,我们可以动态的将表格嵌入到word文件中,利用word将各种表格显示打印。这里用到的就是Aspose Word控件,不但可以帮助我们实现在word中插入必要的参数,也可以帮助我们在word中插入必要的表格。

   
【项目环境】

    项目前台利用的MVC框架,EasyUI样式,VS2012开发环境。

   
【实现步骤】

   
1.在本地新建一个word模板,在项目中添加现有项,把制作好的word模板添加到项目中。

    word模板如下图所示,

    
    参数说明:模板{}中的字段都是灵活的,所以在此写成这样作为参数,在项目中通过代码动态加载。

   
2.前台页面已经实现通过按条件搜索,将查询到的数据显示在datagrid表格中,具体效果如下图所示:  

  

    3.查询结果出来后,下面真正开始利用代码实现将表格嵌入word模板中。关键步骤如下:

     
第一,获取招标文件制作模板:

            //获得程序集根目录
            string rootPath = AppDomain.CurrentDomain.BaseDirectory;

            //招标文件模板路径
            var mainDocPath = rootPath + "/Content/评委签到记录表/" + "评委签到表.doc";
            Aspose.Words.Document docMain = new Aspose.Words.Document(mainDocPath);
            DocumentBuilder builder = new DocumentBuilder(docMain);

     第二,通过前台页面和后台方法,获取各个参数:

    //获取招标项目编号
    string BidProjectId = Request["BidProjectId"].ToString();
    //获取招标项目名称
    string BidCompanyName = iBidZRecordInfoService.GetBidNameByBidProjectId(BidProjectId);

     第三,将获取到的参数值替换到模板中:

            //获取系统当前时间
            DateTime now = DateTime.Now;
            //替换招标编号
            docMain.Range.Replace("{BidProjectId}", BidProjectId, false, false);
            //替换项目名称
            docMain.Range.Replace("{ProjectName}", BidCompanyName, false, false);
            //替换评标报告生成日期
            docMain.Range.Replace("{Now}", now.Year + "年" + now.Month + "月" + now.Day + "日", false, false);

     第四,嵌入表格的表头:

            //开始添加值,书签设置,控制表格的起始位置
            builder.MoveToBookmark("table");
            //添加表头数据
            ArrayList tableHeadArray = new ArrayList();
            //添加固定的前两列表头信息
            tableHeadArray.Add("姓名");
            tableHeadArray.Add("工作单位");
            tableHeadArray.Add("职称");
            tableHeadArray.Add("到达时间");
            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 = 100;
                //将值填入表格
                builder.Write(tableHeadArray[j].ToString());

            }
            builder.EndRow();

     第五,将查询到的数据动态嵌入word中:

              //获取条件查询后的结果,返回值为List<ViewModel>
            List<SpecialistInfoViewModel> SpecialistInfo = iSpecialistService.GetSpecialInfo(BidProjectId);
             //定义一个新的List集合,以便最后直接将记录整行填充
            IList<IList<string>> temp= new List<IList<string>>();
             //控制表格的行数,即为查询到结果的count值
            for (int n = 0; n < SpecialistInfo.Count; n++)
            {
                //定义一个新的List集合,存储各行各字段的值
                List<string> newspecialist = new List<string>();
                newspecialist.Add(SpecialistInfo[n].SpecialistName.ToString());
                newspecialist.Add("");
                newspecialist.Add(SpecialistInfo[n].SpecialistType.ToString());
                newspecialist.Add("");
                newspecialist.Add(SpecialistInfo[n].SpecialistComment.ToString());
                //temp这个list中已经存放了每一行的记录值
                temp.Add(newspecialist);
            }
            //行数
            for (int i = 0; i < SpecialistInfo.Count; i++)
            {
                 //控制列数
                for (int m = 0; m < tableHeadArray.Count; m++)
                {
                    // 添加一个单元格
                    builder.InsertCell();
                    //设置单元格的样式和颜色
                    builder.CellFormat.Borders.LineStyle = LineStyle.Single;
                    builder.CellFormat.Borders.Color = System.Drawing.Color.Black;
                    builder.CellFormat.VerticalMerge = Aspose.Words.Tables.CellMerge.None;
                    builder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//垂直居中对齐
                    builder.ParagraphFormat.Alignment = ParagraphAlignment.Center;//水平居中对齐
                    //通过test这个List集合,填充每个单元格
                    builder.Write(test[i][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);

     4.以上各步是Controller下的方法,最后通过js在点击按钮后,调用该方法即可,js代码如下:

    //生成评委签到记录表
function ExportSpecialistSign() {
    //获取查询的招标编号
    var BidProjectId = document.getElementById('BidProjectId').value;
     //调用Controller中对应的方法
    window.location.href = '/SpecialistSign/ExportSpecialistSign?BidProjectId=' + BidProjectId;
}

     【效果展示】

     通过以上步骤,终于实现了一直搁置的报表问题。下面是从word中截取的报表信息:


    

    【编程总结】

    在实现这一功能的过程中,最复杂的是数组那部分的逻辑。另外,在巨人的肩膀上,也让我见识到了List的强大。一个List不仅仅是一个List那么简单,我们可以通过自己的创建,实现对List的拼接,实现对List的重组,从而完美得到自己想要的那一行行记录。积累,思考,应用,这都是自己在以后的学习需要特别值得注意的。 

时间: 2024-12-02 03:25:13

word嵌入表格,完美解决报表的相关文章

将word嵌入excel的方法

  word嵌入excel的步骤入下: ①先启动Excel,将要进行处理的工作表打开. ②按下Ctrl+A键全选,然后复制. ③启动Word2007,光标定位到要显示文本的地方,右击,粘贴,将表格数据粘贴进来. ④这时拖动滚动条移至最下方,会有一个粘贴选项,点击它,勾选匹配目标区域表格样式并链接到Excel

word嵌入到ocx中,2007的word功能区不刷新显示

问题描述 word嵌入到ocx中,2007的word功能区不刷新显示 自己用vc制作的ocx控件,把word文档打开在该ocx控件里面,但是2007版的 功能区robbin显示不正常,有时可以完全显示,有时不显示,等鼠标放上去或者 被其他窗口遮挡一下后才全部显示,不知道可以这么解决

php错误提示failed to open stream: HTTP request failed!的完美解决方法

google或者baidu一下,好多这样的问题,解决的方法都是修改php.ini,把allow_url_fopen给启用,改成 allow_url_fopen = On 这样做可以解决某些人的问题,有人说在php.ini中,有这样两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示通过哪种脚本访问网络,默认前面有个 " ; " 去掉即可.)重启服务器. 但是有些还是会有这个警告信息,想用完美的解决

AJAX中文乱码PHP完美解决方法

AJAX中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助. 最近在做一个项目,遇到AJAX中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助. 众所周知,使用AJAX传送和接收中文参数时,如果不在客户端和服务器做相应的处理就会出现乱码问题,在网上相应的文章也不少,但是有的情况下很难从中找到符合自己理想的答案,我今天就是在网上找了很多,但是都差不多,讲ASP和JSP的比较多

CSS实例教程:完美解决IE6不支持hover的方法

文章简介:完美解决IE6不支持hover的方法. <style type="text/css">         p:hover,p.hover { background:#eee; }   /* 就是要多写一个.hover而已 */ </style> 下面这段代码要放到页面的底部在</body> 前: <script type="text/javascript">    //<!–  让所有标记支持hover 

JDom输出UTF-8的XML完美解决方法

完美的解决方法从辟谣开始: 1)JDOM是否生成UTF-8的文件与Format是否设置无关,只有输出其他字符编码才需要设置,见下面的注释. 2)JDOM输出UTF-8文件乱码的根本原因并非在JDOMAPI,而是在JDK. 具体描述: JDOM的输出类XMLOutputter有两个output接口,除了都具有一个Document参数外,分别接受Writer和OutputStream参数. 这给我们一个错觉,两个接口可以任意使用. 首先我们用output(doc,System.out)来做测试,此时

如何从MS Word的表格中提取指定单元格的数据

最近在做一个项目,其中有一个技术性的难题:"提取Word指定表格中的指定单元格的数据".对于像我这样一个仅仅对于C#语法略有了解的学生来说确实让我感到有些力不从心,这真是一个非常非常大的挑战. 登录google,我检索了相当多的文章,从多的500多行的代码到少的不到100行的代码.这些提取数据的方法基本上就那么几种,这些人放在博客上基本上都是你copy我的,我copy你的.现在的有些作者很不负责,拿来一段代码就放上去了.通览这些代码,你会发现有些地方居然用到了作者自定义的类:然而,作者

word将表格拆分并左右排列呢?

  word将表格拆分并左右排列呢? 1.将表格拆分,并左右排列,要达到如图所示的效果. 2.我们要确保表格下方有两个回车符号 3.选择要拆分的部分,如图所示,将光标移动在表格上拖动选择. 4.选择后将光标移动到已经选择的部分. 5.拖动鼠标移动到第二个回车键位置. 6.这个时候会达到如图所示的效果.

Word的表格转置的操作方法

  Word的表格转置的操作方法            1.选中Word中需要转置的表格,按[Ctrl]+[C]组合键进行复制,然后打开空白的Excel工作簿,按[Ctrl]+[V]组合键将表格粘贴到工作簿中,如图1所示. 图1 将Word中的文本复制到Excel工作簿中 2.选中当前Excel工作簿中的表格,按[Ctrl]+[C]组合键复制,然后选择表格之外的任意一个空白单元格,单击"开始"选项卡中[粘贴]下三角按钮,在随即打开的下拉列表中执行[转置]命令,如图2所示.此时,表格已经