引入依赖
<!--POI-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
- 简单的实现Excel表格的导出
import com.entity.Question;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Test {
@org.junit.Test
//写
public void write() throws IOException {
//1.创建工作簿对象
XSSFWorkbook wb = new XSSFWorkbook();
//2.创建工作表名称
Sheet sheet = wb.createSheet("测试");
//3.创建工作表中的行对象,数据:从0开始
Row row = sheet.createRow(1);
//4.创建工作表中的列对象,数据:从0开始
Cell cell = row.createCell(1);
//5.在单元格写入数据
cell.setCellValue("测试数据");
//创建文件对象,作为工作簿内容的输出文件
File file = new File("test.xlsx");
//输出时通过流的形式对外输出
OutputStream os = new FileOutputStream(file);
//将内存中的wb数据写入到流中
wb.write(os);
//关闭
wb.close();
os.close();
}
@org.junit.Test
//读
public void read() throws IOException {
//1.从Excel文件中读取信息并转换为工作簿对象
XSSFWorkbook wb = new XSSFWorkbook("test.xlsx");
//2.获取工作表对象,数据:从0开始
Sheet sheet = wb.getSheetAt(0);
//3.获取工作表中的行对象,数据:从0开始
Row row = sheet.getRow(1);
//4.获取工作表中的列对象,数据:从0开始
Cell cell = row.getCell(1);
//5.根据数据类型获取数据
String s = cell.getStringCellValue();
System.out.println(s);
//关闭
wb.close();
}
@org.junit.Test
//导出
public void excel() throws IOException {
//1.创建工作簿对象
XSSFWorkbook wb = new XSSFWorkbook();
//2.创建工作表名称
Sheet s = wb.createSheet("导出题目");
//创建样式
XSSFCellStyle cs = wb.createCellStyle();
//水平对齐
cs.setAlignment(HorizontalAlignment.CENTER);
//垂直对齐
cs.setVerticalAlignment(VerticalAlignment.CENTER);
//设置表格线
cs.setBorderBottom(BorderStyle.THIN);
cs.setBorderTop(BorderStyle.THIN);
cs.setBorderLeft(BorderStyle.THIN);
cs.setBorderRight(BorderStyle.THIN);
//制作标题
//1.创建工作表中的行对象,数据:从0开始
Row row_0 = s.createRow(0);
//2.创建工作表中的列对象,数据:从0开始
Cell cell_0_0 = row_0.createCell(0);
//3.在单元格写入数据
cell_0_0.setCellValue("导出题目数据");
//4.合并单元格
s.addMergedRegion(new CellRangeAddress(0, 0, 0, 12));
//5.设置单元格样式
cell_0_0.setCellStyle(cs);
//制作表头
//字段
String[] fields = {"题目ID", "所属公司ID", "所属目录ID", "题目简介", "题干描述",
"题干配图", "题目分析", "题目类型", "题目难度", "是否经典题", "题目状态", "审核状态"};
//创建工作表中的行对象,数据:从0开始
Row row_1 = s.createRow(1);
for (int i = 0; i < fields.length; i++) {
//创建工作表中的列对象,数据:从0开始
Cell cell_1_temp = row_1.createCell(0 + i);
//在单元格写入数据
cell_1_temp.setCellValue(fields[i]);
//设置单元格样式
cell_1_temp.setCellStyle(cs);
}
//制作数据区
//字段
List<Question> questionList = new ArrayList<>();
//模拟数据
Question qq = new Question();
qq.setId("1");
qq.setPicture("12");
qq.setReviewStatus("13");
qq.setAnalysis("14");
qq.setCatalogId("15");
qq.setCompanyId("16");
qq.setDifficulty("17");
qq.setIsClassic("18");
qq.setRemark("19");
qq.setState("21");
qq.setSubject("31");
qq.setType("41");
questionList.add(qq);
Question qqq = new Question();
qqq.setId("1");
qqq.setPicture("12");
qqq.setReviewStatus("13");
qqq.setAnalysis("14");
qqq.setCatalogId("15");
qqq.setCompanyId("16");
qqq.setDifficulty("17");
qqq.setIsClassic("18");
qqq.setRemark("19");
qqq.setState("21");
qqq.setSubject("31");
qqq.setType("41");
questionList.add(qqq);
//设置行下标
int row_index = 0;
for (Question q : questionList) {
//设置列下标
int cell_index = 0;
//创建工作表中的行对象,数据:从0开始
Row row_temp = s.createRow(2 + row_index++);
//创建工作表中的列对象,数据:从0开始
Cell cell_data_1 = row_temp.createCell(0 + cell_index++);
//在单元格写入数据
cell_data_1.setCellValue(q.getId());
//设置单元格样式/
cell_data_1.setCellStyle(cs);
Cell cell_data_2 = row_temp.createCell(0 + cell_index++);
cell_data_2.setCellValue(q.getCompanyId());
cell_data_2.setCellStyle(cs);
Cell cell_data_3 = row_temp.createCell(0 + cell_index++);
cell_data_3.setCellValue(q.getCatalogId());
cell_data_3.setCellStyle(cs);
Cell cell_data_4 = row_temp.createCell(0 + cell_index++);
cell_data_4.setCellValue(q.getRemark());
cell_data_4.setCellStyle(cs);
Cell cell_data_5 = row_temp.createCell(0 + cell_index++);
cell_data_5.setCellValue(q.getSubject());
cell_data_5.setCellStyle(cs);
Cell cell_data_6 = row_temp.createCell(0 + cell_index++);
cell_data_6.setCellValue(q.getPicture());
cell_data_6.setCellStyle(cs);
Cell cell_data_7 = row_temp.createCell(0 + cell_index++);
cell_data_7.setCellValue(q.getAnalysis());
cell_data_7.setCellStyle(cs);
Cell cell_data_8 = row_temp.createCell(0 + cell_index++);
cell_data_8.setCellValue(q.getType());
cell_data_8.setCellStyle(cs);
Cell cell_data_9 = row_temp.createCell(0 + cell_index++);
cell_data_9.setCellValue(q.getDifficulty());
cell_data_9.setCellStyle(cs);
Cell cell_data_10 = row_temp.createCell(0 + cell_index++);
cell_data_10.setCellValue(q.getIsClassic());
cell_data_10.setCellStyle(cs);
Cell cell_data_11 = row_temp.createCell(0 + cell_index++);
cell_data_11.setCellValue(q.getState());
cell_data_11.setCellStyle(cs);
Cell cell_data_12 = row_temp.createCell(0 + cell_index++);
cell_data_12.setCellValue(q.getReviewStatus());
cell_data_12.setCellStyle(cs);
}
//创建文件对象,作为工作簿内容的输出文件
File file = new File("test.xlsx");
//输出时通过流的形式对外输出
OutputStream os = new FileOutputStream(file);
//将内存中的wb数据写入到流中
wb.write(os);
//关闭
wb.close();
os.close();
}
}
- 结合功能实现Excel表格的导出
//下载Excel
private void downloadReport(HttpServletRequest request, HttpServletResponse response) throws IOException {
//返回的数据类型为文件xlsx类型
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
//设置Excel名称
String fileName = new String("测试文件名.xlsx".getBytes(), "iso8859-1");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
//生成报告的文件,然后传递到前端页面
ByteArrayOutputStream os = questionService.getReport();
//获取产生响应的流对象
ServletOutputStream sos = response.getOutputStream();
//将数据从原始的字节流对象中提取出来写入到servlet对应的输出流中
os.writeTo(sos);
//将输出流刷新
sos.flush();
os.close();
}
public ByteArrayOutputStream getReport() throws IOException {
SqlSession sqlSession = null;
//获取对应要展示的数据
List<Question> questionList = null;
try {
//1.获取SqlSession
sqlSession = MapperFactory.getSqlSession();
//2.获取Dao
QuestionDao questionDao = MapperFactory.getMapper(sqlSession, QuestionDao.class);
//3.调用Dao层操作
questionList = questionDao.findAll();
} catch (Exception e) {
throw new RuntimeException(e);
//记录日志
} finally {
try {
TransactionUtil.close(sqlSession);
} catch (Exception e) {
e.printStackTrace();
}
}
//1.创建工作簿对象
XSSFWorkbook wb = new XSSFWorkbook();
//2.创建工作表名称
Sheet s = wb.createSheet("导出题目");
//创建样式
XSSFCellStyle cs = wb.createCellStyle();
//水平对齐
cs.setAlignment(HorizontalAlignment.CENTER);
//垂直对齐
cs.setVerticalAlignment(VerticalAlignment.CENTER);
//设置表格线
cs.setBorderBottom(BorderStyle.THIN);
cs.setBorderTop(BorderStyle.THIN);
cs.setBorderLeft(BorderStyle.THIN);
cs.setBorderRight(BorderStyle.THIN);
//制作标题
//1.创建工作表中的行对象,数据:从0开始
Row row_0 = s.createRow(0);
//2.创建工作表中的列对象,数据:从0开始
Cell cell_0_0 = row_0.createCell(0);
//3.在单元格写入数据
cell_0_0.setCellValue("导出题目数据");
//4.合并单元格
s.addMergedRegion(new CellRangeAddress(0, 0, 0, 12));
//5.设置单元格样式
cell_0_0.setCellStyle(cs);
//制作表头
//字段
String[] fields = {"题目ID", "所属公司ID", "所属目录ID", "题目简介", "题干描述",
"题干配图", "题目分析", "题目类型", "题目难度", "是否经典题", "题目状态", "审核状态"};
//创建工作表中的行对象,数据:从0开始
Row row_1 = s.createRow(1);
for (int i = 0; i < fields.length; i++) {
//创建工作表中的列对象,数据:从0开始
Cell cell_1_temp = row_1.createCell(0 + i);
//在单元格写入数据
cell_1_temp.setCellValue(fields[i]);
//设置单元格样式
cell_1_temp.setCellStyle(cs);
}
//制作数据区
//设置行下标
int row_index = 0;
//循环数据
for (Question q : questionList) {
//设置列下标
int cell_index = 0;
//创建工作表中的行对象,数据:从0开始
Row row_temp = s.createRow(2 + row_index++);
//创建工作表中的列对象,数据:从0开始
Cell cell_data_1 = row_temp.createCell(0 + cell_index++);
//在单元格写入数据
cell_data_1.setCellValue(q.getId());
//设置单元格样式/
cell_data_1.setCellStyle(cs);
Cell cell_data_2 = row_temp.createCell(0 + cell_index++);
cell_data_2.setCellValue(q.getCompanyId());
cell_data_2.setCellStyle(cs);
Cell cell_data_3 = row_temp.createCell(0 + cell_index++);
cell_data_3.setCellValue(q.getCatalogId());
cell_data_3.setCellStyle(cs);
Cell cell_data_4 = row_temp.createCell(0 + cell_index++);
cell_data_4.setCellValue(q.getRemark());
cell_data_4.setCellStyle(cs);
Cell cell_data_5 = row_temp.createCell(0 + cell_index++);
cell_data_5.setCellValue(q.getSubject());
cell_data_5.setCellStyle(cs);
Cell cell_data_6 = row_temp.createCell(0 + cell_index++);
cell_data_6.setCellValue(q.getPicture());
cell_data_6.setCellStyle(cs);
Cell cell_data_7 = row_temp.createCell(0 + cell_index++);
cell_data_7.setCellValue(q.getAnalysis());
cell_data_7.setCellStyle(cs);
Cell cell_data_8 = row_temp.createCell(0 + cell_index++);
cell_data_8.setCellValue(q.getType());
cell_data_8.setCellStyle(cs);
Cell cell_data_9 = row_temp.createCell(0 + cell_index++);
cell_data_9.setCellValue(q.getDifficulty());
cell_data_9.setCellStyle(cs);
Cell cell_data_10 = row_temp.createCell(0 + cell_index++);
cell_data_10.setCellValue(q.getIsClassic());
cell_data_10.setCellStyle(cs);
Cell cell_data_11 = row_temp.createCell(0 + cell_index++);
cell_data_11.setCellValue(q.getState());
cell_data_11.setCellStyle(cs);
Cell cell_data_12 = row_temp.createCell(0 + cell_index++);
cell_data_12.setCellValue(q.getReviewStatus());
cell_data_12.setCellStyle(cs);
}
//将内存中的wb数据写入到流中
ByteArrayOutputStream os = new ByteArrayOutputStream();
wb.write(os);
wb.close();
return os;
}