• pdf导出工具类


    (目前只更新导出pdf表格)

    导出pdf表格

    1、依赖:

    <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>itextpdf</artifactId>
    	<version>5.5.13</version>
    </dependency>
    <dependency>
    	<groupId>com.itextpdf</groupId>
    	<artifactId>itext-asian</artifactId>
    	<version>5.2.0</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2、工具类:

    
    import com.crunii.micro.common.exception.BusinessException;
    import com.itextpdf.text.*;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfPCell;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfWriter;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.lang.reflect.Field;
    import java.net.URLEncoder;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Filename: PdfUtils
     * @Author: sheng.wanping
     * 
  • Date: 2022/8/1 15:40
  • *
  • Version: 1.0
  • *
  • Content: create
  • */
    public class PdfUtils { // 定义全局的字体静态变量 private static Font titlefont; private static Font textfont; static { try { BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); titlefont = new Font(bfChinese, 8, Font.BOLD); textfont = new Font(bfChinese, 8, Font.NORMAL); } catch (Exception e) { e.printStackTrace(); } } /** * 用于返回 简单列表ftp表格 * @param response * @param tableName 表名 * @param list 数据列表 * @param map 中英文map(key为标题,value为字段英文名;注意:map是有顺序的,可用LinkedHashMap) * @param */ public static <T> void pdfSingleTable(HttpServletResponse response, String tableName, List<T> list, Map<String, String> map) { // 1、从map中获取字段中文名和英文名 List<String> valueList = new ArrayList<>(); // 存表格所有数据 List<String> fieldEnList = new ArrayList<>(); // 字段英文名 for (Map.Entry<String, String> entry : map.entrySet()) { valueList.add(entry.getKey()); fieldEnList.add(entry.getValue()); } // 2、用反射根据字段名获取值 for (int i = 0; i < list.size(); i++) { for (int j = 0; j < fieldEnList.size(); j++) { Field field = null; String strValue = ""; try { field = list.get(i).getClass().getDeclaredField(fieldEnList.get(j)); field.setAccessible(true); Object value = field.get(list.get(i)); if (value != null) { if (value instanceof Date) { strValue = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value); } else { strValue = String.valueOf(value); } } else { strValue = ""; } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } finally { valueList.add(strValue);// 字段值 } } } // 3、返回pdf try { // 3-1.新建document对象 Document document = new Document(PageSize.A4); // 3-2.建立一个书写器 response.setHeader("Content-Type", "application/pdf"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(tableName + ".pdf", "UTF-8")); ServletOutputStream out = response.getOutputStream(); PdfWriter.getInstance(document, out); // 3-3.打开文档 document.open(); // 3-4、查询数据库数据,并存入list中 // 3-5、设置单元格宽度 List<Integer> mergeCellList = new ArrayList<>(); int idx = 0; while (idx < (list.size() + 1) * fieldEnList.size()) { idx++; mergeCellList.add(1); } // 3-6.创建表格 PdfPTable table = new PdfPTable(fieldEnList.size()); for (int i = 0; i < mergeCellList.size(); i++) { PdfPCell cell = new PdfPCell(); // 创建行 cell.setColspan(mergeCellList.get(i)); // 合并单元格 // 如果有合并行可以这样写 cell.setRowspan(2) cell.setPhrase(new Phrase(valueList.get(i), textfont)); cell.setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); //垂直居中 table.addCell(cell); // 添加单元格内容 } // 3-7、向文档中添加内容 document.add(table); // 3-8、关闭文档 document.close(); out.close(); }catch (Exception e){ e.printStackTrace(); throw new BusinessException("导出pdf失败"); } } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124

    3、测试代码

    	private static final Map<String, String> BUDGE_MAP = new LinkedHashMap<>();
    	static {
    	   BUDGE_MAP.put("主设备", "mainEquipmentExpense");
    	   BUDGE_MAP.put("天线", "aerialExpense");
    	   BUDGE_MAP.put("电源", "powerExpense");
    	}
    	
    	public void testPdf(HttpServletResponse response) {
            List<Object> list = testDao.getData;// 查询数据列表
            PdfUtils.pdfSingleTable(response, "表名", list, BUDGE_MAP);// 导出pdf表格
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    POI及EasyExcel【Java提高】
    Leetcode 2290. 到达角落需要移除障碍物的最小数目
    读取W25Q64的设备ID时输出0xff
    第55篇 QML组件 之 StackView 界面管理
    Vue中的网络请求模块 — axios
    性能优化之节流
    2022年金砖国家职业技能大赛(决赛)网络空间安全赛项 | 浙江赛区选拔赛 任务书
    这8款浏览器兼容性测试工具,用了以后测试效率可以“起飞”~~
    蓝桥杯算法训练-数组移动
    常见高频题
  • 原文地址:https://blog.csdn.net/weixin_44183847/article/details/126104124