使用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表格了。
上述如果有不准确,或需要改进的地方,麻烦路过的大佬指点一番