esaypoi导出一个sheet页导出多个表格

格式设置

package pegasus.integrated.dynamicWork.controller;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

public class ExcelCS {
    /**
     * * 导出Excel
     *
     * @param sheetName   sheet名称
     * @param titleColumn 列标题
     * @param title       标题
     * @param values      表内容
     * @param wb          HSSFWorkbook对象
     * @return
     */
    public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] titleColumn, String title, String[][] values, HSSFWorkbook wb, int rownum) {

        // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if (wb == null) {
            wb = new HSSFWorkbook();
        }
        HSSFSheet sheet;
        // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        if (wb.getSheet(sheetName) != null) {
            sheet = wb.getSheet(sheetName);
        } else {
            sheet = wb.createSheet(sheetName);
        }
        //创建表名的样式
        HSSFCellStyle tableNamestyle = wb.createCellStyle();
        tableNamestyle.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
        sheet.autoSizeColumn((short) 0);
        tableNamestyle.setBorderBottom(BorderStyle.THIN); //下边框
        tableNamestyle.setBorderLeft(BorderStyle.THIN);//左边框
        tableNamestyle.setBorderTop(BorderStyle.THIN);//上边框
        tableNamestyle.setBorderRight(BorderStyle.THIN);//右边框
        //设置字体
        HSSFFont tableNamefont = wb.createFont();
        tableNamefont.setFontHeightInPoints((short) 14); //字体高度
        tableNamefont.setColor(HSSFFont.COLOR_NORMAL); //字体颜色
        tableNamefont.setFontName("宋体"); //字体
        tableNamestyle.setFont(tableNamefont);


        //创建第一行
        HSSFRow row = sheet.createRow(rownum);
        //设置合并单元格样式
        setCellBorder(1, titleColumn.length - 1, row, tableNamestyle);
        //单元格合并
        CellRangeAddress cra = new CellRangeAddress(rownum, rownum, 0, titleColumn.length - 1);
        sheet.addMergedRegion(cra);
        //声明列对象
        HSSFCell cell = null;
        cell = row.createCell(0);
        cell.setCellValue(title);
        /**设置单元格格式为文本格式*/
        HSSFDataFormat format = wb.createDataFormat();
        tableNamestyle.setDataFormat(format.getFormat("@"));
        cell.setCellStyle(tableNamestyle);//设置单元格格式为"文本"
        cell.setCellType(CellType.STRING);


        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        row = sheet.createRow(rownum + 1);

        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle titlestyle = wb.createCellStyle();
        titlestyle.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
        sheet.autoSizeColumn((short) 0);
        //设置字体
        HSSFFont font = wb.createFont();
        font.setFontHeightInPoints((short) 9); //字体高度
        font.setColor(HSSFFont.COLOR_NORMAL); //字体颜色
        font.setFontName("宋体"); //字体
        //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //宽度
        titlestyle.setFont(font);
        titlestyle.setBorderBottom(BorderStyle.THIN); //下边框
        titlestyle.setBorderLeft(BorderStyle.THIN);//左边框
        titlestyle.setBorderTop(BorderStyle.THIN);//上边框
        titlestyle.setBorderRight(BorderStyle.THIN);//右边框


        //创建单元格样式
        HSSFCellStyle cellstyle = wb.createCellStyle();
        //设置字体
        HSSFFont tableCountfont = wb.createFont();
        tableCountfont.setFontHeightInPoints((short) 10); //字体高度
        tableCountfont.setColor(HSSFFont.COLOR_NORMAL); //字体颜色
        tableCountfont.setFontName("宋体"); //字体
        //tableCountfont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); //宽度
        cellstyle.setFont(tableCountfont);

        cellstyle.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
        cellstyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellstyle.setBorderLeft(BorderStyle.THIN);//左边框
        cellstyle.setBorderTop(BorderStyle.THIN);//上边框
        cellstyle.setBorderRight(BorderStyle.THIN);//右边框

        /**设置单元格格式为文本格式*/
        HSSFDataFormat format1 = wb.createDataFormat();
        cellstyle.setDataFormat(format1.getFormat("@"));


        //创建标题
        for (int i = 0; i < titleColumn.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(titleColumn[i]);
            cell.setCellStyle(titlestyle);
        }

        //创建内容
        for (int i = rownum; i < values.length + rownum; i++) {
            HSSFCell cellcell = null;
            row = sheet.createRow(i + 2);
            for (int j = 0; j < values[i - rownum].length; j++) {
                //将内容按顺序赋给对应的列对象
                cellcell = row.createCell(j);
                cellcell.setCellValue(values[i - rownum][j]);
                cellcell.setCellStyle(cellstyle);
                cellcell.setCellType(CellType.STRING);
            }

        }
        // 设置为根据内容自动调整列宽
