推荐大家关注一个公众号

后台回复“大礼包”有惊喜礼包!

日英文

We all have a past. It’s how you deal with it.

每个人都有过去,只是取决于你怎么去处理。

每日掏心话

伪装了多久,终于将自己的心变成石头,可突然想起你时,疼的感觉依然那么熟悉!

责编:乐乐 | 来自:Tom-shushu 链接:cnblogs.com/Tom-shushu/p/14279357.html

往日回顾:

正文

大家好,我是小乐。

Excel、PDF的导出、导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策。

公司有这么两个需求:

需求一、给了一个表单,让把查出来的数据组装到表单中并且提供以PDF格式的下载功能。

需求二、将数据查出来以Excel表格的形式下载下来。

二、Java实现PDF的生成和数据动态插入、导出功能

1、第一步:PDF制作模板

因为PDF常用的软件不让支持编辑,我们就先使用WPS以Word的形式进行编辑制作出与客户需求一样的样式,然后直接另存为 .pdf 的形式如下图所示:

a.Word里面制作模板

打开网易新闻 查看更多图片

b.更改名字为 .pdf形式

c.这时需要用到一个叫:Adobe Acrobat DC的软件,具体操作如下:

用Adobe Acrobat DC打开我们刚才改过名字的PDF文件,点击右下角的“更多工具”按钮

打开网易新闻 查看更多图片

到下面这个页面再点击“准备表单”按钮

d.接下来就需要详细的配置你的数据源了

数据源即:你代码中实体类中对应的数据(注意字段一定要一一对应),配置完毕就可以保存进行下面的代码编写工作了。

2

代码的编写

假定我们实体类什么的都已经编写完成、数据通过前端传入获取、模板位置在E盘根目录下名字为:车辆维修审批单.pdf

导入jar包:


com.itextpdfgroupId>
itextpdfartifactId>
5.5.13version>
dependency>

实现生成PDF、数据插入、导出

@RegisterToSMP(serviceDisplay = "预览页面PDF下载")
@RequestMapping(value = "/DM/gwclwxsq/qygl/exportPDF$m=query.service",method =RequestMethod.POST)
publicStringexportPdf(@RequestBody GwclwxsqBean gwclwxsqBean , HttpServletResponse response)throwsUnsupportedEncodingException {
// 1.指定解析器
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
String filename="车辆维修审批单.pdf";
String path="e:/";
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;fileName="
+ URLEncoder.encode(filename, "UTF-8"));
OutputStream os =null;
PdfStamper ps =null;
PdfReader reader =null;
try{
os = response.getOutputStream();
// 2 读入pdf表单
reader =newPdfReader(path+ "/"+filename);
// 3 根据表单生成一个新的pdf
ps =newPdfStamper(reader, os);
// 4 获取pdf表单
AcroFields form = ps.getAcroFields();
// 5给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
form.addSubstitutionFont(bf);
// 6查询数据================================================
Map data =newHashMap ();
data.put( "commitTime", gwclwxsqBean.getCommitTime());
data.put( "driver", gwclwxsqBean.getDriver());
data.put( "carId", gwclwxsqBean.getCarId());
data.put( "carType", gwclwxsqBean.getCarType());
data.put( "repairAddress", gwclwxsqBean.getRepairAddress());
data.put( "repairCost",gwclwxsqBean.getRepairCost());
data.put( "project", gwclwxsqBean.getProject());
data.put( "fwbzzxfzrYj", gwclwxsqBean.getFwbzzxfzrYj());
data.put( "fgldspYj", gwclwxsqBean.getFgldspYj());
data.put( "remarks", gwclwxsqBean.getRemarks());
// 7遍历data 给pdf表单表格赋值
for(String key : data.keySet()) {
form.setField(key,data.get(key).toString());
}
ps.setFormFlattening(true);
log.info( "*******************PDF导出成功***********************");
}catch(Exception e) { log.error( "*******************PDF导出失败***********************");
e.printStackTrace();
}finally{
try{
ps.close();
reader.close();
os.close();
}catch(Exception e) {
e.printStackTrace();
}
}
returnnull;
}

3

测试

打开网易新闻 查看更多图片


二、Java实现Excel生成和数据插入、导出

这个比较简单,直接上代码(假定你的实体类、查询什么的都已经写好)注意:实体类一个是你自己的数据实体类还有一个是你导出时表格中对应的实体类。100道Java中高级面试题汇总

我们以一个真实的公司业务来举个例子(一个统计疫情登记人员信息的Excel导出功能)

a.表头对应实体类ExportYqfkdj.java

importlombok.Data;

/**
* description:
*@author: zhouhong
*@version: V1.0.0
*@date: 2021年1月14日 下午3:05:54
*/
@Data
publicclassExportYqfkdj{
/**
* 序号
*/
privateInteger xuhao;
/**
* 姓名
*/
privateString xingming;
/**
* 证件号码
*/
privateString zjhm;
/**
* 联系电话
*/
privateString lxdh;
/**
* 申请人工作单位
*/
privateString sqrGzdw;
/**
* 是否接触过疑似病例
*/
privateString sfjcgysbl;
/**
* 当前是否与居家隔离人员同住
*/
privateString sfyjjglrytz;
/**
* 当前状态
*/
privateString dqzt;
/**
* 当前健康状态
*/
privateString dqjkzt;

/**
* 当前体温
*/
privateString dqtw;
/**
* 当前所在地址
*/
privateString dqszdz;
/**
* 当前居住地址
*/
privateString dqjzdz;
/**
* 提交时间
* */
privateString tjsj;
}

