概要
POI是后端导出excel的常用插件
这里提供几个代码编写的建议和具体事例供参考
POI导入excel可见Spring使用POI导入excel 配合layui upload组件
建议
1.代码抽离封装
将一段逻辑代码封装成一个方法而不是所有代码全部写进一个方法中
2.样式设置和数据写入分离
不要一边写数据一边改样式,否则会有点混乱
3.推荐使用模板
本地新建一个excel(比如.xlsx)文件,设置好样式之后放在项目资源文件(resources)下
我们只需要填充数据或设置边框就好了
大大节省设置样式的功夫
4.前端请求格式
使用跳转而不能使用ajax
步骤
1.pom引入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- POI 分组维度导入使用 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
2.后端编写POIUtil类
这里我把他写成了service,而不是常量类
.xlsx使用
XSSFSheet XSSFWorkbook等
.xls使用
HSSFWorkbook HSSFSheet等
由于.xlsx现在使用的比较多所以选择这个
/**
* 导出套餐
*
*/
@Service
public class PoiUtil {
private static final Logger logger = LoggerFactory.getLogger(PoiUtil.class);
@Autowired
private BoPackageExtService boPackageExtService;
/**
* 导出会计科目.
* @throws Exception
*
*/
public void exportSubject(HttpServletRequest request, HttpServletResponse response) throws Exception {
//读取模版资源文件
ClassPathResource classPathResource = new ClassPathResource("templates\\excel\\export_package_template.xlsx");
File templateFile = classPathResource.getFile();
//生成工作簿
XSSFWorkbook workbook = new XSSFWorkbook(templateFile);
//新建工作表,获取第一张表(使用了模板所以如此创建)
XSSFSheet sheet = workbook.getSheetAt(0);
//文件名称
String fileName = URLEncoder.encode("套餐信息单", "UTF-8");
//获取数据list
List<BoPackage> boPackageList = boPackageExtService.getBoPackageList(request, response);
//写入数据
writeExportData(sheet, boPackageList);
//添加样式,数字代表的是共有7列
addBorderStyle(workbook, sheet, boPackageList.size(), 7);
//输出流
addResponseType(response, fileName);
try {
workbook.write(response.getOutputStream());
} catch (IOException e) {
logger.error("导出Excel错误!", e);
}
}
/**
* 给单元格添加边框样式.
*
* @param workbook
* @param sheet
* @param rowSize
* @param columnSize
*/
public void addBorderStyle(XSSFWorkbook workbook, XSSFSheet sheet, int rowSize, int columnSize) {
XSSFCellStyle style = workbook.createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
for (int i = 0; i < rowSize; i++) {
XSSFRow row = sheet.getRow(i + 2);
for (int j = 1; j < columnSize; j++) {
XSSFCell cell = row.getCell((short) j);
cell.setCellStyle(style);
}
}
}
/**
* 将导出套餐的数据写入excel.
*
* @param sheet
* @param boPackageList
*/
public void writeExportData(XSSFSheet sheet, List<BoPackage> boPackageList) {
//循环遍历填入数据
for (int i = 0; i < boPackageList.size(); i++) {
//创建行
XSSFRow row = sheet.createRow(i + 2);
//套餐码
XSSFCell subjectCodeCell = row.createCell((short) 1);
subjectCodeCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getPackageCode()));
//套餐名称
XSSFCell subjectNameCell = row.createCell((short) 2);
subjectNameCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getPackageName()));
//价格
XSSFCell subjectPriceCell = row.createCell((short) 3);
subjectPriceCell.setCellValue(new XSSFRichTextString(String.valueOf(boPackageList.get(i).getPackageValue())));
//类型
XSSFCell subjectTypeCell = row.createCell((short) 4);
subjectTypeCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getPackageType()));
//关于
XSSFCell subjectAboutCell = row.createCell((short) 5);
subjectAboutCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getAbout()));
//所属供应商
XSSFCell subjectProviderCell = row.createCell((short) 6);
subjectProviderCell.setCellValue(new XSSFRichTextString(boPackageList.get(i).getProviderName()));
}
}
/**
* 设置Excel输出格式.
*
* @param hsr
* @param fileName
*/
private void addResponseType(HttpServletResponse hsr, String fileName) {
hsr.setContentType("application/vnd.ms-excel; charset=UTF-8");
hsr.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
hsr.setBufferSize(1024);
}
}
3.接口编写
@RequestMapping("exportBoPackage")
public void exportBoPackage(HttpServletRequest request, HttpServletResponse response) {
try {
poiUtil.exportSubject(request, response);
} catch (Exception e) {
e.printStackTrace();
logger.error("导出Excel错误");
}
}
4.前端按钮点击跳转
必须使用跳转而不能是ajax请求
路径是请求的接口
var exportPackage = function () {
//不能使用ajax
//文件的下载是以二进制形式进行的,不是文本
window.location.href= $appRoot + "/bopackage/boPackageExt/exportBoPackage";
}
此时点击后就会下载文件
大功告成!