spring boot 导入导出

2023年1月1日07:56:14
    private final static Logger logger = LoggerFactory.getLogger(ExcelUtils.class);
    /**
     * @param list     导出的数据list
     * @param clazz    导出的对象class
     * @param fileName 导出的文件名称
     * @param response reponse
     * @param <T>
     */
    public static <T> void exportExcel(List<T> list, Class<T> clazz, String fileName, HttpServletResponse response) {
        SXSSFWorkbook workBook = getWorkBook(list, clazz);
        try {
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "UTF-8"));
            OutputStream output = response.getOutputStream();
            BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
            bufferedOutPut.flush();
            workBook.write(bufferedOutPut);
            bufferedOutPut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static <T> SXSSFWorkbook getWorkBook(List<T> list, Class<T> clazz) {
        SXSSFWorkbook wb = new SXSSFWorkbook(100);
        Sheet sheet = wb.createSheet();
        Row row = sheet.createRow(0);
        row.setHeightInPoints(23);
        Field[] declaredFields = getAllFields(clazz);
        //添加序号
        Cell cellOrder = row.createCell(0);
        cellOrder.setCellValue("序号");
        cellOrder.setCellStyle(titleStyle(wb));
        sheet.setColumnWidth(0, 10 * 256);
        //设置表头
        for (Field field : declaredFields) {
            Excel annotation = field.getAnnotation(Excel.class);
            if (annotation != null) {
                Cell cell = row.createCell(Integer.valueOf(annotation.orderNum()) );
                cell.setCellValue(annotation.name());
                cell.setCellStyle(titleStyle(wb));
                //设置列的宽度
                sheet.setColumnWidth(Integer.valueOf(annotation.orderNum()),   (int)annotation.width() * 256);
            }
        }
        // 遍历集合数据,产生数据行
        Iterator<?> it = list.iterator();
        int index = 0;
        while (it.hasNext()) {
            index++;
            row = sheet.createRow(index);
            Cell cell = row.createCell(0);
            cell.setCellStyle(orderStyle(wb));
            cell.setCellValue(index);
            row.setHeightInPoints(18);
            T t = (T) it.next();
            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
            Field[] fields = getAllFields(t.getClass());
            for (Field field : fields) {
                Excel annotation = field.getAnnotation(Excel.class);
                if (annotation != null) {
                    cell = row.createCell(Integer.valueOf(annotation.orderNum()) );
                    cell.setCellStyle(contentStyle(wb));
                    String fieldName = field.getName();
                    String getMethodName = "get"
                            + fieldName.substring(0, 1).toUpperCase()
                            + fieldName.substring(1);
                    try {
                        Method getMethod = t.getClass().getMethod(getMethodName,
                                new Class[]{});
                        Object value = getMethod.invoke(t, new Object[]{});
                        cell.setCellValue(null == value ? "" : String.valueOf(value));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return wb;
    }

    //设置标题样式
    private static CellStyle titleStyle(SXSSFWorkbook wb) {
        CellStyle cellStyle = contentStyle(wb);
        //设置居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //设置单元格背景颜色
        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        //设置单元格填充样式(使用纯色背景颜色填充)
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //设置字体加粗
        Font font = wb.createFont();
        font.setBold(true);
        font.setFontHeightInPoints((short) 12);
        //设置字体
        font.setFontName("宋体");
        cellStyle.setFont(font);
        return cellStyle;
    }

    //设置单元格样式
    private static CellStyle contentStyle(SXSSFWorkbook wb) {
        //给单元格设置样式
        CellStyle cellStyle = wb.createCellStyle();
        Font font = wb.createFont();
        //设置字体大小
        font.setFontHeightInPoints((short) 11);
        //设置字体
        font.setFontName("宋体");
        //给字体设置样式
        cellStyle.setFont(font);
        //字体设置边框
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        //设置垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        return cellStyle;
    }

    //设置单元格样式
    private static CellStyle orderStyle(SXSSFWorkbook wb) {
        CellStyle cellStyle = contentStyle(wb);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        return cellStyle;
    }

    private static <T> Field[] getAllFields(Class<T> clazz) {
        Field[] declaredFields = clazz.getDeclaredFields();
        Class superClass = clazz.getSuperclass();
        if (!superClass.equals(Object.class)) {
            Field[] superFields = superClass.getDeclaredFields();
            int sonLength = declaredFields.length;
            int superLength = superFields.length;
            // 合并两个数组
            Field[] newFields = new Field[sonLength + superLength];
            System.arraycopy(declaredFields, 0, newFields, 0, sonLength);
            System.arraycopy(superFields, 0, newFields, sonLength, superLength);
            return newFields;
        }
        return declaredFields;
    }



        private static final String XLS = "xls";
        private static final String XLSX = "xlsx";

        /**
         * 根据文件后缀名类型获取对应的工作簿对象
         * @param inputStream 读取文件的输入流
         * @param fileType 文件后缀名类型(xls或xlsx)
         * @return 包含文件数据的工作簿对象
         * @throws IOException
         */
        public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
            Workbook workbook = null;
            if (fileType.equalsIgnoreCase(XLS)) {
                workbook = new HSSFWorkbook(inputStream);
            } else if (fileType.equalsIgnoreCase(XLSX)) {
                workbook = new XSSFWorkbook(inputStream);
            }
            return workbook;
        }

//导入

 public void add(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        File file1 = new File(fileName);
        ImportParams params = new ImportParams();
        params.setTitleRows(1);
        params.setHeadRows(2);

        List<Bill> bills = ExcelImportUtil.importExcel(file1, Bill.class, params);
        for (Bill bill : bills) {
            billlMapper.insert(bill);

        }
}
//导出
  @RequestMapping("/exportExcelDc")
    public void exportExcelDc(HttpServletResponse response) throws Exception {

        List<Bill> list = billService.list();
        ExcelUtils.exportExcel(list, Bill.class, "数据", response);
    }

//另一种导出

    @RequestMapping("/exportExcelDc1")
    public void exportExcelDc1(HttpServletResponse response) throws Exception {
        ExportParams params = new ExportParams();
        params.setTitle("年度账单");
        params.setSheetName("年度账单表");
        params.setType(ExcelType.XSSF);
        List<Bill> list = billService.list();

        Workbook workbook = ExcelExportUtil.exportExcel(params, Bill.class, list);
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("测试" + ".xls", "UTF-8"));
        OutputStream output = response.getOutputStream();
        BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
        bufferedOutPut.flush();
        workbook.write(bufferedOutPut);
        bufferedOutPut.close();
    }
// 注解
  @Excel(name = "序号",orderNum = "0")

  • 作者:weixin_45016221
  • 原文链接:https://blog.csdn.net/weixin_45016221/article/details/126366217
    更新时间:2023年1月1日07:56:14 ,共 5644 字。