Java实现数据Excel表格导出

/**
 * 创建excel文档, list 数据
 * 
 * @param keys
 *            list中map的key数组集合
 * @param columnNames
 *            excel的列名
 */
@SuppressWarnings("static-access")
public static Workbook createWorkBook(List<Map<String, Object>> list, String[] keys, String columnNames[]) {
// 创建excel工作簿
HSSFWorkbook wb = new HSSFWorkbook();

//设置单元格格式
HSSFCellStyle contextstyle = wb.createCellStyle();

// 创建第一个sheet(页),并命名
Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
// 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
for (int i = 0; i < keys.length; i++) {
sheet.setColumnWidth((short) i, (short) (35.7 * 150));
}

// 创建第一行
Row row = sheet.createRow((short) 0);

// 创建两种单元格格式
CellStyle cs = wb.createCellStyle();
CellStyle cs2 = wb.createCellStyle();

// 创建两种字体
Font f = wb.createFont();
Font f2 = wb.createFont();

// 创建第一种字体样式(用于列名)
f.setFontHeightInPoints((short) 10);
f.setColor(IndexedColors.BLACK.getIndex());
f.setBoldweight(Font.BOLDWEIGHT_BOLD);

// 创建第二种字体样式(用于值)
f2.setFontHeightInPoints((short) 10);
f2.setColor(IndexedColors.BLACK.getIndex());

// 设置第一种单元格的样式(用于列名)
cs.setFont(f);
cs.setBorderLeft(CellStyle.BORDER_THIN);
cs.setBorderRight(CellStyle.BORDER_THIN);
cs.setBorderTop(CellStyle.BORDER_THIN);
cs.setBorderBottom(CellStyle.BORDER_THIN);
cs.setAlignment(CellStyle.ALIGN_CENTER);

// 设置第二种单元格的样式(用于值)
cs2.setFont(f2);
cs2.setBorderLeft(CellStyle.BORDER_THIN);
cs2.setBorderRight(CellStyle.BORDER_THIN);
cs2.setBorderTop(CellStyle.BORDER_THIN);
cs2.setBorderBottom(CellStyle.BORDER_THIN);
cs2.setAlignment(CellStyle.ALIGN_CENTER);
// 设置列名
for (int i = 0; i < columnNames.length; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(columnNames[i]);
cell.setCellStyle(cs);
}
// 设置每行每列的值
for (short i = 1; i < list.size(); i++) {
// Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
// 创建一行,在页sheet上
Row row1 = sheet.createRow((short) i);
// 在row行上创建一个方格
for (short j = 0; j < keys.length; j++) {
Cell cell = row1.createCell(j);

Boolean isNum = false;//data是否为数值型
                Boolean isInteger=false;//data是否为整数
                Boolean isPercent=false;//data是否为百分数
if (list.get(i).get(keys[j]) != null) {
//判断data是否为数值型
                    isNum = list.get(i).get(keys[j]).toString().matches("^(-?\\d+)(\\.\\d+)?$");
                    //判断data是否为整数(小数部分是否为0)
                    isInteger=list.get(i).get(keys[j]).toString().matches("^[-\\+]?[\\d]*$");
                    //判断data是否为百分数(是否包含“%”)
                    isPercent=list.get(i).get(keys[j]).toString().contains("%");
                    //如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
                    if (isNum && !isPercent) {
                        HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式
                        if (isInteger) {
                            contextstyle.setDataFormat(df.getBuiltinFormat("#,#0"));//数据格式只显示整数
                        }else{
                            contextstyle.setDataFormat(df.getBuiltinFormat("#,##0.00"));//保留两位小数点
                        }                   
                        // 设置单元格格式
                        cell.setCellStyle(contextstyle);
                        if (list.get(i).get(keys[j]).toString().length() > 12) {
                         //数值长度超过12位则变成文本格式输出
                         cell.setCellValue(list.get(i).get(keys[j]).toString());
} else {
// 设置单元格内容为double类型
                        cell.setCellValue(Double.parseDouble(list.get(i).get(keys[j]).toString()));
}
                    } else {
                     cell.setCellStyle(contextstyle);
                        // 设置单元格内容为字符型
                     cell.setCellValue(list.get(i).get(keys[j]).toString());
                    }
} else {
cell.setCellValue(" ");
}

// cell.setCellValue(list.get(i).get(keys[j]) == null ? " " : list.get(i).get(keys[j]).toString());
cell.setCellStyle(cs2);
}
}
return wb;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值