使用maven插件poi-ooxml,似乎还有其他的版本,但是我记忆中这个可以处理xls和xlsx两种格式的excel
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
这是导入的包路径,写出导入的路径还是很有必要的,我在看别人博客时常常会发现因为导入的类不同导致根本没法重现别人的代码,HSSFWorkbook是主要的类,其他的都是用这个创建的,
结构如下
HSSFWorkbook整个excel对象
sheet excel标签
Row 行
cell 格
其他的就不展开了,结构还是很清楚的
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
HSSFWorkbook getWorkbook(String userId, String companyId, String importId) {
List<BaseExcelImportDetailModel> detailList = baseExcelImportDetailDao.findByImportId(importId);
HSSFWorkbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Row row2 = sheet.createRow(1);
int i = 0;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
for(BaseExcelImportDetailModel detail : detailList){
Cell cell = row.createCell(i);
Cell cell2 = row2.createCell(i);
sheet.setColumnWidth(i, 15 * 256);
if(!StringUtils.isEmpty(detail.getColumnName())) {
cell.setCellValue(detail.getColumnName());
}else if(!StringUtils.isEmpty(detail.getFieldRemark())) {
cell.setCellValue(detail.getFieldRemark());
}else {
cell.setCellValue(detail.getFieldName());
}
if(0 == detail.getDataType()) {//字符串
cell2.setCellValue("");
}else if(1 == detail.getDataType()) {//数字
cell2.setCellValue(0);
}else if(2 == detail.getDataType()) {//日期
cell2.setCellValue(sdf.format(new Date()));
}else if(3 == detail.getDataType()) {//外键
cell2.setCellValue("");
}else if(4 == detail.getDataType()) {//唯一识别
cell2.setCellValue("");
}
i++;
}
return wb;
}
然后通过response拿到输出流,这个大家应该都会
HSSFWorkbook wb = getWorkbook(userId, companyId, importId);
OutputStream os = response.getOutputStream();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel;charset=utf-8");// 设置contentType为excel格式
response.setHeader("Content-Disposition", "Attachment;Filename="+ new String(excelImport.getImportFileName().getBytes("UTF-8"), "ISO8859-1")+".xls");
wb.write(os);
os.close();
特别注意的是,文件名如果直接传中文会乱码或者直接就没了(我是直接就没了),所以用下面这种就不会乱码了
new String(fileName.getBytes("UTF-8"), "ISO8859-1")
这是后台,前台只要用一个a标签访问这个路径就可以了,或者window.location.href应该也是可以的