b.Service层

/**
* 导出
*@paramyqfkdjBean
*@authorzhouhong
*@return
*@throwsException
*/
@Transactional(rollbackFor = { Exception.class})
publicDataResultexporYqfkdj(YqfkdjBeanyqfkdjBean)throwsException{
DataResult result =newDataResult();
List list =newArrayList ();
try{
/* 查询导出信息 */
result = getYqfkMhCXQuery(yqfkdjBean);
SimpleDateFormat df =newSimpleDateFormat( "yyyyMMddhhmmssSSS");
for(inti = 0; i < result.getTotalcount(); i++) {
ExportYqfkdj dmKhfwdcDtjlZxDto =newExportYqfkdj();
dmKhfwdcDtjlZxDto = ObjectUtil.parsePojo(result.getResults().get(i), ExportYqfkdj .class);
dmKhfwdcDtjlZxDto.setXuhao(i + 1);
list.add(dmKhfwdcDtjlZxDto);
}
String filepath = "D:/疫情防控信息" + df.format(newDate()) + ".xlsx";
if(System.getProperty(YqfkdjUtils.Wjdz.NAME).toLowerCase().startsWith(YqfkdjUtils.Wjdz.LI)
|| System.getProperty(YqfkdjUtils.Wjdz.NAME).toLowerCase().startsWith(YqfkdjUtils.Wjdz.LIN)) {
filepath = "/home/Tomcat/temp/" + df.format(newDate()) + ".xlsx";
}
EasyExcel.write(filepath, ExportYqfkdj .class).head(head()).sheet().doWrite(list);
result.setResults(list);
result.setSuccess(true);
result.setMsg(filepath);
}catch(Exception e) {
result.setSuccess(false);
result.setMsg(YqfkdjUtils.Cytx.DCSB);
e.printStackTrace();
throwe;
}
returnresult;
}
/**
* 疫情防控信息导出表头
*@authorzhouhong
*@returnList
*/
privateList head() {
List list =newArrayList();
List head0 =newArrayList ();
head0.add( "序号");
List head1 =newArrayList ();
head1.add( "姓名");
List head2 =newArrayList ();
head2.add( "证件号码");
List head3 =newArrayList ();
head3.add( "联系电话");
List head4 =newArrayList ();
head4.add( "工作所在单位");
List head5 =newArrayList ();
head5.add( "是否接触疑似病例");
List head6 =newArrayList ();
head6.add( "是否与隔离人员同住");
List head7 =newArrayList ();
head7.add( "当前状态");
List head8 =newArrayList ();
head8.add( "当前健康状态");
List head9 =newArrayList ();
head9.add( "体温(°C)");
List head10 =newArrayList ();
head10.add( "当前所在地址");
List head11 =newArrayList ();
head11.add( "当前居住地址");
List head12 =newArrayList ();
head12.add( "提交时间");
list.add(head0);
list.add(head1);
list.add(head2);
list.add(head3);
list.add(head4);
list.add(head5);
list.add(head6);
list.add(head7);
list.add(head8);
list.add(head9);
list.add(head10);
list.add(head11);
list.add(head12);
returnlist;
}


c.Controller层

@RegisterToSMP(serviceDisplay = "疫情防控查询导出")
@RequestMapping(value = "/DM/yqfkdj/gr/yqfkdjdc$m=export.service", method = RequestMethod.POST)
publicvoidexportKhfxxx(@RequestBody YqfkdjBean yqfkdjBean, HttpServletResponse resp)throwsException {
DataResult result =newDataResult();
try{
SimpleDateFormat df =newSimpleDateFormat("yyyyMMddhhmmssSSS");
result = yqfkdjService.exporYqfkdj(yqfkdjBean);
String filepath = result.getMsg().replace("\"", "");
File file =newFile(filepath);
String filename = "疫情防控信息" + df.format(newDate()) + ".xlsx";
InputStream fis =newBufferedInputStream(newFileInputStream(filepath));
byte[] buffer =newbyte[fis.available()];
fis.read(buffer);
fis.close();
resp.reset();
resp.setHeader("Content-Disposition",
"attachment;filename=" +newString(filename.replaceAll(" ", "").getBytes("gbk")));
resp.setHeader("Content-Length", "" + file.length());
OutputStream os =newBufferedOutputStream(resp.getOutputStream());
resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 输出文件
os.write(buffer);
os.flush();
os.close();
}catch(Exception e) {
e.printStackTrace();
log.info(YqfkdjUtils.Cytx.DCSB);
throwe;
}
}


d.测试

已经全部完成PDF和Excel的生成、插入、导出功能。

你还有什么想要补充的吗?

PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师,在后台回复“”即可。

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。

别找了,想获取史上最简单的Java大厂面试题学习资料

扫下方二维码回复「面试」就好了

嘿,你在看吗?