Java技术:实现pdf和Excel的生成及数据动态插入、导出
1
序言
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包:
<dependency>
????<groupId>com.itextpdfgroupId>
????<artifactId>itextpdfartifactId>
????<version>5.5.13version>
dependency>
實現生成PDF、數據插入、導出
@RegisterToSMP(serviceDisplay?=?"預覽頁面PDF下載")??????
@RequestMapping(value?=?"/DM/gwclwxsq/qygl/exportPDF$m=query.service",method?=RequestMethod.POST)?
public?String?exportPdf(@RequestBody?GwclwxsqBean?gwclwxsqBean?,?HttpServletResponse?response)?throws?UnsupportedEncodingException?{????????????
????//?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?=?new?PdfReader(path+?"/"+filename);
????????//?3?根據表單生成一個新的pdf
????????ps?=?new?PdfStamper(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?=?new?HashMap();
??????????????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();
????????}
????}
????return?null;
}
3
測試
二、Java實現Excel生成和數據插入、導出
這個比較簡單,直接上代碼(假定你的實體類、查詢什么的都已經寫好)注意:實體類一個是你自己的數據實體類還有一個是你導出時表格中對應的實體類。100道Java中高級面試題匯總
我們以一個真實的公司業務來舉個例子(一個統計疫情登記人員信息的Excel導出功能)
a.表頭對應實體類ExportYqfkdj.java
import?lombok.Data;
/**
?*?description:?
?*?@author:?zhouhong
?*?@version:?V1.0.0
?*?@date:?2021年1月14日?下午3:05:54
?*/
@Data
public?class?ExportYqfkdj?{
????/**
?????*?序號
?????*/
????private?Integer?xuhao;
????/**
?????*?姓名
?????*/
????private?String?xingming;??
????/**
?????*?證件號碼
?????*/
????private?String?zjhm;
????/**
?????*?聯系電話
?????*/
????private?String?lxdh;????
????/**
?????*?申請人工作單位
?????*/
????private?String?sqrGzdw;????
????/**
?????*?是否接觸過疑似病例
?????*/
????private?String?sfjcgysbl;
????/**
?????*?當前是否與居家隔離人員同住
?????*/
????private?String?sfyjjglrytz;????
????/**
?????*?當前狀態
?????*/
????private?String?dqzt;
????/**
?????*?當前健康狀態
?????*/
????private?String?dqjkzt;
????/**
?????*?當前體溫
?????*/
????private?String?dqtw;
????/**
?????*?當前所在地址
?????*/
????private?String?dqszdz;
????/**
?????*?當前居住地址
?????*/
????private?String?dqjzdz;
????/**
?????*?提交時間
?????*?*/
????private?String?tjsj;
}
b.Service層
/**
?*?導出
?*?@param?yqfkdjBean
?*?@author?zhouhong
?*?@return?
?*?@throws?Exception
?*/
@Transactional(rollbackFor?=?{?Exception.class?})
public?DataResult?exporYqfkdj(YqfkdjBean?yqfkdjBean)?throws?Exception?{
????DataResult?result?=?new?DataResult();
????List?list?=?new?ArrayList();
????try?{
????????/*?查詢導出信息?*/
????????result?=?getYqfkMhCXQuery(yqfkdjBean);
????????SimpleDateFormat?df?=?new?SimpleDateFormat("yyyyMMddhhmmssSSS");
????????for?(int?i?=?0;?i?<?result.getTotalcount();?i++)?{
????????????ExportYqfkdj?dmKhfwdcDtjlZxDto?=?new?ExportYqfkdj();
????????????dmKhfwdcDtjlZxDto?=?ObjectUtil.parsePojo(result.getResults().get(i),?ExportYqfkdj.class);
????????????dmKhfwdcDtjlZxDto.setXuhao(i?+?1);
????????????list.add(dmKhfwdcDtjlZxDto);
????????}
????????String?filepath?=?"D:/疫情防控信息"?+?df.format(new?Date())?+?".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(new?Date())?+?".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();
????????throw?e;
????}
????return?result;
}
/**
?*?疫情防控信息導出表頭
?*?@author?zhouhong
?*?@return?List<list>
?*/</list
private?List<list>?head()?{
????List<list>?list?=?new?ArrayList<list>();
????List?head0?=?new?ArrayList();
????head0.add("序號");
????List?head1?=?new?ArrayList();
????head1.add("姓名");
????List?head2?=?new?ArrayList();
????head2.add("證件號碼");
????List?head3?=?new?ArrayList();
????head3.add("聯系電話");
????List?head4?=?new?ArrayList();
????head4.add("工作所在單位");
????List?head5?=?new?ArrayList();
????head5.add("是否接觸疑似病例");
????List?head6?=?new?ArrayList();
????head6.add("是否與隔離人員同住");
????List?head7?=?new?ArrayList();
????head7.add("當前狀態");
????List?head8?=?new?ArrayList();
????head8.add("當前健康狀態");
????List?head9?=?new?ArrayList();
????head9.add("體溫(°C)");
????List?head10?=?new?ArrayList();
????head10.add("當前所在地址");
????List?head11?=?new?ArrayList();
????head11.add("當前居住地址");
????List?head12?=?new?ArrayList();
????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);
????return?list;
}
</list</list</list
c.Controller層
@RegisterToSMP(serviceDisplay?=?"疫情防控查詢導出")
@RequestMapping(value?=?"/DM/yqfkdj/gr/yqfkdjdc$m=export.service",?method?=?RequestMethod.POST)
public?void?exportKhfxxx(@RequestBody?YqfkdjBean?yqfkdjBean,?HttpServletResponse?resp)?throws?Exception?{
????DataResult?result?=?new?DataResult();
????try?{
????????SimpleDateFormat?df?=?new?SimpleDateFormat("yyyyMMddhhmmssSSS");
????????result?=?yqfkdjService.exporYqfkdj(yqfkdjBean);
????????String?filepath?=?result.getMsg().replace("\"",?"");
????????File?file?=?new?File(filepath);
????????String?filename?=?"疫情防控信息"?+?df.format(new?Date())?+?".xlsx";
????????InputStream?fis?=?new?BufferedInputStream(new?FileInputStream(filepath));
????????byte[]?buffer?=?new?byte[fis.available()];
????????fis.read(buffer);
????????fis.close();
????????resp.reset();
????????resp.setHeader("Content-Disposition",
????????????????"attachment;filename="?+?new?String(filename.replaceAll("?",?"").getBytes("gbk")));
????????resp.setHeader("Content-Length",?""?+?file.length());
????????OutputStream?os?=?new?BufferedOutputStream(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);
????????throw?e;
????}
}
d.測試
已經全部完成PDF和Excel的生成、插入、導出功能。
收外國男騙中國妹子的炮?天朝竟有這樣一幫「女權組織」 2018-03-19 INSIGHT視界 From 酷玩實驗室 微信號:coollabs 其實我讀書的時候 也曾經想過做一個女權主義者 但是后來發生了一些事情 讓我選擇了放棄 簡單來說是這么一個事情:我發現 女權對于一些中國人來說是信仰 但是對另一些中國人來說是生意 所謂的“偽女權”“女權癌” 大概就是這么回事 盡管早就有這樣的思想準備 但讓我沒想到的是 這兩天,知乎上曝光了一件大事 還是讓我三觀震碎 我沒想到,這些“偽女權” 竟然已經形成了黑色產業鏈 讓人細思恐極—— 國內竟然有一群人 打著“女權主義”的名號 從事著組織賣淫的事情 在中國女生不知情的情況下 把她們賣給外國男人!事情是這樣的:根據知乎用戶伊利丹·怒風的爆料 他在知乎和一個偽女權主義者 吵了起來 一開始,他可能以為這只是一個 腦子比較軸的偽女權主義者 所以兩人就吵了一通 本來,他以為就是撕個逼而已 沒想到的是 這個偽女權主義者 可不是什么好惹的主 這個自稱為“瑪麗女王”的人 竟然在半個月中 持續不斷地騷擾他 而最夸張的是 瑪麗女王聲稱 自己有能力 讓伊利丹的QQ號 在5天之內被封掉 到這里為止 伊利丹一直以為 他不過是碰到了一個杠精 但是萬萬沒想到 5天之后 他的QQ號竟然真的被永久封禁了!說真的,這就有點嚇人了 這個不起眼的瑪麗女王 竟然還能操控別人的QQ賬號被封?難不成,她真的背后有人?伊利丹這才意識到 自己好像惹到了一個組織 他去扒了扒這個瑪麗女王的QQ空間 這才發現 自己簡直捅出一個馬蜂窩:這個人平時干的 竟然是把中國女生 賣給外國男人的皮肉生意!真的,我本來以為 我是一個見過不少套路的人 但沒想到 這一套操作 真的是驚為天人 簡單來說是這樣的 首先,瑪麗女王自稱是“女權主義者” 但是實際上她的言論 宣傳的卻是 中國男人配不上中國女人 她甚至惡意辱罵中國男人 恨不得中國男人全部死光 連自己的爸爸都不放過 但是,這么做對她有什么好處呢?很簡單 罵完中國男人以后 接下來她就說—— 既然中國男人這么差勁 那就找外國男人吧!于是,她就經常發布外國男人的介紹 看起來是一個熱心的媒婆 還在各種QQ和微信群里 散播此類信息 但是看到這里 我們不難發現有點問題 看看其中這些不堪入目的措辭 這并不是普通的介紹男友啊!這簡直是在拉皮條啊!果然,伊利丹發現 瑪麗女王真的在 拉皮條的過程中 收外國男人的錢!下面是聊天記錄實錘:而且,請注意—— 在這個過程中 她會收外國男人的錢 但是錢不給中國女生 卻落到了她自己的腰包 于是一個詭異的情況出現了:中國妹子 并不知道收錢這回事 還以為是正常交友 而外國男人 卻都交了錢 很可能認為自己是在買春!額,也就是說 在中國女孩不知情的情況下 她們被“賣”給了外國男人 而好處費 卻全都進了瑪麗女王的腰包... 我真的是沒見過這種操作 這說輕了是騙炮 說重了,已經可以算是賣淫了吧?我想請熟悉刑法的朋友們看看 這個瑪麗女王 至少應該算是個 介紹組織賣淫罪吧?而且,從伊利丹曝光的資料看來 這個組織規模不小 瑪麗女王甚至把外國男生的信息 建了一個完整的表格 有詳細的個人資料、照片 可以說 是一條非常完整的產業鏈 那如果按照這樣操作 外國男人都是來嫖的 中國女生卻不知道 還以為是要跟他們談戀愛 那雙方難道不會穿幫嗎?恩,在這方面 瑪麗女王早有對策 根據知乎一位 從事過這個產業的匿名用戶提供的信息 針對這種情況 瑪麗女王們 還會手把手地教外國男人 怎么快速擺脫女生的糾纏 怎么調教中國女生 怎么讓女生覺得自己很可愛 可以說 各種套路一應俱全 甚至還可以開發票!看到這里 她們背后的產業就非常清楚了 這個瑪麗女王 她根本就不是什么女權主義者 而是打著女權主義的口號 販賣中國女生的人販子 一方面 她們通過辱罵中國男人 吸引對外國男人感興趣的中國女生 另一方面 她們向外國男人收錢 然后把中國女生賣給他們!圖片來源:知乎@渭水徐工 而可憐的中國妹子們 還以為自己是在 追求男女平權 其實,不過是淪為了 這些老鴇的賺錢工具 伊利丹把這整個事情 寫出來以后 在知乎、微博引起了巨大的關注 關于其中提到的 伊利丹的QQ被永久封禁的問題 騰訊經過核查 目前也有了結果:經調查,是瑪麗女王利用偽造證據 惡意舉報了伊利丹的QQ號 目前,騰訊已經將伊利丹的QQ解封 同時封禁了瑪麗女王等人的 兩個QQ賬號 警方也就此事立案偵查了 相信很快就會有結果 這個事情算是告一段落了 但是在我看來 卻有一件事讓我無法釋懷:為什么“女權主義”竟然會和 辱罵中國男性等同起來?為什么“和外國男人交友” 竟然還能演變成 一個免費的陪睡組織?我想,這個瑪麗女王 也許只是一個 發現了惡性賺錢模式的生意人 但是在這背后隱藏的 其實是一個很深的問題:為什么有不少中國女人 越來越看不上中國男人 甚至覺得嫁給外國男人 是一種時尚?這里面的原因可能非常復雜 我這里先提供一個思路 供大家討論:我發現 現在中國很多大型的女權組織 背后都有著西方勢力的影子 她們打著女權的名號 為自己謀取暴利 為西方國家從事破壞活動 而那些真正為女性平權而奔走的人 卻得不到應有的幫助 我之所以這樣說 并不是信口開河 而是有充足的證據 有一個非常有名的民間女權組織 叫做“女權之聲” 它一再聲稱 自己只是一個自發的民間組織 致力于促進男女平等的 它所有的微博賬號、微信賬號 全部都是由一個 叫做婦女傳媒監測網絡的創辦的 而這個婦女傳媒監測網絡 有這么多媒體產品 那它的錢都是哪里來的呢?從她們介紹的合作組織里 我們可以清楚地找到 她們的資助者—— 竟然有西方的福特基金會 有人也許會問 收了西方的錢怎么了?中國的組織不能收西方的錢嗎?然而,她們不只是收了西方的錢而已 女權之聲組織里 有一個人叫做鄭楚然 她除了女權運動之外 沒有任何其他工作 表面上,是一個全職的女權工作者 在2015年的時候 她還因為尋釁滋事 被警察拘留過30多天 甚至在她被拘留的時候 希拉里還借題發揮 指責中國侵犯人權、壓制民主 一個中國的小小民間組織的首領 在互聯網上的粉絲還沒有我多 竟然能得到希拉里這個級別的關注?我真的是驚掉了下巴 這樣看來 我離希拉里也不是很遠了??而不止是希拉里 這樣一個明明思想上毫無建樹的人 卻被西方媒體BBC評為了 全球百大思想家 圖:鄭楚然在王寶強事件中發表的言論 除此以外 更讓人匪夷所思的 是她們平時就喜歡攻擊政府 甚至于,她們還會試圖分裂我們國家 比如,女權之聲這個組織里 著名的女權斗士洪理達 就曾經轉發著名的港獨媒體 Hong Kong Free Press的言論 甚至曾公開發表過 支持藏獨、港獨、臺獨的言論 她也經常和鄭楚然混在一起 我很想不通 如果她們真的只是單純的女權主義者 為何要發表分裂國家的言論?為何要支持藏獨、港獨、臺獨?我只能說,這大概就叫 拿人家的手短,吃人家的嘴軟吧 以前,我在接觸中國的女權組織時 我就覺得很奇怪 她們都喜歡聲稱 自己是不盈利的非政府組織 但是她們無論是宣傳 還是組織各類活動 都需要大量的錢 如果她們真的不盈利 那這些錢都是哪里來的呢?而這些外國的金主 他們也更加不可能是什么慈善組織 大發善心來給中國人投錢 每一分投出去的錢 一定都是要有回報的 那么,他們的回報是什么呢?他們給中國的“女權組織”投錢 能得到什么利益呢?聯想到中國網絡上 如火如荼的對中國男人的討伐 我只能說,細思恐極 我絕不是危言聳聽 因為我們就看不遠的鄰國日本 近些年來日本對于西方的崇拜 可謂深入骨髓 已經到了崇洋媚外的程度 而這其中 當然也包括對白人男性的崇拜 甚至在2016年一個瑞士白人 發了一個視頻,赤裸裸的說 “在東京,只要你是白人, 做什么都可以” 視頻里面他在日本便利店 隨意的親吻不認識的收銀員女孩 在酒吧把不認識的日本女孩 按向自己的褲襠 而日本女孩回應的卻是諂媚的笑容 我想,并不會有那么多中國人 真正被西方偽女權主義控制 但是,我們要警惕的是 別在你自己都沒有察覺的時候 被別有用心的人洗了腦 更有甚者 別在你自己都不知道的情況下 被別人賣給了外國男人 還去幫他數錢 本文系授權發布,From 酷玩實驗室,微信號:coollabs,歡迎分享到朋友圈,未經許可不得轉載,INSIGHT視界 誠意推薦 Forwarded from Official Account 酷玩實驗室 酷玩實驗室 Learn More Scan QR Code via WeChat to follow Official Account 采集文章采集樣式近似文章查看封面
IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的Java技术:实现pdf和Excel的生成及数据动态插入、导出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 对象 数量,php – Symf
- 下一篇: Java后端:10w行级别数据的Exce