Java导出Excel表格,可合并单元格,支持xls和xlsx格式

18 篇文章 0 订阅

编程思路:

  1. 创建Excel文件对象
  2. 创建一个或多个Sheet工作表
  3. 合并想要合并的单元格
  4. 创建行Row
  5. 根据行row获取单元格cell
  6. 给单元格赋值
  7. 导出

添加依赖

pom.xml的依赖

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<!--接收Excel对象使用-->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.0.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<!--解析Excel对象使用-->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.0.0</version>
</dependency>

前端页面

如果是导入到服务器,其实这个可有可无,只是一个触发媒介,当然,你也可以在Java代码中创建一个main方法运行。

如果导入到客户端,请使用a标签或window.location.href来指向请求,不然无法导出。

Excel.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Excel</title>
    <script type="text/javascript" src="/demo/lib/jquery-3.4.1.min.js"></script>
</head>
<body>
    <button id="exportExcel">导出到服务器Excel</button>
    <a href="/demo/index/exportExcel" >导出到客户端Excel</a>
</body>
</html>
<script type="text/javascript">

    $("#exportExcel").click(function(){
        $.ajax({
            url:"/demo/index/exportExcel",
            type:"post",
            success:function (data) {
                alert(data);
            },
            error:function () {
                alert("error");
            }
        });
    });

</script>

exportExcel.java

package com.example.demo.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description TODO
 * @Author wangs
 * @Date 2019/12/311:16
 */
@Controller
@RequestMapping("/index/")
public class IndexController {

    @RequestMapping("toExcelPage")
    public String toExcelPage(){
        return "web/excel";
    }

    /**
     * 导出
     * @return
     */
    @ResponseBody
    @RequestMapping("exportExcel")
    public String exportExcel(HttpServletResponse response){
        List<String> titleList =new ArrayList<>();//定义Excel标题
        titleList.add("时间");
        titleList.add("姓名");
        titleList.add("性别");
        titleList.add("年龄");
        titleList.add("描述");
        //创建Excel文件对象
        XSSFWorkbook wb =new XSSFWorkbook();
        //创建Sheet列
        XSSFSheet sheet = wb.createSheet("员工");
        //创建第一行,即表头
        XSSFRow row0 =sheet.createRow(0);
        //添加表头
        for(int i=0;i<titleList.size();i++){
            row0.createCell(i).setCellValue(titleList.get(i));
        }
        //添加表中的内容,这里我们添加9行
        for(int row=0;row<10;row++){
            //添加新行,这里我们从第二行开始,第一行是标题列
            XSSFRow newRow=sheet.createRow(row+1);
            //每行8个单元格填充
            for(int cell=0;cell<8;cell++){
                //先创建、再写入单元格数据
                newRow.createCell(cell).setCellValue("我是第"+(row+1)+"行,"+(cell+1)+"列单元格");
            }
        }

        //添加一些合并单元格的例子
        //合并单元格,参数依次为要合并的单元格的开始行、结束行、开始列、结束列
        sheet.addMergedRegion(new CellRangeAddress(10, 13, 0, 0));
        sheet.addMergedRegion(new CellRangeAddress(10, 13, 3, 3));
        sheet.addMergedRegion(new CellRangeAddress(10, 13, 4, 6));
        //创建行
        XSSFRow row10 =sheet.createRow(10);
        //赋值
        row10.createCell(0).setCellValue("四行一列单元格合并");
        row10.createCell(1).setCellValue("未合并1");
        row10.createCell(2).setCellValue("未合并1");
        row10.createCell(3).setCellValue("四行一列单元格合并");
        row10.createCell(4).setCellValue("四行三列单元格合并");

        //由于已经合并过单元格了,故坐标为11行1列的单元格不存在,即便赋值也不会成功
        XSSFRow row11 =sheet.createRow(11);
        row11.createCell(0).setCellValue("未合并2"); //11行1列
        row11.createCell(1).setCellValue("未合并2");
        row11.createCell(2).setCellValue("未合并2");
        

        XSSFRow row12 =sheet.createRow(12);
        row12.createCell(1).setCellValue("未合并3");
        row12.createCell(2).setCellValue("未合并3");


        //导出到服务器
        String filePath="D://demo/";
        String fileName="wangs.xlsx";
        File dir =new File("D://demo/");
        dir.mkdir();
        try {
            FileOutputStream fileOutputStream =new       FileOutputStream(filePath+fileName);
            wb.write(fileOutputStream);
            fileOutputStream.close();;
            wb.close();
        }catch (Exception e){

        }


        //导出到客户端
        try {
            String fileName="号码池";
            OutputStream output = response.getOutputStream();
            response.reset();
            response.setHeader("Content-disposition", "attachment; filename=" +new String(fileName.getBytes(),"iso-8859-1")+".xlsx");//添加对中文名字支持
            response.setContentType("*/*");
            response.setCharacterEncoding("utf-8");
            wb.write(output);
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
            return ("导出失败!");
        }

        return "success";
    }
}

该有的解释都在代码里面说明白了,这里就不多说了,接下来我们看一下操作过程和导出结果。


导出到服务器:操作界面,点击导出后:

然后在D盘目录下面会生成一个demo文件夹,文件夹中有“wangs.xlsx”的Excel,打开后,结果如下,可对照代码观看Excel结构。

导出到客户端会有一个下载提示框提示下载。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值