生成带有表格的word附件和动态赋值,

表格前后需要添加一个特殊的开始和结束的域,表格第一列 TableStart:AuditJdcttbzInfo 和表格的最后一列 TableEnd:AuditJdcttbzInfo,然后再添加这个第一列和最后一列的需要展示的值得域;

点击打印(生成)附件按钮,执行得后台代码:

     List<Integer> selectedlist = tableModel.getSelectedIndexes();
        String jdcttbzRowguidStr = "";
        if (selectedlist != null && selectedlist.size() > 0) {
            int i = 1;
            for (Integer index : selectedlist) {
                Object[] arrobj = tableModel.getRowData().get(index);
                jdcttbzRowguidStr += arrobj[0];
                if(i<selectedlist.size()){
                    jdcttbzRowguidStr += ",";
                }
                i++;
            }
        }
        System.out.println("=======重定向地址==="+JsfHelper.getRequestCompleteUrl()+"/xxx/windowbusiness/businessmanage/PrintJdcttbzShbAndHzb.html?strs="+jdcttbzRowguidStr);
        sendRedirect(JsfHelper.getRequestCompleteUrl()+"/xxx/windowbusiness/businessmanage/PrintJdcttbzShbAndHzb.html?strs="+jdcttbzRowguidStr);

其中tableModel是展示在页面的一个table样式得表格数据简单封装,作用是可以获取到所选的多行数据,讲这些选择的多行数据的每一行的唯一标识,拼接成一个用一个特殊符号隔开的字符串,需要放在重定向的地址后面传参给方法;

