使用Java将项目中的数据导出为Excel表格

使用Java代码导出Excel表格

由于工作中的需求,需要把一些数据导出来跟标准结果进行对比,在网上搜索的一些将JSON转换为Excel的在线工具又无法转换太过复杂的数据结构,不能满足我的要求。还是自己动手吧。

首先导包

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.15</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.15</version>
    </dependency>

首先设置表格属性

 HSSFWorkbook wb = new HSSFWorkbook();
 HSSFFont font = wb.createFont();
 font.setColor(HSSFFont.COLOR_NORMAL);
 font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
 HSSFCellStyle style = wb.createCellStyle();
 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
 style.setFont(font); // 设置字体

之后从HSSFWorkbook对象中获取sheet对象

HSSFSheet sheet = wb.getSheet(name);
rowIndex = 0;
if (sheet == null){
    sheet = wb.createSheet(name);
}

下一步就可以开始将对象拆分输出到表格里了

/**
形参:
resultObject为需要进行转换的对象,
sheet是转换成功的数据输出的对象,
cellIndex是记录列数的参数,调用此方法是,如果是首次调用传入0就可以。
全局变量:
rowIndex记录行数的变量,在每使用一个新的sheet记录数据时,需要清空为0,
style为单元格样式
**/
public void writeExcel(Object resultObject, HSSFSheet sheet, int cellIndex){

HSSFRow row = sheet.getRow(rowIndex);
if (row == null){
    row = sheet.createRow(rowIndex);
}
HSSFCell cell = row.getCell(cellIndex);
if (cell == null){
    row.createCell(cellIndex);
    cell = row.createCell(cellIndex);
    cell.setCellStyle(style);
}

if (resultObject != null){
    if (resultObject instanceof Integer){
       cell.setCellValue(((Integer) resultObject).intValue());
       cellIndex++;
    } else if (resultObject instanceof Long){
       cell.setCellValue(((Long) resultObject).longValue());
       cellIndex++;
    }else if (resultObject instanceof String){
       cell.setCellValue(resultObject.toString());
       cellIndex++;
    } else if(resultObject instanceof Boolean){
       cell.setCellValue(((Boolean) resultObject).booleanValue());
       cellIndex++;
    } else if (resultObject instanceof List){
       Iterator iterator = ((List) resultObject).iterator();
       while(iterator.hasNext()){
           Object next = iterator.next();
           writeExcel(next, sheet, cellIndex);
           rowIndex++;
       }
    } else if (resultObject instanceof Map){
       for (Map.Entry<String, Object> entry : ((Map<String, Object>) resultObject).entrySet()){
           String key = entry.getKey();
           writeExcel(key, sheet, cellIndex);
           cellIndex++;
           Object next = entry.getValue();
           writeExcel(next, sheet, cellIndex);
           cellIndex--;
           rowIndex++;
       }
    } else if (resultObject instanceof Set){
       Iterator iterator = ((Set) resultObject).iterator();

       while (iterator.hasNext()){
           Object next = iterator.next();
           writeExcel(next, sheet, cellIndex);
           rowIndex++;
       }
    } else if (resultObject.getClass().isArray()){

       for (int i=0; i<Array.getLength(resultObject); i++){
         Object next = Array.get(resultObject, i);
         writeExcel(next, sheet, cellIndex);
         rowIndex++;
       }
    } else{
       Class<?> aClass = resultObject.getClass();
       Field[] fields = aClass.getDeclaredFields();
       for (Field field : fields){
           field.setAccessible(true);
           try {
            Object param = field.get(resultObject);
            writeExcel(param, sheet, cellIndex);
            cellIndex++;
           } catch (IllegalAccessException e) {
               e.printStackTrace();
           }
       }
    }
}
}

因为个人需求,只写了int(Integer)、long(Long)、String、Map、Set、List、还有其他自定义对象的转换,其他基本数据类型以及没有了解过的一些数据类型没有考虑到其中,不过原理是一样的,大家自用自填

最后写出到表格中

File resultFile = new File("log/TestResult.xls");

try {
    if (!resultFile.exists()) {
        resultFile.createNewFile();
    }
    FileOutputStream fileOutputStream = new FileOutputStream(resultFile);
    wb.write(fileOutputStream);
} catch (IOException e) {
    e.printStackTrace();
}

大功告成,Synchronize一下,就可以看到新鲜出炉的Excel表格了。

上述如果有不准确,或需要改进的地方,麻烦路过的大佬指点一番

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值