我是基于POI进行导出的。
首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用POI导出一个Excel表格的顺序应该是:
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象row,用行对象得到Cell对象
4、对Cell对象读写。
我是先获取数据,写入一个二维数组中,然后传给excel工具类,将标题也传给工具类,由工具类创建excel并写入excel,之后压缩,最后删除excel,保留压缩文件。
导出Excel应用实例:
工具类代码:
package cn.com.dhcc.baihangcreditcommon.util;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ExcelUtil {
public static void getExcel(String excelFileName,String []titles,String [][]values){
try {
//1. 创建Excel对象
// .xls HSSFWorkbook
// .xlsx XSSFWorkbook
Workbook workbook = new HSSFWorkbook();
// 设置单元格的日期样式
CellStyle cellStyle = workbook.createCellStyle();
CreationHelper creationHelper = workbook.getCreationHelper();
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd"));
// 创建一个居中格式
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
// 2. 创建工作页对象
Sheet sheet = workbook.createSheet(Constant.SHEET_NAME);
// 3. 创建行对象
Row row = sheet.createRow(0);
// 4. 声明列对象
Cell cell = null;
// 5. 标题
for (int i = 0; i < titles.length; i++) {
cell = row.createCell(i);
cell.setCellValue(titles[i]);
cell.setCellStyle(cellStyle);
}
// 6. 单元格的内容
for(int i=0 ; i < values.length ; i++){
row = sheet.createRow(i + 1);
for(int j=0 ; j < values[i].length ; j++){
//将内容按顺序赋给对应的列对象
row.createCell(j).setCellValue(values[i][j]);
}
}
// 5. 创建Excel文件
// 文件路径+文件名
String filePathName = XXX + "\\" + excelFileName;
// 写入
File file = new File(filePathName);
// 如果文件路径不存在,则创建
if (!file.exists()) {
file.getParentFile().mkdirs();
}
FileOutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
// 关闭流,否则文件不能删除
outputStream.close();
log.info("生成excel成功,{}" , filePathName);
// 6. 压缩excel
// 要生成的压缩文件名
String zipFileName = excelFileName.replaceAll(".xls", ".zip");
// 压缩文件的文件路径+文件名
String zipFilePathName = XXX + "\\" + zipFileName;
ZipUtils.zipCompress(zipFilePathName , file);
// 删除excel文件
boolean b = file.delete();
if(b == false){
log.info("{}删除失败" , filePathName);
}else{
log.info("{}删除成功" , filePathName);
}
} catch (Exception e) {
log.info("生成excel出现异常");
e.printStackTrace();
}
}
}
调用:
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@SuppressWarnings("null")
private void getBsInErr(List<String> filenameList){
// Excel的标题
String[] titles = Constant.EXCEL_TITLE;
for (String filename : filenameList) {
List<BSinerr> bSinErrs = bsInErrDao.getBSinErrByFileName(filename);
if(null == bSinErrs || bSinErrs.size() == 0){
// 该类型没有可以下载的错误信息
log.info("{},没有错误信息" , filename);
continue;
}
// excel文件名
String excelFileName = filename.replaceAll(".txt", "Err.xls");
String[][] content =new String[bSinErrs.size()][titles.length];
// 为单元格赋值
for (int i = 0; i < bSinErrs.size(); i++) {
BSinerr bSinerr = bSinErrs.get(i);
// 数据类型
content[i][0] = bSinerr.getDataType();
// 错误时间
Date errTime = bSinerr.getErrTime();
content[i][1] = sdf.format(errTime);
// 文件名
content[i][2] = bSinerr.getFileName();
// 错误行数
Long lineNo = bSinerr.getLineNo();
content[i][3] = String.valueOf(lineNo);
// REQ_ID
content[i][4] = bSinerr.getReqID();
// 数据项
content[i][5] = bSinerr.getFieldID();
// 错误值
content[i][6] = bSinerr.getFieldValue();
// 错误代码
content[i][7] = bSinerr.getErrCode();
// 错误信息
BSerrDic bsErrDic = bsErrDicDao.getBsErrDicByErrCode(bSinerr.getErrCode());
content[i][8] = bsErrDic.getErrMsg();
// 法人机构
content[i][9] = bSinerr.getOrgEntity();
}
// 生成excel
ExcelUtil.getExcel(excelFileName,titles, content);
}
}