015.Excel文件导出

第一先定义一个类,配置表格的字体行距字体大小

public void reportExport(List<?> listdata, String reportName, HttpServletResponse response) {
    ResourceBundle rb = ResourceBundle.getBundle("constants");
    // 文件名
    String fileName = rb.getString(reportName + ".fileName");
    // 表名
    String sheetName = reportName + ".sheetName";
    // 字段名
    String sheetcolumn = reportName + ".columnName";
    // 取出list长度
    int size = 0;
    if (listdata!=null) size = listdata.size();
    // 读取properties中的内容
    String Name = rb.getString(sheetName);
    // 在Excel工作簿中建一工作表
    SXSSFWorkbook workbook = new SXSSFWorkbook(100);
    // 设置表格样式
    XSSFCellStyle cellStyle = (XSSFCellStyle) workbook.createCellStyle();
    // 报表边框
    cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
    cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
    cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
    cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
    XSSFFont font = (XSSFFont) workbook.createFont();
    // 单元格字体
    font.setFontName("宋体");
    font.setFontHeight(9);
    cellStyle.setFont(font);
    // 新建一名为sheetName的工作表
    SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet(Name);
    // 在索引的位置创建行(根据记录数添加)
    SXSSFRow[] row = new SXSSFRow[size + 1];
    row[0] = (SXSSFRow) sheet.createRow(0);
    int g = 0;
    int m = 0;
    int i = 0;
    // 写入表头
    try {
        for (i = 0; i < 1000; i++) {
            CellUtil.createCell(row[0], i, rb.getString(sheetcolumn + "[" + i + "]." + i), cellStyle);
        }
    } catch (MissingResourceException e) {
        m = i;
    }

    // 写入具体数据
    for (int j = 1; j <= size; j++) {
        row[j] = (SXSSFRow) sheet.createRow(j);
        g = 0;
        for (Field data : listdata.get(j - 1).getClass().getDeclaredFields()) {
            data.setAccessible(true);
            // 创建单元格
            SXSSFCell cell = (SXSSFCell) row[j].createCell(g);
            cell.setCellStyle(cellStyle);
            try {
                if (data.get(listdata.get(j - 1)) != null && !data.get(listdata.get(j - 1)).equals("")) {
                    // 填入数据
                    if (data.get(listdata.get(j - 1)) instanceof String) {
                        if(data.get(listdata.get(j - 1)).toString().contains("@%#")){ // 字符串换行处理
                            String str[]=data.get(listdata.get(j - 1)).toString().split("@%#");
                            String resultstr="";
                            for(int k=0;k<str.length;k++){
                                resultstr+=str[k]+"\n";
                            }
                            cellStyle.setWrapText(true);
                            cell.setCellStyle(cellStyle);
                            cell.setCellValue(resultstr);
                        }else{
                            cell.setCellValue((String) data.get(listdata.get(j - 1)));
                        }

                    }
                    if (data.get(listdata.get(j - 1)) instanceof Double) {
                        cell.setCellValue((Double) data.get(listdata.get(j - 1)));
                    }
                    if (data.get(listdata.get(j - 1)) instanceof Integer) {
                        cell.setCellValue((Integer) data.get(listdata.get(j - 1)));
                    }
                    if (data.get(listdata.get(j - 1)) instanceof Date) {
                        cell.setCellValue(FasDateUtils.formatDateTime((Date)data.get(listdata.get(j - 1))));
                    }
                }
                g++;
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    // 宽度自适应
    for (int k = 0; k < m; k++) {
        sheet.autoSizeColumn(k);
    }
    for (int columnNum = 0; columnNum < size; columnNum++) {

        int columnWidth = sheet.getColumnWidth(columnNum) / 256;
        for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
            Cell a = row[rowNum].getCell(columnNum);
            if (a != null) {
                if (a.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                    int length = a.getStringCellValue().getBytes().length;
                    if (columnWidth < length) {
                        columnWidth = length;
                    }
                }
            }
        }
        // 限定最大宽度
        if (columnWidth >= 40) {
            columnWidth = 40;
        }
        sheet.setColumnWidth(columnNum, columnWidth * 256);
    }
    try {
        // 将excel放入输出流推出
        OutputStream os = response.getOutputStream();
        BufferedOutputStream out = new BufferedOutputStream(os);
        // fileDownload插件以此判断下载是否成功,不设置则不执行成功回调函数
        response.setHeader("Set-Cookie", "fileDownload=true; path=/");
        // 设置文件类型
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        // 关闭流
        workbook.write(out);
        out.flush();
        out.close();
        workbook.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

其次在配置文件中定义每一列的对应编号从0开始为第一列,fileName为文件的外部名称

015.Excel文件导出

最后Controller的java代码

015.Excel文件导出

前端不同的框架访问的方式不同需要的数据类型也不同,根据自己需要返回不同的数据类型。