赞
踩
- <!-- 解析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>
其实就是后端自己生成一个excel,然后填写模板信息,最后发送给前端即可。但是这里需要考虑一个问题,其实我们没有必要每接收一个请求就完成一次1、2步骤,所以我们完全可以自己写一个模板,然后保存在服务器中,用户请求我们把文件发给他即可。
难点在于我们需要把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 {}
工具类
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。