欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java后台Excel导出

程序员文章站 2024-03-20 22:15:22
...

开发时需要写一个excel导出的需求,自己就参考了网上的一些方法,然后自己整理了一下。

需要引入的架包

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

核心代码

 public void exportExcel(String id,HttpServletResponse response) throws IOException {
 		response.setContentType("application/vnd.ms-excel");
        response.setHeader("ContentDisposition","attachment;filename=test.xls");
        //声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        OutputStream outputStream = response.getOutputStream();
        HSSFSheet sheet = workbook.createSheet("test数据");
        // 设置表格默认列宽度为15个字节
        sheet.setDefaultColumnWidth((short) 15);
        //如果想设置表格宽度为自适应,把下面这段代码放在tryCatch上面
        /*for (int i = 0; i < titles.size(); i++) {
            sheet.autoSizeColumn(i);
        }*/
        // 生成一个样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置这些样式
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 生成一个字体
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 把字体应用到当前的样式
        style.setFont(font);
        // 生成并设置另一个样式
        HSSFCellStyle style2 = workbook.createCellStyle();
        style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
        style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 生成另一个字体
        HSSFFont font2 = workbook.createFont();
        font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        // 把字体应用到当前的样式
        style2.setFont(font2);
        HSSFRow row0 = sheet.createRow(0);
        HSSFCell cell00 = row0.createCell(0);
        HSSFCell cell01 = row0.createCell(1);
        HSSFCell cell02 = row0.createCell(2);
        cell00.setCellStyle(style);
        cell01.setCellStyle(style);
        cell02.setCellStyle(style);
        HSSFRichTextString text00 = new HSSFRichTextString("Name");
        HSSFRichTextString text01 = new HSSFRichTextString("Age");
        HSSFRichTextString text02 = new HSSFRichTextString("Sex");
        cell00.setCellValue(text00);
        cell01.setCellValue(text01);
        cell02.setCellValue(text02);
        //这里获取数据
        List<JSONObject> data= service.getExcelData(id);
        for (int i = 0; i < data.size(); i++) {
            HSSFRow row = sheet.createRow(i + 1);
            HSSFCell cell0 = row.createCell(0);
            HSSFCell cell1 = row.createCell(1);
            HSSFCell cell2 = row.createCell(2);
            cell0.setCellStyle(style);
            cell1.setCellStyle(style);
            cell2.setCellStyle(style);
            HSSFRichTextString text0 = new HSSFRichTextString(data.get(i).getString("name"));
            HSSFRichTextString text1 = new HSSFRichTextString(data.get(i).getString("age"));
            HSSFRichTextString text2 = new HSSFRichTextString(data.get(i).getString("sex"));
            cell0.setCellValue(text0);
            cell1.setCellValue(text1);
            cell2.setCellValue(text2);
        }
        try {
            workbook.write(outputStream);
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 }

HSSFWorkbook这个貌似只支持xls格式导出,如果生成的是xlsx格式的文件,导出完打开时会出现文件错误的问题,为了避免这个问题,声明一个工作薄时把HSSFWorkbook替换为XSSFWorkbook。然后下面设置样式的类文件,凡是HSSF开头的全部换为XSSF开头的类文件。

再贴一段支持导出文件为中文名的代码,且设置导出格式为xlsx。

		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
        String now = dateFormat.format(new Date());
        String agent = request.getHeader("USER-AGENT").toLowerCase();
        response.setContentType("application/vnd.ms-excel");
        String fileName = “信息表” + now;
        String codedFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
        if (agent.contains("firefox")) {
            response.setCharacterEncoding("utf-8");
            response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO8859-1") + ".xlsx");
        } else {
            response.setHeader("content-disposition", "attachment;filename=" + codedFileName + ".xlsx");
        }
相关标签: java excel导出