jws 方式表格导出,excel文件导出,rest风格接口实现

2022-04-13 14:51:51 浏览数 (1)

一、思路:从数据库表中查出list ,封装到 HSSFWorkook 中,再由HSSFWorkook 写出到 File 中,

用 response 的 build 方法 实现下载、导出。

二、 实现代码:

要加上注解 :@Produces ,文本就写 text , 图片写 img ( 如果我没有记错的话)

代码语言:javascript复制
  @Path("/exportWWCollectReport")
    @Produces("text/plain")
    @GET
    @Override
    public Response exportWorkWeights(
             @QueryParam("tableName") @DefaultValue("工作权重统计报表") String tableName,
             @QueryParam("startTime") String startTime,
             @QueryParam("endTime") String endTime,
             @QueryParam("employeeNo") String employeeNo,
             @QueryParam("organizeId") String organizeId,
             @QueryParam("employeeName") String employeeName,
             @QueryParam("position") String position,
             @QueryParam("jobTypeId") String jobTypeId,
             @QueryParam("projectId") String projectId) {

        try{
           return workWeightCollectService.exportWorkWeights(tableName, startTime, endTime, employeeNo,
                    organizeId, employeeName, position, jobTypeId, projectId);
        }catch (Exception ex){
            logger.debug("工作权重统计报表导出失败:",ex.getMessage());
            return null;
        }
    }

要导这个包下的 response :

代码语言:javascript复制
import javax.ws.rs.core.Response;
代码语言:javascript复制
 @Override
    public Response exportWorkWeights(String tableName, String startTime, String endTime, String employeeNo,
                                      String organizeId, String employeeName, String position, String jobTypeId, String projectId) throws Exception {

        // 要导出的列表数据
        String sql = getWorkWeightCollectReportSql( startTime, endTime, employeeNo,
                 organizeId, employeeName, position, jobTypeId, projectId);
        List<Object> wwList = getResultList(sql);
        if (null == wwList){
            return null;
        }

        List<List<Object>> list = new ArrayList<List<Object>>(); // list 是要导出的表数据
        WorkWeightDto ww = null;
        String startT = null;
        String endT = null;
        WorkWeightDto wwdto = new WorkWeightDto();
        for (Object ob : wwList) {
            Object[] obj = (Object[])ob;
            List<Object> dataList = new ArrayList<Object>();
            startT = String.valueOf(obj[0]) == null ? "":String.valueOf(obj[0]);
            endT = String.valueOf(obj[1]) == null ? "": String.valueOf(obj[1]);
            dataList.add(startT " 至 " endT);
            dataList.add(String.valueOf(obj[2]) == null ? "":String.valueOf(obj[2])); // 工号
            dataList.add(String.valueOf(obj[10]) == null ? "":String.valueOf(obj[10]));  // 中心

            String bu = String.valueOf(obj[11]);
            wwdto = setOrganizeBu(wwdto, bu);
            String ke = String.valueOf(obj[12]);
            wwdto = setOrganizeKe(wwdto,ke);
            String shi = String.valueOf(obj[13]);
            if(shi.substring(shi.length()-2,shi.length()).contains("室")){
                wwdto.setShi(shi);
            }else {
                wwdto = setOrganizeKe(wwdto, shi);
            }
            dataList.add(wwdto.getBu()); //  部
            dataList.add(wwdto.getKe()); //  科
            dataList.add(wwdto.getShi()); //  室
            dataList.add(String.valueOf(obj[3]) == null ? "":String.valueOf(obj[3])); //姓名
            dataList.add(String.valueOf(obj[8]) == null ? "":String.valueOf(obj[8])); // 职级
            dataList.add(String.valueOf(obj[5]) == null ? "":String.valueOf(obj[5])); // 工作类型
            dataList.add(String.valueOf(obj[7]) == null ? "":String.valueOf(obj[7])); // 项目
            dataList.add(String.valueOf(obj[9]) == null ? "":String.valueOf(obj[14])); // 工作任务
            dataList.add(String.valueOf(obj[9]) == null ? "":String.valueOf(obj[9])); // 比例
            list.add(dataList);
        }
        //表头
        String[] headers = new String[]{"所属周期","工号","中心","部门","科","室","姓名","职级","工作类型","项目","工作任务","比例"};
        FileOutputStream fileOut = null;
        try{
            HSSFWorkbook workbook = ExportUtil.excelOut(headers, list);
            fileOut = new FileOutputStream(tableName ".xlsx");
            workbook.write(fileOut);
            // 以上是写入文件,以下是下载文件
            File file = new File(tableName ".xlsx");
            Response.ResponseBuilder response = Response.ok(file);
            response.header("Content-Disposition","attachment; filename="  new String((tableName ".xlsx").getBytes("gbk"), "iso8859-1"));
            return response.build();
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
        finally {
            fileOut.close();
        }
    }
代码语言:javascript复制
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import java.io.FileOutputStream;
import java.util.List;

public class ExportUtil {


    public static HSSFWorkbook excelOut(String[] cloumName, List<List<Object>> list){

        //声明一个工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
        //生成一个表格
        HSSFSheet sheet = workbook.createSheet();
        //设置表格默认列宽度为20个字符
        sheet.setDefaultColumnWidth(20);
        //生成一个样式,用来设置标题样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 表头居中
        style.setAlignment(HorizontalAlignment.CENTER);
        //生成一个字体
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 12); // 字体高度
        font.setFontName(" 黑体 "); // 字体
        //把字体应用到当前的样式
        style.setFont(font);
        // 生成并设置另一个样式,用于设置内容样式
        HSSFCellStyle style2 = workbook.createCellStyle();
        style2.setAlignment(HorizontalAlignment.CENTER);
        // 生成另一个字体
        HSSFFont font2 = workbook.createFont();
        font2.setFontName(" 黑体 "); // 字体
        // 把字体应用到当前的样式
        style2.setFont(font2);

        HSSFRow row = sheet.createRow(0);
        for(int i = 0; i < cloumName.length; i  ){
            //单元格
            HSSFCell cellHead = row.createCell(i);
            cellHead.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(cloumName[i]);
            cellHead.setCellValue(text);
        }

        for (int i = 0; i < list.size(); i  ){
            row = sheet.createRow(i   1);
            List<Object> dataList = list.get(i);
            for (int j = 0; j < dataList.size(); j  ) {
                // 表格内容样式设置
                HSSFCell cellHead = row.createCell(j);
                cellHead.setCellStyle(style2);
                HSSFRichTextString text = new HSSFRichTextString(String.valueOf(dataList.get(j)));

                // 为空
                if(text == null || text.toString() == ""){
                    cellHead.setCellValue("");
                }
               /* // 整数,不为电话
                else if(ValidateUtils.isInteger(String.valueOf(text))
                        && !(StringUtils.startsWith(String.valueOf(text),"1")
                        && String.valueOf(text).length() == 11)){
                    cellHead.setCellValue(Integer.parseInt(String.valueOf(text)));
                }
                // 有小数、或为电话
                else if(ValidateUtils.isDouble(dataList.get(j).toString())){
                    cellHead.setCellValue(Double.parseDouble(String.valueOf(text)));
                }*/
                // 字符串
                else{
                    cellHead.setCellValue(String.valueOf(text));
                }
            }
        }
        return workbook;
    }
}

另: xlsx 格式的表格,容量数据条数有上限,大约是36000 条数据。建议使用 csv 格式的表格, 可以保存极大的数据量。

生成的临时文件存放在工程中,记得删除。

0 人点赞