用于将数据写入到excel中并写回到前端.xls文件;
使用到的技术:
阿里巴巴开源的 easyExcel,官方文档: EasyExcel · 语雀 (yuque.com);
其余参考的博客: (13条消息) Java使用EasyExcel下载xls、xlsx 出现文件格式与扩展名不匹配_小肥羊的博客-CSDN博客
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.example.demo.domain.StudentVO;
import org.apache.poi.ss.formula.functions.T;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class ExcelUtils {
/**
* 使用response,将指定集合中的数据作为excel输出
* @param response 应该传入HttpServletResponse,传入前需要先设定response的返回内容类型和返回头信息
* response.setContentType("application/vnd.ms-excel");
* response.setHeader("content-Disposition","attachment;filename=" + "输出的文件名" +".xls")
* @param list 需要写到excel中的数据,List<T>中的T需要是个bean,不能使用map,否则数据写入不成功
* @param voType 将list中的封装好的bean的字节码对象发送过来,如 StudengVO.class, 如果传递有问题,可能会出现没有表头的情况;
* @throws IOException 将异常抛出,一旦有问题,会将异常抛给方法的调用着;
*/
public static void responseExcel(HttpServletResponse response, List list, Class voType) throws Exception {
//获取excelWriter对象,指定将都对应写到哪里。
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
//获取sheet的索引号为0,并将其名称改为report的sheet
WriteSheet sheet = EasyExcel.writerSheet(0,"report").head(voType).build();
//使用Writer对象,向sheet中写入list
ExcelWriter write = excelWriter.write(list, sheet);//关闭excelWriter资源,在其中会关闭response中的流资源很重要
excelWriter.finish();
}
}
参数中需要传递进去java Bean的class对象,举例:
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //lombok插件
@NoArgsConstructor
@AllArgsConstructor
public class StudentVO {
@ExcelProperty("姓名") //在这里定义表头的名称,否则会将该bean的属性名作为该列的表头名称
private String name;
@ExcelProperty("年龄") //在这里定义表头的名称,否则会将该bean的属性名作为该列的表头名称
private String age; }
Controller层代码举例:
import com.example.demo.domain.StudentVO;
import com.example.demo.util.ExcelUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@Controller
public class testController {
@GetMapping("/test")
@ResponseBody
public void test(HttpServletResponse response){
try {
// 模拟数据
List<StudentVO> list = new ArrayList<>();
StudentVO s1 = new StudentVO("张三","21");
StudentVO s2 = new StudentVO("李四","24");
list.add(s1);
list.add(s2);
//设置响应体的格式
response.setContentType("application/vnd.ms-excel");
response.setHeader("content-Disposition","attachment;filename=" + "test.xls");
//调用工具类 进行写操作
ExcelUtils.responseExcel(response,list,StudentVO.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- easyExcel 进行报表导出-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
另外,2003的excel行数最多65000行,实际使用的话,最好是在业务层及进行一个判断,如果超了的话,做个取舍,具体的判断的话,就不在工具类里面写了;
后续再根据需要写 读取excel的工具类;
大佬们,有问题的话,请帮忙指导啊,谢谢。