记得先导个maven依赖,不然没法操作excel文件:
<!-- 解析xls文件 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<!-- poi库 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
分三步:
1.生成一个excel
2.填写excel
3.把文件发送给前端
其实就是后端自己生成一个excel,然后填写模板信息,最后发送给前端即可。但是这里需要考虑一个问题,其实我们没有必要每接收一个请求就完成一次1、2步骤,所以我们完全可以自己写一个模板,然后保存在服务器中,用户请求我们把文件发给他即可。
重要!必看!
接下来就是代码部分了。代码应该在controller类的ProvideTemplate_xlsx方法中完成这三步。但是考虑到需要完成的代码多。所以我将它写到了Util包下,作为一个工具类使用,其中包含了两个方法,一个用来用代码生成excel模板(但其实这个没啥用,因为我们完全可以手动去写一个excel......)另外一个用来发送excel到前端。
难点在于我们需要把excel保存到项目文件中resouces/static目录下,如何获取该路径是个问题。
我们可以使用:
String s1 = new ApplicationHome(this.getClass()).getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\templateFiles\\";
这样可以拿到我们想要保存文件
的那个目录,接下来只需要拼接上文件名即可,比如
String fileName1 = s1+ "123.xlsx";
这样就拿到了文件完整路径。
接下来我们直接上用代码生成excel模板的代码,虽然这个实用价值不高,但是这里面涉及到文件在项目文件夹的保存,所以仍然有意义。
//创建模板文件,一般不用创建,一份就够,如果要创建需要改内容
//content数组是excel模板中标题行的内容,比如:content=[用户名,用户密码,用户身份,用户性别]
//fileName是想要把模板叫成什么名字。因为我们生成的模板肯定希望有一个规范的名字,而不是用UUID去生成一个没有意义的文件名字。
public void create(String[] content, String fileName) throws IOException {
//初始化
// 创建Excel文件
XSSFWorkbook wk = new XSSFWorkbook();
// 创建一张工作表
XSSFSheet sheet = wk.createSheet("info");
// 设置列宽
sheet.setColumnWidth(0, 5000);
// 创建一行(表头),行是从0开始的
XSSFRow row = sheet.createRow(0);
// 获取User类中成员变量的个数,以方便确认有几列
Field[] fields = User.class.getDeclaredFields();
int length = fields.length;//拿到循环次数,每次循环写一个列名称。
// 定义首部行内容
// String [] content={"用户名","用户密码","用户身份","用户性别"};
// String fileName = "用户信息模板.xlsx";
// 创建第一行的首部单元格
for (int i = 0; i < length; i++) {
row.createCell((short) i).setCellValue(content[i]);//写入列名词,每次循环写一个
}
//拿到路径
String s1 = new ApplicationHome(this.getClass()).getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\templateFiles\\";
//文件输出流,要求把文件写入s1 + fileName上。
FileOutputStream out = new FileOutputStream(new File(s1 + fileName));
//记得关闭流
wk.write(out);
out.close();
wk.close();
}
接下来完成第三步,也就是发送excel到前端,这就很简单了,我们只需要在工具类中继续去定义一个方法发送文件,而路径就是我们刚刚保存的路径。
上代码:
//fileName是该模板的名字。
public void send(HttpServletRequest request, HttpServletResponse response, String fileName) throws IOException {
//拿到模板所在的文件路径
String address = new ApplicationHome(this.getClass()).getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\templateFiles\\";
//拿到完整的路径
String fileNameAddress = address + fileName;
//String fileName = "用户信息模板.xlsx";
File file = new File(fileNameAddress);
//把文件写到输入流
InputStream inputStream = new FileInputStream(file);
//交给一个新创建的excel工作簿,内容为输入流的内容,也就是和要传输的模板内容一样
XSSFWorkbook xwb = new XSSFWorkbook(inputStream);
//3.将Excel文件通过Response输出到前端
OutputStream outputStream = response.getOutputStream();
// 清空response
response.reset();
//设置响应头
response.setContentType("application/msexcel;charset=UTF-8");
response.setCharacterEncoding("UTF-8"); //将服务器编码集设置为UTF-8
//一定要设置文件名是UTF-8,否则前端下载下来的文件名是乱码。
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
String origin = request.getHeader("Origin");
response.addHeader("Access-Control-Allow-Origin", origin);
//写出
xwb.write(outputStream);
}
记得先生成一个
public class ProvideTemplate_xlsx_Util {}
工具类