/*        for (int k = 0; k < values[0].length; k++) {
            sheet.autoSizeColumn(k);
            HSSFCellStyle cellstyle1 = wb.createCellStyle();
            HSSFDataFormat format2 = wb.createDataFormat();
            cellstyle1.setDataFormat(format2.getFormat("@"));
            sheet.setDefaultColumnStyle(k, cellstyle1);
        }
        setSizeColumn(sheet, values[0].length);*/
        return wb;
    }

    /**
     * 自适应宽度(中文支持)
     *
     * @param sheet
     * @param size
     */
    public static void setSizeColumn(HSSFSheet sheet, int size) {

        for (int columnNum = 0; columnNum < size; columnNum++) {
            int columnWidth = sheet.getColumnWidth(columnNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                HSSFRow currentRow;
                //当前行未被使用过
                if (sheet.getRow(rowNum) == null) {
                    currentRow = sheet.createRow(rowNum);
                } else {
                    currentRow = sheet.getRow(rowNum);
                }
                if (currentRow.getCell(columnNum) != null) {
                    HSSFCell currentCell = currentRow.getCell(columnNum);
                    if (currentCell.getCellType() == CellType.STRING) {
                        int length = currentCell.getStringCellValue().getBytes().length;
                        if (columnWidth < length) {
                            columnWidth = length;
                        }
                    }
                }
            }
            sheet.setColumnWidth(columnNum, columnWidth * 256);
        }
    }

    /**
     * 合并单元格加边框  水平
     * 参数说明:start和并的第二列,end为合并的最后一列,row就为当前行,style样式(里面有设置边框)
     * 例如从0-10列合并: ExcelUtil.setCellBorder(2,10,row,style);   这样可以设置
     */
    public static void setCellBorder(int start, int end, HSSFRow row, HSSFCellStyle style) {
        for (int i = start; i <= end; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellValue("");
            cell.setCellStyle(style);
        }
    }


}

业务层 导出方法

/**
     * 导出模板
     *
     * @return ActionResult
     */
    @GetMapping(value = "/exportData")
    public ActionResult<Object> exportExcelDetail(String workId) {
        List<DynamicWorkEntity> list = dynamicWorkSubtaskService.getModelList(workId);
        List<DynamicWorkSubtaskEntity> subList = list.get(0).getSubList();

        // 创建HSSFWorkbook
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 表头标题
        String title = "工作任务";
        // 列标题
        String[] Mytitle = {"任务名称", "负责部门", "类别", "预计办结日期", "办理状态","工作内容"};
        // sheet名
        String sheetName = "动态工作模板";
        String content[][] = new String[list.size()][];
        int rownum = 0;
        if (!list.isEmpty()) {
            for (int i = 0; i < list.size(); i++) {
                content[i] = new String[Mytitle.length];
                content[i][0] = list.get(i).getName();
                content[i][1] = list.get(i).getResponsibleDepartmentName();
                content[i][2] = list.get(i).getCategory();
                String date = list.get(i).getExpectedCompletionDate();
                if (StringUtil.isNotEmpty(date)) {
                    content[i][3] = date.split(" ")[0];
                }
                content[i][4] = 1 == list.get(i).getStatus() ? "进行中" : "已完成";
                content[i][5] = list.get(i).getContent();
            }
            workbook = ExcelCS.getHSSFWorkbook(sheetName, Mytitle, title, content, workbook, rownum);
        }
        // 表头标题
        String title1 = "子任务";
        // 列标题
        String[] Mytitle1 = {"任务名称", "负责部门", "负责人", "预计办结日期", "办理状态",""};
        // sheet名
        String content1[][] = new String[subList.size()][];
        //加2代表加了title和Mytitle两行,后边加的1代表表格间空的行数
        int rownum1 = list.size() + 2;
        if (!subList.isEmpty()) {
            for (int i = 0; i < subList.size(); i++) {
                content1[i] = new String[Mytitle.length];
                content1[i][0] = subList.get(i).getName();
                content1[i][1] = subList.get(i).getDepartmentName();
                content1[i][2] = subList.get(i).getPeopleName();
                content1[i][3] = subList.get(i).getEstimatedCompletionTime();

                if (TaskStatus.ONE.getName().equals(subList.get(i).getProcessingStatus())) {
                    content1[i][4] = "进行中";
                } else if (TaskStatus.TWO.getName().equals(subList.get(i).getProcessingStatus())) {
                    content1[i][4] = "已完成";
                } else {
                    content1[i][4] = "已退回";
                }
                content1[i][5] = "";
            }
            workbook = ExcelCS.getHSSFWorkbook(sheetName, Mytitle1, title1, content1, workbook, rownum1);
        }
        DownloadVO vo = DownloadVO.builder().build();
        String name = "动态工作模板.xlsx";

        String fileName = configValueUtil.getTemporaryFilePath() + name;

        try {
            @Cleanup FileOutputStream output = new FileOutputStream(XSSEscape.escapePath(fileName));
            workbook.write(output);
            //上传文件
            UploadUtil.uploadFile(configValueUtil.getFileType(), fileName, FileTypeEnum.TEMPORARY, name);
        } catch (IOException e) {
            e.printStackTrace();
        }

        vo.setName(name);
        UserInfo userInfo = userProvider.get();
        vo.setUrl(UploaderUtil.uploaderFile(userInfo.getId() + "#" + name + "#" + "Temporary"));
        return ActionResult.success(vo);
    }

最终效果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值