使用Java导出Excel表格直接下载(合并单元格)——基于POI框架

使用Java导出Excel表格直接下载(合并单元格)——基于POI框架

预期效果:
在这里插入图片描述

一、准备工作:
1.导入所需要的jar包

<dependency>
	         <groupId>org.apache.poi</groupId>
	         <artifactId>poi</artifactId>
	         <version>3.17</version>
    	</dependency>
		<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi-ooxml</artifactId>
		    <version>3.17</version>
		</dependency>

2.jsp代码:

htmlCode += '<a class="layui-btn layui-btn-normal layui-btn-xs" οnclick="exportExcel(\'' + d.id + '\')"><i class="layui-icon"></i>导出表格</a>';
 /**
     * 导出表格
     */
    function exportExcel(id) {
        window.open(window.path + "/questionnaire/downExla?questionnaireId="+id);
    }

二、编写所需要的类

@RestController
@RequestMapping("/questionnaire")
public class QuestionnaireController extends PageSimplenessController<QuestionnaireDTO, Long> {
/**
     * 导出表格x
     * @param request
     * @param response
     * @returnx
     */
    @GetMapping("downExla")
    public com.ars.common.entity.ResponseEntity downOnlineExla(HttpServletRequest request, HttpServletResponse response) {
        OutputStream os = null;
        FileInputStream fis = null;
        java.io.File file = null;
        String[] tableHead ={"学号","姓名","题目","答案"};
        QuestionnaireDTO questionnaireDTO = null;
        try {
            Map<String, Object> map=new HashMap<String, Object>();
            String questionnaireId = request.getParameter("questionnaireId");
            map.put("id",questionnaireId);
            List<Map> list = questionnaireService.listQuestionnaireDetail(map);

            //创建工作簿
            HSSFWorkbook wb = new HSSFWorkbook();
            if(list.size() < 1) {
                return fail("无数据!");
            }

            // 目标文件存放路径
            String targetFilePath = CommonUtil.uploadFilePath + UUID.randomUUID().toString() + ".xls";

            //创建工作表
            String safeName = WorkbookUtil.createSafeSheetName("问卷详情");
            HSSFSheet sheet = wb.createSheet(safeName);

            //设置列宽
            sheet.setColumnWidth(0, 8*1000);
            sheet.setColumnWidth(1, 8*1000);
            sheet.setColumnWidth(2, 8*1000);
            sheet.setColumnWidth(3, 4*1000);

            //表头字体
            HSSFFont fontTableHeader = wb.createFont();
            fontTableHeader.setBold(true);
            fontTableHeader.setFontHeight((short) (4*50));
            fontTableHeader.setFontName("宋体");

            //单元格字体1
            HSSFFont fontTable = wb.createFont();
            fontTable.setBold(false);
            fontTable.setFontHeight((short) (4*50));
            fontTable.setFontName("宋体");

            //表头样式
            HSSFCellStyle cellTitleStyle = wb.createCellStyle();
            cellTitleStyle.setAlignment(HorizontalAlignment.CENTER);
            cellTitleStyle.setVerticalAlignment(VerticalAlignment.CENTER);

            //单元格边框
            cellTitleStyle.setBorderTop(BorderStyle.THIN);
            cellTitleStyle.setBorderBottom(BorderStyle.THIN);
            cellTitleStyle.setBorderLeft(BorderStyle.THIN);
            cellTitleStyle.setBorderRight(BorderStyle.THIN);

            //单元格样式1
            HSSFCellStyle cellStyle = wb.createCellStyle();
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);


            //单元格边框
            cellStyle.setBorderTop(BorderStyle.THIN);
            cellStyle.setBorderBottom(BorderStyle.THIN);
            cellStyle.setBorderLeft(BorderStyle.THIN);
            cellStyle.setBorderRight(BorderStyle.THIN);



            //设置表头
            HSSFCell cell;

            //设置标题
            HSSFRow row = sheet.createRow(0);


            //设置表头
            for (int j = 0; j < tableHead.length; j++) {
                cell = row.createCell(j);
                cell.setCellValue(tableHead[j]);//表头
                cell.setCellStyle(cellTitleStyle);
                row.setHeight((short) (5*100));
            }






            for (int i = 1; i < list.size() + 1; i++) {
                cellStyle.setFont(fontTable);
                //第一行
                HSSFRow rowCell = sheet.createRow(i);


                //设置行高
                rowCell.setHeight((short) (4*100));
                cell = rowCell.createCell(0);
                cell.setCellValue((String)list.get(i - 1).get("create_user"));
                cell.setCellStyle(cellStyle);



                cell = rowCell.createCell(1);
                cell.setCellValue((String)list.get(i - 1).get("name"));
                cell.setCellStyle(cellStyle);

                cell = rowCell.createCell(2);
                cell.setCellValue(((Integer)list.get(i - 1).get("sort")+1+".")+(String)list.get(i - 1).get("topic"));
                cell.setCellStyle(cellStyle);

                cell = rowCell.createCell(3);
                cell.setCellValue((String)list.get(i - 1).get("answer"));
                cell.setCellStyle(cellStyle);


            }


            //合并单元格
            String last="";

            int k=0;
            for (int i = 1; i < list.size() + 1; i++) {

                if (i==1){
                    last=(String)list.get(i - 1).get("create_user");

                }
                else {
                    if (last.equals((String)list.get(i - 1).get("create_user"))){
                        k+=1;
                    }else {
                        sheet.addMergedRegion(new CellRangeAddress(i-(k+1), i-1,0 ,0));
                        sheet.addMergedRegion(new CellRangeAddress(i-(k+1), i-1,1 ,1));
                        last=(String)list.get(i - 1).get("create_user");
                        k=0;
                    }
                    if(i == list.size()){
                        sheet.addMergedRegion(new CellRangeAddress(i-(k+1)+1, i,0 ,0));
                        sheet.addMergedRegion(new CellRangeAddress(i-(k+1)+1, i,1 ,1));
                    }
                }
            }



            FileOutputStream fos = new FileOutputStream(targetFilePath);
            wb.write(fos);
            fos.close();

            //文件下载前端
            file = new File(targetFilePath);
            if(file.exists()){
                fis = new FileInputStream(file);
                byte[] bytes = new byte[fis.available()];
                fis.read(bytes);

                response.setContentType(new MimetypesFileTypeMap().getContentType(file));
                response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(
                        URLDecoder.decode("问卷详情.xls", "UTF-8")
                                .getBytes("gb2312"), "ISO8859-1"));
                os = response.getOutputStream();
                os.write(bytes);
            }else {
                return fail("导出失败");
            }

        } catch (IOException e) {
            e.printStackTrace();
            return fail("导出失败");
        } finally {
            try {
                if (os != null) {
                    os.flush();
                    os.close();
                }
                if (fis != null) {
                    fis.close();
                }
                if (file != null && file.exists()){
                    file.delete();
                }
            } catch (Exception e) {

            }
        }
        return success("导出成功");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值