导出的Excel的单元格都是文本格式(单元格左上角有个小三角):

费了不少功夫,终于把“小三角”去掉了,这里总结并分享一下问题的解决方法。
通过poi导出excel的过程大致是这样的:
规定单元格的格式
↓
创建单元格
↓
设置单元格的格式
↓
设置数据的格式
↓
把数据存放到单元格中
↓
通过IO流输出
背景POI导出Excel时设置单元格类型为数值类型
要想存放数值的单元格以数值类型导出,其中最关键的步骤就是上面加粗的两步,设置单元格的格式和向单元格中存放数据。
核心代码如下:
/**
* 导出Excel-胡玉洋-2015年11月11日
*
*@param outPutParam Excel数据实体,包括要导出的excel标头、列标题、数据等
* */
private void createContentRows(ExcelParam outPutParam) {
HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个Excel文件
// 遍历集合数据,产生数据行
for (int i = 0; i < outPutParam.getContent().size(); i++) {
int rowIndex = i + 2;
HSSFRow contentRow = sheet.createRow(rowIndex);
Map<String, Object> rowDate = outPutParam.getContent().get(i);
//遍历列
for (int j = 0; j < outPutParam.getTitleList().size(); j++) {
Title headTitle = outPutParam.getTitleList().get(j);//获取第i行第j列列标题
String headerName = headTitle.getName();//获取第j列列标识
Object data = rowDate.get(headerName);//获取第i行第j列所放数据
HSSFCellStyle contextstyle =workbook.createCellStyle();
HSSFCell contentCell = contentRow.createCell(j);
Boolean isNum = false;//data是否为数值型
Boolean isInteger=false;//data是否为整数
Boolean isPercent=false;//data是否为百分数
if (data != null || "".equals(data)) {
//判断data是否为数值型
isNum = data.toString().matches("^(-?\\d+)(\\.\\d+)?$");
//判断data是否为整数(小数部分是否为0)
isInteger=data.toString().matches("^[-\\+]?[\\d]*$");
//判断data是否为百分数(是否包含“%”)
isPercent=data.toString().contains("%");
}
//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
if (isNum && !isPercent) {
HSSFDataFormat df = workbook.createDataFormat(); // 此处设置数据格式
if (isInteger) {
contextstyle.setDataFormat(df.getBuiltinFormat("#,#0"));//数据格式只显示整数
}else{
contextstyle.setDataFormat(df.getBuiltinFormat("#,##0.00"));//保留两位小数点
}
// 设置单元格格式
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为double类型
contentCell.setCellValue(Double.parseDouble(data.toString()));
} else {
contentCell.setCellStyle(contextstyle);
// 设置单元格内容为字符型
contentCell.setCellValue(data.toString());
}
}
}
}
最后导出的正确格式:

