目录
HttpServletRequest、HttpServletResponse介绍
Apache POI介绍
Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。
基于SpringBoot的Web项目使用POI用于excel表格的读取\创建首先需要在pom文件中引入maven坐标:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
实现步骤
- 构造excel表格数据。
- 创建工作薄,工作薄可以根据输入流进行创建指定模板的工作薄,也可以创建空的工作薄。
- XSSFWorkbook excel = new XSSFWorkbook(inputStream); 根据指定输入流创建工作薄。
- XSSFWorkbook excel = new XSSFWorkbook(); 创建一个空的工作薄。
- 根据创建的工作薄对象创建sheet页;如果创建指定模板的工作薄,此处为获取sheet页。
- XSSSheet = excel.creatSheet("name"); 创建名为name的sheet页。
- XSSSheet = excel.getSheetAt(0); 获取第一页。
- 创建行对象、获取行对象。
- XSSFRow row1 = sheet.createRow(0); 创建第一行。
- XSSFRow row1 = sheet.get(0); 获取行对象。
- 创建单元格对象、获取单元格对象。
- row2.createCell(1).setCellValue("张三");
- row2.getCell(1).setCellValue("张三");
- 填充数据。
- 通过输出流发送excel文件给客户端。
利用POI向excel写数据Demo
public class POITest {
/**
* 基于POI向Excel文件写入数据
* @throws Exception
*/
public static void write() throws Exception{
//在内存中创建一个Excel文件对象
XSSFWorkbook excel = new XSSFWorkbook();
//创建Sheet页
XSSFSheet sheet = excel.createSheet("itcast");
//在Sheet页中创建行,0表示第1行
XSSFRow row1 = sheet.createRow(0);
//创建单元格并在单元格中设置值,单元格编号也是从0开始,1表示第2个单元格
row1.createCell(1).setCellValue("姓名");
row1.createCell(2).setCellValue("城市");
XSSFRow row2 = sheet.createRow(1);
row2.createCell(1).setCellValue("张三");
row2.createCell(2).setCellValue("北京");
XSSFRow row3 = sheet.createRow(2);
row3.createCell(1).setCellValue("李四");
row3.createCell(2).setCellValue("上海");
FileOutputStream out = new FileOutputStream(new File("D:\\itcast.xlsx"));
//通过输出流将内存中的Excel文件写入到磁盘上
excel.write(out);
//关闭资源
out.flush();
out.close();
excel.close();
}
public static void main(String[] args) throws Exception {
write();
}
}
利用POI读取excel表格数据Demo
public class POITest {
/**
* 基于POI读取Excel文件
* @throws Exception
*/
public static void read() throws Exception{
FileInputStream in = new FileInputStream(new File("D:\\itcast.xlsx"));
//通过输入流读取指定的Excel文件
XSSFWorkbook excel = new XSSFWorkbook(in);
//获取Excel文件的第1个Sheet页
XSSFSheet sheet = excel.getSheetAt(0);
//获取Sheet页中的最后一行的行号
int lastRowNum = sheet.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
//获取Sheet页中的行
XSSFRow titleRow = sheet.getRow(i);
//获取行的第2个单元格
XSSFCell cell1 = titleRow.getCell(1);
//获取单元格中的文本内容
String cellValue1 = cell1.getStringCellValue();
//获取行的第3个单元格
XSSFCell cell2 = titleRow.getCell(2);
//获取单元格中的文本内容
String cellValue2 = cell2.getStringCellValue();
System.out.println(cellValue1 + " " +cellValue2);
}
//关闭资源
in.close();
excel.close();
}
public static void main(String[] args) throws Exception {
read();
}
}
HttpServletRequest、HttpServletResponse介绍
HttpServletRequest:
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
HttpServletResponse:
HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置。
功能实现
通过HttpServletResponse的方法getOutputStream(...)能够获取到输出字节流,从而实现服务端内存中创建的excel文件由服务端到浏览器的传递。
通过类加载器获取到对应文件的输入流,通过指定的输入流创建特定的工作薄对象,完成业务操作后,通过HttpServletRespond创建输出流,将excel对象通过输出流返回给客户端。
实现步骤:
- 通过this指针获取到对应的字节码文件,随后获取到类加载器,获取对应路径下excel模板文件的输入流。
- 选取XSS类型创建.xlsx类型的excel文件,获取excel文件中的sheet页,随后获取行并获取对应的单元格调用setCellValue(...)方法向单元格写入内容。
- 通过服务器创建的HttpServletResponse中的getOutputStream(...)方法获取到对应的输出流字节流。
- 调用excel.write(outputStream)将excel文件从服务端传向浏览器页面。
/**
* 导出报表数据
* @param response
*/
@Override
public void exportBusinessData(HttpServletResponse response) {
// 查找最近一个月的数据
LocalDate endDate = LocalDate.now().minusDays(1);
LocalDate beginDate = LocalDate.now().minusDays(30);
// 查找相应数据
BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(beginDate, LocalTime.MIN), LocalDateTime.of(endDate, LocalTime.MAX));
// 获取输入流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
try {
// 创建excel模板对象
XSSFWorkbook excel = new XSSFWorkbook(inputStream);
// 获取sheet页
XSSFSheet sheet = excel.getSheetAt(0);
// 写入获取数据时间
sheet.getRow(1).getCell(1).setCellValue("运营时间:" + beginDate + "至" + endDate);
// 获取第四行
XSSFRow row = sheet.getRow(3);
row.getCell(2).setCellValue(businessData.getTurnover());
row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
row.getCell(6).setCellValue(businessData.getNewUsers());
row = sheet.getRow(4);
row.getCell(2).setCellValue(businessData.getValidOrderCount());
row.getCell(4).setCellValue(businessData.getUnitPrice());
// 完成每日报单填写
for (int i = 0; i < 30; i++) {
LocalDateTime beginTime = LocalDateTime.of(beginDate, LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(beginDate, LocalTime.MAX);
// 查找每日对应数据
businessData = workspaceService.getBusinessData(beginTime, endTime);
// 填充excel表格
sheet.getRow(7 + i).getCell(1).setCellValue(String.valueOf(beginDate));
sheet.getRow(7 + i).getCell(2).setCellValue(businessData.getTurnover());
sheet.getRow(7 + i).getCell(3).setCellValue(businessData.getValidOrderCount());
sheet.getRow(7 + i).getCell(4).setCellValue(businessData.getOrderCompletionRate());
sheet.getRow(7 + i).getCell(5).setCellValue(businessData.getUnitPrice());
sheet.getRow(7 + i).getCell(6).setCellValue(businessData.getNewUsers());
beginDate = beginDate.plusDays(1);
}
// 获取输出流
ServletOutputStream outputStream = response.getOutputStream();
excel.write(outputStream);
// 关闭资源
inputStream.close();
outputStream.close();
excel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
参考链接
HttpServletResponse类的介绍和使用+解决响应传递给客户端数据的中文乱码问题_response写流到客户端-CSDN博客