重定向后的生成打印附件的页面的后台方法:

 @SuppressWarnings("deprecation")
    public void getWordContent() {
             // CommonUtil为封装的类,封装的一些常用的方法,封装的获取页面地址url的参数     String jdcttbzRowguidStr = CommonUtil.getRequestParameter("strs");
        String[] jdcttbzRowguidStrs = jdcttbzRowguidStr.split(",");
        String licenseName = CommonUtil.getDeployWarPath() + "WEB-INF/classes/license.xml";
        License license = new License();
        // 1 先获取要替换域和值的map集合
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            license.setLicense(licenseName);
            Document doc = new Document();
             // 封装的方法,获取服务器上工程下某个路径的文件                   String filepathname = CommonUtil.getDeployWarPath() + "xxx/printdocfolder/jdcttbzHsbAndHzb.docx";
            doc = new Document(filepathname);

            // 赋值其中的除表格意外值的域
            Map<Object, Object> map = new HashMap<Object, Object>();
            // 获取会审表汇总表编号,此类型文件数量加1
            int jdcttbzHsbAndHzbNum = 0;
            String jdcttbzHsbAndHzbNumStr = "";
                // 一些数据库交互操作,获取到需要的数据                    String getNumSql ="SELECT COUNT(1) FROM xxxx WHERE CliengTag='哈雷机动车汇总表' ";
        // service为封装的一些dao层方法,执行数据库语句的方法                    jdcttbzHsbAndHzbNum = service.executeSql(getNumSql);
            jdcttbzHsbAndHzbNum += 1;
            @SuppressWarnings("static-access")
            int nowyear = new EpointDateUtil().getYearOfDate(new Date());
            jdcttbzHsbAndHzbNumStr = String.valueOf(nowyear)+"00"+String.valueOf(jdcttbzHsbAndHzbNum);
            // 各个域赋值
            map.put("jdcbzNum", jdcttbzHsbAndHzbNumStr);
            map.put("jdchzbNumSame", jdcttbzHsbAndHzbNumStr);
            map.put("displayname", userSession.getDisplayName());
            map.put("newdate", sdf.format(new Date()));
            String tableid = String.valueOf("");
            List<Object[]> objlist = getWordFieldAndValue(tableid, "", map);
            String[] fieldNames = (String[]) objlist.get(0);// word域
            Object[] values = objlist.get(1);// 域对应的值
            // 2 替换域和表格并且生成word入库
            doc.getMailMerge().execute(fieldNames, values);// 替换基本信息表word中的域

            // 赋值其中的表格多行值的域
            List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
                  // 遍历选择的每一行数据                      for(String str : jdcttbzRowguidStrs){
                Map<String, Object> data1 = new HashMap<String, Object>();
                String sql = " SELECT j.rowguid rowguid, p.FLOWSN FLOWSN, j.plateNumber, j.carFrameNumber, j.firstRegisterDate, j.useNature, j.ownerName, j.linkPhone, j.certNum, j.openAccBankName, j.openAccBankNum "
                        + "FROM audit_jdcttbz j LEFT JOIN AUDIT_PROJECT p on j.projectguid=p.RowGuid WHERE j.rowguid='"+str+"';";
                    // 用Object[]数组接收多个返回的不同实体类的值                         Object[] arrobj = service.executeSql(sql);
                data1.put("flownum", arrobj[1] == null ? "" : arrobj[1].toString());
                data1.put("plateNumber", arrobj[2] == null ? "" : arrobj[2].toString());
                data1.put("carFrameNumber", arrobj[3] == null ? "" : arrobj[3].toString());
          // 避免返回null值前端有异常的情况                          data1.put("firstRegisterDate", arrobj[4] == null ? "" : sdf.format(arrobj[4]).toString());
                String useNature = arrobj[5] == null ? "" : arrobj[5].toString();
                if ("1".equals(useNature)) {
                    useNature = "营运";
                }
                else {
                    useNature = "非营运";
                }
                data1.put("useNature", useNature);
                data1.put("ownerName", arrobj[6] == null ? "" : arrobj[6].toString());
                data1.put("linkPhone", arrobj[7] == null ? "" : arrobj[7].toString());
                data1.put("certNum", arrobj[8] == null ? "" : arrobj[8].toString());
                data1.put("openAccBankName", arrobj[9] == null ? "" : arrobj[9].toString());
                data1.put("openAccBankNum", arrobj[10] == null ? "" : arrobj[10].toString());
                dataList.add(data1);

                // 对应信息更新为已打印
                String updateSql = "UPDATE audit_jdcttbz SET printTag='1' WHERE rowguid='"+str+"' ";
                service.executeSqlUpdate(updateSql);
            }
            // 对应表格名的域,一头一尾特殊的域
            doc.getMailMerge().executeWithRegions(new MapMailMergeDataSource(dataList, "AuditJdcttbzInfo"));

            doc.getFirstSection().getPageSetup().setSectionStart(SectionStart.NEW_PAGE);
            // 打印输出流
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            doc.save(outputStream, SaveFormat.DOC);
            byte[] in2b = outputStream.toByteArray();

            // 生成的最终附件输入流入库存储,可以其他地方获取供下载和展示
            ByteArrayInputStream inputStream = new ByteArrayInputStream(in2b);
            saveFileInputStream(in2b.length, inputStream, userSession.getUserGuid(), userSession.getDisplayName(), jdcttbzHsbAndHzbNumStr);

            JsfHelper.sendRespose(in2b, URLEncoder.encode("机动车淘汰补助会审和汇总表.docx"), ".docx");
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

   }
服务器上工程下某个路径的文件:
 
生成的最终附件输入流入库存储,可以其他地方获取供下载和展示方法:
public DocAttachFile saveFileInputStream(long size, InputStream inputStream,
            String userGuid, String displayName, String jdcttbzHsbAndHzbNumStr) {
        String attachGuid = UUID.randomUUID().toString();
        String cliengGuid = UUID.randomUUID().toString();
        // 附件信息
        DocAttachFile docAttachFile = new DocAttachFile();
        docAttachFile.setAttachGuid(attachGuid);
        docAttachFile.setCliengGuid(cliengGuid);
        docAttachFile.setAttachFileName("机动车淘汰补助会审和汇总表-" +jdcttbzHsbAndHzbNumStr+ ".docx");
        docAttachFile.setCliengTag("机动车会审汇总表");
        docAttachFile.setUploadUserGuid(userGuid);
        docAttachFile.setUploadUserDisplayName(displayName);
        docAttachFile.setUploadDateTime(new Date());
        docAttachFile.setContentType(".docx");
        docAttachFile.setAttachStorageGuid(attachGuid);
        docAttachFile.setAttachLength(size);
        return docAttachFileService.addDocAttachFile(docAttachFile);

    }

