最近在做导出Excel的功能封装,遇到了几个问题:
单元格宽度问题
数据不是数字格式问题
格式化了之后显示的不是数字而是######的问题(其实是因为单元格宽度不够导致的无法显示格式化之后的内容)
下面先说说解决方法:
1、单元格宽度问题
这个问题有两个解决办法,一个是
sheet.autoSizeColumn(1);
sheet.autoSizeColumn(1, true);
这种是自适应,第一参数是列号,从0开始,第二参数是是否考虑合并单元格。
还有一种是固定的多宽,这个宽度值就交给自己去测试了:
sheet.setColumnWidth(1, 5000)
这个第二个参数是宽度,具体上面说了自己测试。5000就很宽了,看放什么了。
2、数据不是数字格式问题
这个看api的感觉应该是设置这么个参数,cell.setCellType(Cell.CELL_TYPE_NUMERIC);
但是实际上这个参数设置了不起作用,后来发现自己放的值是String类型,所以不行,后来改为了Double.valueOf(str)方法,发现还是不行,换成Double.parseDouble(str)就行了,原来前面的方法返回的是Double,后面的是double,封装类型也不行。。。
后来就统一把所有的参数设置为Object类型了,这样好转。
3、格式化后显示###
这里是因为宽度不够啦,所以我这里主要说一下怎么格式化好了。
其实Excel本身带了一部分的格式化,见下图
如上图所示,Excel自带了一部分格式,而poi的DataFormat中也自带了这些格式并对应了short值,如下所示:
内置数据类型
编号
"General"
0
"0"
1
"0.00"
2
"#,##0"
3
"#,##0.00"
4
"($#,##0_);($#,##0)"
5
"($#,##0_);[Red]($#,##0)"
6
"($#,##0.00);($#,##0.00)"
7
"($#,##0.00_);[Red]($#,##0.00)"
8
"0%"
9
"0.00%"
0xa
"0.00E+00"
0xb
"# ?/?"
0xc
"# ??/??"
0xd
"m/d/yy"
0xe
"d-mmm-yy"
0xf
"d-mmm"
0x10
"mmm-yy"
0x11
"h:mm AM/PM"
0x12
"h:mm:ss AM/PM"
0x13
"h:mm"
0x14
"h:mm:ss"
0x15
"m/d/yy h:mm"
0x16
保留为过国际化用
0x17 - 0x24
"(#,##0_);(#,##0)"
0x25
"(#,##0_);[Red](#,##0)"
0x26
"(#,##0.00_);(#,##0.00)"
0x27
"(#,##0.00_);[Red](#,##0.00)"
0x28
"_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"
0x29
"_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"
0x2a
"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
0x2b
"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"
0x2c
"mm:ss"
0x2d
"[h]:mm:ss"
0x2e
"mm:ss.0"
0x2f
"##0.0E+0"
0x30
"@" - This is text format
0x31
使用下面的代码来设置
1
2
3
4
CellStylecellStyle=workBook.createCellStyle();
DataFormatformat=workBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("@"));
cell.setCellStyle(cellStyle);
接下来我会举例日期、小数、货币、百分比、中文大写、科学计数几种方式的格式化:
1、日期格式
Java
1
2
3
4
5
6
cell.setCellValue(newDate(2008,5,5));
//set date format
CellStylecellStyle=workBook.createCellStyle();
DataFormatformat=workBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("yyyy-MM-dd"));
cell.setCellStyle(cellStyle);
2、小数格式
Java
1
2
3
4
cell.setCellValue(1.2);
CellStylecellStyle=workBook.createCellStyle();
cellStyle.setDataFormat(DataFormat.getBuiltinFormat("0.00"));
cell.setCellStyle(cellStyle);
3、货币格式
Java
1
2
3
4
5
cell.setCellValue(20000);
CellStylecellStyle=workBook.createCellStyle();
DataFormatformat=workBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("¥#,##0"));
cell.setCellStyle(cellStyle);
4、百分比格式
Java
1
2
3
4
cell.setCellValue(20);
CellStylecellStyle=workBook.createCellStyle();
cellStyle.setDataFormat(DataFormat.getBuiltinFormat("0.00%"));
cell.setCellStyle(cellStyle);
5、中文大写格式
Java
1
2
3
4
5
cell.setCellValue(20000);
CellStylecellStyle=workBook.createCellStyle();
DataFormatformat=workBook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("[DbNum2][$-804]0"));
cell.setCellStyle(cellStyle);
6、科学计数格式
Java
1
2
3
4
cell.setCellValue(20000);
CellStylecellStyle=workBook.createCellStyle();
cellStyle.setDataFormat(DataFormat.getBuiltinFormat("0.00E+00"));
cell.setCellStyle(cellStyle);
这里面一部分使用的是DataFormat.getBuiltinFormat(),是由于这部分格式化是Excel中自带的格式,具体自带的格式大家可以自己打开Excel看看,上图也有截出一部分。
到此POI的Excel的单元格格式化方式的一些问题就解决了。