关于:java中poi导出对象到excel中,日期格式属性,后面几行变成数字

导出对象数据到excel中,发现从45行开始,日期数据变成了天数,

代码:

 public static void writeExcel(List list,File file)throws Exception{
   //反射获取list中对象类型
   Class cla = list.get(0).getClass();
   //创建book
   HSSFWorkbook book = new HSSFWorkbook();
   //创建sheet
   HSSFSheet sheet = book.createSheet(cla.getSimpleName());
   //创建第一行,即标题行
   HSSFRow row1 = sheet.createRow(0);
   //给标题行的每个单元格写入标题
   Field[] fields = cla.getDeclaredFields();
   for (int i = 0; i < fields.length; i++) {
     String fieldName = fields[i].getName();
     HSSFCell celli = row1.createCell(i);
     celli.setCellValue(fieldName);
  }
   //创建数据行
   for (int i = 0; i < list.size(); i++) {
     HSSFRow rowi1 = sheet.createRow(i+1);
     //创建行内单元格
     for (int j = 0; j < fields.length; j++) {
       HSSFCell cellij = rowi1.createCell(j);
       //给单元格设置内容
       fields[j].setAccessible(true);
       Object fieldValue = fields[j].get(list.get(i));
       //对日期进行格式转换
       if (fields[j].getType()==Date.class) {
         //指定单元格数据格式是日期
         // CellStyle styleDate=book.createCellStyle();
         //       styleDate.setDataFormat(book.createDataFormat().getFormat("yyyy年MM月dd日"));
         cellij.setCellStyle(styleDate);
         cellij.setCellValue((Date)fieldValue);
      }else{
         cellij.setCellValue(fieldValue+"");
      }
    }
  }
   //把内存的book写到目的文件中
   book.write(file);
 }

效果:

 

 网上查询找出问题,CellStyle styleDate=book.createCellStyle();此代码创建的CellStyle对象太多,导致导出的文件出现问题,

解决方案:将代码

CellStyle styleDate=book.createCellStyle();
styleDate.setDataFormat(book.createDataFormat().getFormat("yyyy年MM月dd日"));

移动到循环外,只创建一个,多次使用,即可解决问题

public static void writeExcel(List list,File file)throws Exception{
        //反射获取list中对象类型
        Class cla = list.get(0).getClass();
        //创建book
        HSSFWorkbook book = new HSSFWorkbook();
        //创建sheet
        HSSFSheet sheet = book.createSheet(cla.getSimpleName());
        //创建第一行,即标题行
        HSSFRow row1 = sheet.createRow(0);
        //给标题行的每个单元格写入标题
        Field[] fields = cla.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            String fieldName = fields[i].getName();
            HSSFCell celli = row1.createCell(i);
            celli.setCellValue(fieldName);
        }
        //创建日期的数据格式,只创建一个,在下面循环中多次使用,因为多次循环创建,导致创建过多,无法使用
        CellStyle styleDate=book.createCellStyle();
        styleDate.setDataFormat(book.createDataFormat().getFormat("yyyy年MM月dd日"));
        //创建数据行
        for (int i = 0; i < list.size(); i++) {
            HSSFRow rowi1 = sheet.createRow(i+1);
            //创建行内单元格
            for (int j = 0; j < fields.length; j++) {
                HSSFCell cellij = rowi1.createCell(j);
                //给单元格设置内容
                fields[j].setAccessible(true);
                Object fieldValue = fields[j].get(list.get(i));
                //对日期进行格式转换
                if (fields[j].getType()==Date.class) {
                    //指定单元格数据格式是日期
//                    CellStyle styleDate=book.createCellStyle();
//                    styleDate.setDataFormat(book.createDataFormat().getFormat("yyyy年MM月dd日"));
                    cellij.setCellStyle(styleDate);
                    cellij.setCellValue((Date)fieldValue);
                }else{
                    cellij.setCellValue(fieldValue+"");
                }
            }
        }
        //把内存的book写到目的文件中
        book.write(file);
    }

效果:

 

 


                   

posted @ 2023-02-11 14:23  许多多被注册了  阅读(839)  评论(0编辑  收藏  举报