一、需求
要求excel导出时,对应列里面的内容格式为日期,数值格式并有精度要求 ,如下图:
使用alibaba,easyexcel,默认的导出数据格式为文本,excel显示为常规,使用数据规范注解@NumberFormat一直不生效,无奈选择原生的apache.poi。
二、具体实现
public void writePoi(List<Export> exportList) {// 1.在内存中创建一个excel文件,excel2003之前版本使用HSSFWorkbook,之后版本使用XSSFWorkbookHSSFWorkbook workbook = new HSSFWorkbook();
// XSSFWorkbook workbook = new XSSFWorkbook();// 2.创建工作簿HSSFSheet sheet = workbook.createSheet("已开具发票");//设置列宽sheet.setDefaultColumnWidth(15);// 3.创建标题行HSSFRow titlerRow = sheet.createRow(0);titlerRow.createCell(0).setCellValue("开票日期");titlerRow.createCell(1).setCellValue("发票号码");titlerRow.createCell(2).setCellValue("购方税号");titlerRow.createCell(3).setCellValue("购方名称");titlerRow.createCell(4).setCellValue("规格型号");titlerRow.createCell(5).setCellValue("计量单位");titlerRow.createCell(6).setCellValue("单价");titlerRow.createCell(7).setCellValue("数量");titlerRow.createCell(8).setCellValue("金额");titlerRow.createCell(9).setCellValue("税额");//4.设置需要的格式DataFormat dataFormat = workbook.createDataFormat();CellStyle dateStyle = workbook.createCellStyle();dateStyle.setDataFormat(dataFormat.getFormat("yyyy-m-d;@")); // 设置日期格式,注意日期格式规范之后不会直接显示单元格式为日期,但是使用筛选功能时可以按照日期范围进行筛选。dateStyle.setAlignment(HorizontalAlignment.CENTER); // 设置水平居中CellStyle doubleStyle = workbook.createCellStyle();doubleStyle.setDataFormat(dataFormat.getFormat("0.00_ ")); // 设置数值格式doubleStyle.setAlignment(HorizontalAlignment.CENTER); // 设置水平居中CellStyle floatStyle = workbook.createCellStyle();floatStyle.setDataFormat(dataFormat.getFormat("0.00000000_ ")); // 设置单价格式floatStyle.setAlignment(HorizontalAlignment.CENTER); // 设置水平居中// 5.遍历数据,创建数据行for (Export export : exportList) {// 获取最后一行的行号int lastRowNum = sheet.getLastRowNum();// 添加新行HSSFRow dataRow = sheet.createRow(lastRowNum + 1);HSSFCell hssfCell0 = dataRow.createCell(0);hssfCell0.setCellStyle(dateStyle);hssfCell0.setCellValue(export.getKprq());dataRow.createCell(1).setCellValue(export.getFphm());dataRow.createCell(2).setCellValue(export.getGfsh());dataRow.createCell(3).setCellValue(export.getGfmc());dataRow.createCell(4).setCellValue(export.getGgxh());dataRow.createCell(5).setCellValue(export.getJldw());HSSFCell hssfCell6 = dataRow.createCell(6);hssfCell6.setCellStyle(floatStyle);hssfCell6.setCellValue(export.getDj());HSSFCell hssfCell7 = dataRow.createCell(7);hssfCell7.setCellStyle(doubleStyle);hssfCell7.setCellValue(export.getSl());HSSFCell hssfCell8 =dataRow.createCell(8);hssfCell8.setCellStyle(doubleStyle);hssfCell8.setCellValue(export.getJe());HSSFCell hssfCell9 =dataRow.createCell(9);hssfCell9.setCellStyle(doubleStyle);hssfCell9.setCellValue(export.getSe());}// 设置自适应列宽for (int i = 0; i < sheet.getRow(0).getLastCellNum(); i++) {sheet.autoSizeColumn(i);}// 5.创建文件名String fileName = "已开发票明细导出_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xls";// 6.获取输出流对象OutputStream outputStream;try {outputStream = new FileOutputStream(excelFilePath + "\\" + fileName);// 7.写出文件,关闭流workbook.write(outputStream);workbook.close();outputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
注:数据规范所需的format规则可从excel中的格式设置看到,具体步骤为:
右键单击单元格,选择设置单元格格式,1选择你需要的格式,2设定好精度,
3直接点击自定义,即可看到format规范,注意数值格式的规范后面必须有一个空格,否则不生效,可以看到下图的下划线与光标之间是有一个空格的。