Spring使用POI导出excel(使用网络请求)

概要

POI是后端导出excel的常用插件

这里提供几个代码编写的建议和具体事例供参考

POI导入excel可见Spring使用POI导入excel 配合layui upload组件

建议

1.代码抽离封装

将一段逻辑代码封装成一个方法而不是所有代码全部写进一个方法中

2.样式设置和数据写入分离

不要一边写数据一边改样式,否则会有点混乱

3.推荐使用模板

本地新建一个excel(比如.xlsx)文件,设置好样式之后放在项目资源文件(resources)下

我们只需要填充数据或设置边框就好了

大大节省设置样式的功夫

4.前端请求格式

使用跳转而不能使用ajax

步骤

1.pom引入依赖

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

<!-- POI 分组维度导入使用 -->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.17</version>
</dependency>

2.后端编写POIUtil类

这里我把他写成了service,而不是常量类

.xlsx使用

XSSFSheet XSSFWorkbook等

.xls使用

HSSFWorkbook  HSSFSheet等

由于.xlsx现在使用的比较多所以选择这个

/**
 * 导出套餐
 *
 */
@Service
public class PoiUtil {

    private static final Logger logger = LoggerFactory.getLogger(PoiUtil.class);

    @Autowired
    private BoPackageExtService boPackageExtService;

    /**
     * 导出会计科目.
     * @throws Exception
     *
     */
    public void exportSubject(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //读取模版资源文件
        ClassPathResource classPathResource = new ClassPathResource("templates\\excel\\export_package_template.xlsx");
        File templateFile = classPathResource.getFile();

        //生成工作簿
        XSSFWorkbook workbook = new XSSFWorkbook(templateFile);
        //新建工作表,获取第一张表(使用了模板所以如此创建)
        XSSFSheet sheet = workbook.getSheetAt(0);

        //文件名称
        String fileName = URLEncoder.encode("套餐信息单", "UTF-8");

        //获取数据list
        List<BoPackage> boPackageList = boPackageExtService.getBoPackageList(request, response);

        //写入数据
        writeExportData(sheet, boPackageList);

        //添加样式,数字代表的是共有7列
        addBorderStyle(workbook, sheet, boPackageList.size(), 7);

        //输出流
        addResponseType(response, fileName);

        try {
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            logger.error("导出Excel错误!", e);
        }
    }

    /**
     * 给单元格添加边框样式.
     *
     * @param workbook
     * @param sheet
     * @param rowSize
     * @param columnSize
     */
    public void addBorderStyle(XSSFWorkbook workbook, XSSFSheet sheet, int rowSize, int columnSize) {
        XSSFCellStyle style = workbook.createCellStyle();
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);

        for (int i = 0; i < rowSize; i++) {
            XSSFRow row = sheet.getRow(i + 2);

            for (int j = 1; j < columnSize; j++) {
                XSSFCell cell = row.getCell((short) j);
                cell.setCellStyle(style);
            }
        }
    }


    /**
     * 将导出套餐的数据写入excel.
     *
     * @param sheet
     * @param boPackageList
     */
    public void writeExportData(XSSFSheet sheet, List<BoPackage> boPackageList) {

        //循环遍历填入数据
        for (int i = 0; i < boPackageList.size(); i++) {
            //创建行
            XSSFRow row = sheet.createRow(i + 2);

            //套餐码
            XSSFCell subjectCodeCell = row.createCell((short) 1);
            subjectCodeCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getPackageCode()));

            //套餐名称
            XSSFCell subjectNameCell = row.createCell((short) 2);
            subjectNameCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getPackageName()));

            //价格
            XSSFCell subjectPriceCell = row.createCell((short) 3);
            subjectPriceCell.setCellValue(new XSSFRichTextString(String.valueOf(boPackageList.get(i).getPackageValue())));

            //类型
            XSSFCell subjectTypeCell = row.createCell((short) 4);
            subjectTypeCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getPackageType()));

            //关于
            XSSFCell subjectAboutCell = row.createCell((short) 5);
            subjectAboutCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getAbout()));

            //所属供应商
            XSSFCell subjectProviderCell = row.createCell((short) 6);
            subjectProviderCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getProviderName()));
        }
    }

    /**
     * 设置Excel输出格式.
     *
     * @param hsr
     * @param fileName
     */
    private void addResponseType(HttpServletResponse hsr, String fileName) {
        hsr.setContentType("application/vnd.ms-excel; charset=UTF-8");
        hsr.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
        hsr.setBufferSize(1024);
    }
}

3.接口编写

@RequestMapping("exportBoPackage")
    public void exportBoPackage(HttpServletRequest request, HttpServletResponse response) {
        try {
            poiUtil.exportSubject(request, response);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("导出Excel错误");
    }
}

4.前端按钮点击跳转

必须使用跳转而不能是ajax请求

路径是请求的接口

var exportPackage = function () {
    //不能使用ajax
    //文件的下载是以二进制形式进行的,不是文本
    window.location.href= $appRoot + "/bopackage/boPackageExt/exportBoPackage";
}

此时点击后就会下载文件

大功告成!

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值