生成带有表格的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. 数据库数据生成Excel表格(多用在导出数据)

    最近在项目开发中遇到这样一个需求,用户聊天模块产品要求记录用户聊天信息,但只保存当天的,每天都要刷新清空数据,但聊天记录要以Excel的形式打印出来,于是就引出了将数据库的数据导出成Excel表格的需 ...

  5. poi自动生成Ecxel表格和Chart图表

    最近因为业务需求,需要做poi自动导出Ecxel表格和Chart折线图的功能. 所以我在网上找到了一篇关于poi生成Chart图表的博客,代码很详细,但是缺少相关注释说明. 想要将它改造成自己需要的样 ...

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

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

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

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

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

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

  9. python生成html表格

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

随机推荐

  1. 自动释放池autoreleasepool

    自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...

  2. dhroid - eventbus 事件总线

    你听过onClick 事件,onItemClick 事件,事件总线不一定听过吧, eventbus 事件总线也是一个编程思想,为什么要设计EventBus了,因为他是领域驱动设计中比不可少的模块,它承 ...

  3. phantomjs试玩

    简单来说,phantomjs就是一个运行在node上的webkit内核,支持DOM渲染,css选择器,Canvas,SVG等,在浏览器上能做的事情,理论上,phantomjs 都能模拟做到. phan ...

  4. 9.21 form 和Ajax详解

    form 表单 参考连接  : http://www.cnblogs.com/liwenzhou/p/8747872.html

  5. cadence upf低功耗流程的仿真验证

    本文是记录项目过程中遇到的奇巧淫技,如有遗漏或者不足,请大家改正和补充,谢谢. 随着深亚微米技术的普及与发展,leakage功耗在整个功耗中的比重越来越大,比如45nm下,已经占到了60%以上,所以低 ...

  6. Mybatis批量insert报错的解决办法【the right syntax to use near '' at line...】

    Java中使用Mybatis批量插入数据时Mapper.xml中的sql如下: <insert id="batchSave"> into t_emp(emp_name, ...

  7. POJ-2081 Terrible Sets(暴力,单调栈)

    Terrible Sets Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4113 Accepted: 2122 Descrip ...

  8. hihocoder 1334 - Word Construction - [hiho一下第170周][状态压缩+DFS]

    题目链接:https://hihocoder.com/problemset/problem/1334 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N wo ...

  9. 数据结构——栈(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...

  10. 2018/03/09 每日一个Linux命令 之 chgrp/chown

    每日一个Linux命令 2018-03-09 Linux 命令 chgrp/chown chgrp [-参数] [文件或者目录] chown [-参数] [文件所有者]:[文件所属群组] [文件或者目 ...