其中DocAttachFile为附件存储的表对应的实体类,docAttachFileService为其业务逻辑实施层;

生成带有表格的word附件和动态赋值的更多相关文章

  1. 生成word附件和word域动态赋值

    生成word文档和word域动态赋值,很多时候需要生成这样的word文档供下载和打印,先制作一个包含了域的 word的模板附件,放在服务器端或者字节流存入数据库,以供需要的时候代码可以获取到,如: 其 ...

  2. jQuery动态生成Bootstrap表格

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  3. 将Highcharts图表数据生成Table表格

    有的时候,我们不仅仅需要漂亮的统计图来显示统计结果,还需要在统计图下方一个表格可以更加直观的展现各类数据.既然统计图都显示出来了,那我们可以根据统计图的各元素生成表格了. 首先,先显示统计图. Htm ...

  4. MVC 生成PDf表格并插入图片

    最近做的项目中有一个功能,将最终的个人信息生成PDF表格,并插入图片.对于没接触过的程序员来说回一片茫然,网上有多种生成PDf的方法,我给大家介绍一下我认为比较简单,好操作的一种. iTextShar ...

  5. 通过javascript实现1~100内能同时被2和3整除的数并生成如下表格

    请通过javascript实现1~100内能同时被2和3整除的数并生成如下表格: <!DOCTYPE html><html lang="en"><he ...

  6. 用Maven快速生成带有依赖的可执行jar包

    一.背景 最近项目在做微服务的拆分,那么我们想让我们的容器启动更加的轻量级,所以我们选择放弃tomcat等容器,而是通过maven生成带有指定依赖的可执行jar包的方式进行处理,本文我将分享如何通过m ...

  7. python生成html表格

    最近做一个小工具,需要将统计数据生成html表格.在网上搜罗一圈后发现用pandas生成表格非常好用.代码如下: import pandas as pd def convertToHtml(resul ...

  8. 根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案

    原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类: public class StatisticsData    {        public ...

  9. Highcharts动态赋值学习

    最近老大让做项目中的统计图表功能,需要使用highcharts这个插件,弄出来了两种类型的图表动态赋值的实现,首先贴上中文网的官网和api地址,使用这个英语不好的同学肯定会用到的: 中文网官网:htt ...

随机推荐

  1. 【腾讯Bugly干货分享】WebVR如此近-three.js的WebVR示例解析

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ff1689a6c9121b1adb16 作者:苏晏烨 关于WebVR 最 ...

  2. jquery之hasClass

    看jquery的在线手册,hasClass的例子给的是这个 html部分: <div class="protected"></div><div> ...

  3. 嵌入资源的方式让Winform使用系统没有的字体,无需安装字体

    原文: How to embed a True Type font http://bobpowell.net/embedfonts.aspx 测试项目下载: http://files.cnblogs. ...

  4. C++ malloc new 的区别

    1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. malloc实现了在堆内存管理中进行按需分配的机制,但是它不提供在C ...

  5. PL/SQL之--游标

    一.游标简介 在PL/SQL中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),也称为缓冲区.游标是指向该区的一个指 ...

  6. OpenGL中两种计算投影矩阵的函数

    OpenGL无意间同时看到两种创建投影矩阵的写法,可以说它们完成的是同样的功能,但写法完全不同,可以观摩一下什么叫做异曲同工之妙... 第一种: gltMakeShadowMatrix函数是重点 // ...

  7. 基于注解风格的Spring-MVC的拦截器

    基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...

  8. PHP+AJAX 地区三级联动代码

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  9. HTTP客户端识别与Cookie机制

    HTTP识别用户的几种技巧 承载用户身份信息的HTTP首部 客户端IP地址跟踪,通过用户的IP地址对其进行识别 用户登录,用认证方式识别用户 胖URL,一种在URL中潜入识别信息的技术 cookie, ...

  10. layui table动态表头 改变表格头部 重新加载表格

    改变头部原理: 删除原来表格, 重新建立DOM元素, 重新加载table,实现表头改变 明白了原理, 我相信大家都能写出来了, table.reload(ID, options)目前好像还不支持con ...