JAVA實現(xiàn)PDF和EXCEL生成和數(shù)據(jù)動態(tài)插入以及導(dǎo)出

導(dǎo)入jar包:

復(fù)制代碼

<!-- PDF導(dǎo)出-->

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->

<dependency>

? ? <groupId>com.itextpdf</groupId>

? ? <artifactId>itextpdf</artifactId>

? ? <version>5.5.13</version>

</dependency>

復(fù)制代碼

實現(xiàn)生成PDF座每、數(shù)據(jù)插入葵诈、導(dǎo)出

復(fù)制代碼

? ? ? ? @RegisterToSMP(serviceDisplay = "預(yù)覽頁面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 根據(jù)表單生成一個新的pdf

? ? ? ? ? ? ? ? ps = new PdfStamper(reader, os);

? ? ? ? ? ? ? ? // 4 獲取pdf表單

? ? ? ? ? ? ? ? AcroFields form = ps.getAcroFields();

? ? ? ? ? ? ? ? // 5給表單添加中文字體 這里采用系統(tǒng)字體。不設(shè)置的話齐板,中文可能無法顯示

? ? ? ? ? ? ? ? BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

? ? ? ? ? ? ? ? form.addSubstitutionFont(bf);

? ? ? ? ? ? ? ? // 6查詢數(shù)據(jù)================================================

? ? ? ? ? ? ? ? Map<String, String> data = new HashMap<String, String>();

? ? ? ? ? ? ? ? ? ? ? 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導(dǎo)出成功***********************");

? ? ? ? ? ? } catch (Exception e) {

          log.error("*******************PDF導(dǎo)出失敗***********************");

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? } finally {

? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? ps.close();

? ? ? ? ? ? ? ? ? ? reader.close();

? ? ? ? ? ? ? ? ? ? os.close();

? ? ? ? ? ? ? ? } catch (Exception e) {

? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? return null;

? ? ? ? }

復(fù)制代碼

3.測試

二辩稽、Java實現(xiàn)Excel生成和數(shù)據(jù)插入惧笛、導(dǎo)出

這個比較簡單,直接上代碼(假定你的實體類逞泄、查詢什么的都已經(jīng)寫好)注意:實體類一個是你自己的數(shù)據(jù)實體類還有一個是你導(dǎo)出時表格中對應(yīng)的實體類

我們以一個真實的公司業(yè)務(wù)來舉個例子(一個統(tǒng)計疫情登記人員信息的Excel導(dǎo)出功能)

1.表頭對應(yīng)實體類ExportYqfkdj.java:

復(fù)制代碼

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;

? ? /**

? ? * 聯(lián)系電話

? ? */

? ? private String lxdh;? ?

? ? /**

? ? * 申請人工作單位

? ? */

? ? private String sqrGzdw;? ?

? ? /**

? ? * 是否接觸過疑似病例

? ? */

? ? private String sfjcgysbl;

? ? /**

? ? * 當前是否與居家隔離人員同住

? ? */

? ? private String sfyjjglrytz;? ?

? ? /**

? ? * 當前狀態(tài)

? ? */

? ? private String dqzt;

? ? /**

? ? * 當前健康狀態(tài)

? ? */

? ? private String dqjkzt;

? ? /**

? ? * 當前體溫

? ? */

? ? private String dqtw;

? ? /**

? ? * 當前所在地址

? ? */

? ? private String dqszdz;

? ? /**

? ? * 當前居住地址

? ? */

? ? private String dqjzdz;

? ? /**

? ? * 提交時間

? ? * */

? ? private String tjsj;

}

復(fù)制代碼

b.Service層

復(fù)制代碼

? ? /**

? ? * 導(dǎo)出

? ? * @param yqfkdjBean

? ? * @author zhouhong

? ? * @return

? ? * @throws Exception

? ? */

? ? @Transactional(rollbackFor = { Exception.class })

? ? public DataResult exporYqfkdj(YqfkdjBean yqfkdjBean) throws Exception {

? ? ? ? DataResult result = new DataResult();

? ? ? ? List<ExportYqfkdj> list = new ArrayList<ExportYqfkdj>();

? ? ? ? try {

? ? ? ? ? ? /* 查詢導(dǎo)出信息 */

? ? ? ? ? ? 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;

? ? }

? ? /**

? ? * 疫情防控信息導(dǎo)出表頭

? ? * @author zhouhong

? ? * @return List<List<String>>

? ? */

? ? private List<List<String>> head() {

? ? ? ? List<List<String>> list = new ArrayList<List<String>>();

? ? ? ? List<String> head0 = new ArrayList<String>();

? ? ? ? head0.add("序號");

? ? ? ? List<String> head1 = new ArrayList<String>();

? ? ? ? head1.add("姓名");

? ? ? ? List<String> head2 = new ArrayList<String>();

? ? ? ? head2.add("證件號碼");

? ? ? ? List<String> head3 = new ArrayList<String>();

? ? ? ? head3.add("聯(lián)系電話");

? ? ? ? List<String> head4 = new ArrayList<String>();

? ? ? ? head4.add("工作所在單位");

? ? ? ? List<String> head5 = new ArrayList<String>();

? ? ? ? head5.add("是否接觸疑似病例");

? ? ? ? List<String> head6 = new ArrayList<String>();

? ? ? ? head6.add("是否與隔離人員同住");

? ? ? ? List<String> head7 = new ArrayList<String>();

? ? ? ? head7.add("當前狀態(tài)");

? ? ? ? List<String> head8 = new ArrayList<String>();

? ? ? ? head8.add("當前健康狀態(tài)");

? ? ? ? List<String> head9 = new ArrayList<String>();

? ? ? ? head9.add("體溫(°C)");

? ? ? ? List<String> head10 = new ArrayList<String>();

? ? ? ? head10.add("當前所在地址");

? ? ? ? List<String> head11 = new ArrayList<String>();

? ? ? ? head11.add("當前居住地址");

? ? ? ? List<String> head12 = new ArrayList<String>();

? ? ? ? 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;

? ? }

復(fù)制代碼

c.Controller層

復(fù)制代碼

? ? @RegisterToSMP(serviceDisplay = "疫情防控查詢導(dǎo)出")

? ? @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;

? ? ? ? }

? ? }

深圳網(wǎng)站建設(shè)www.sz886.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末患整,一起剝皮案震驚了整個濱河市拜效,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌各谚,老刑警劉巖紧憾,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昌渤,居然都是意外死亡赴穗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門膀息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來般眉,“玉大人,你說我怎么就攤上這事潜支〉樵撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵冗酿,是天一觀的道長辑奈。 經(jīng)常有香客問我,道長已烤,這世上最難降的妖魔是什么鸠窗? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮胯究,結(jié)果婚禮上稍计,老公的妹妹穿的比我還像新娘。我一直安慰自己裕循,他們只是感情好臣嚣,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剥哑,像睡著了一般硅则。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上株婴,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天怎虫,我揣著相機與錄音,去河邊找鬼困介。 笑死大审,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的座哩。 我是一名探鬼主播徒扶,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼根穷!你這毒婦竟也來了姜骡?” 一聲冷哼從身側(cè)響起导坟,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圈澈,沒想到半個月后惫周,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡士败,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年闯两,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谅将。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡漾狼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饥臂,到底是詐尸還是另有隱情逊躁,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布隅熙,位于F島的核電站稽煤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏囚戚。R本人自食惡果不足惜酵熙,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驰坊。 院中可真熱鬧匾二,春花似錦、人聲如沸拳芙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舟扎。三九已至分飞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睹限,已是汗流浹背譬猫。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邦泄,地道東北人删窒。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像顺囊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蕉拢,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容