在保护状态下execl的格式有可能正在被使用,你这边修改,准确说是线程冲突,一般excel值会作为导出文件的模板,是不会编辑的。你可以在读的时候判断execl是否正在被使用。
下面的代码问题,你可以参考
package comhwtglmfcommon;
import javaioIOException;
import javaioOutputStream;
import javautilArrayList;
import javautilList;
import javaxservlet>
通过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 < outPutParamgetContent()size(); i++) {
int rowIndex = i + 2;
HSSFRow contentRow = sheetcreateRow(rowIndex);
Map<String, Object> rowDate = outPutParamgetContent()get(i);
//遍历列
for (int j = 0; j < outPutParamgetTitleList()size(); j++) {
Title headTitle = outPutParamgetTitleList()get(j);//获取第i行第j列列标题
String headerName = headTitlegetName();//获取第j列列标识
Object data = rowDateget(headerName);//获取第i行第j列所放数据
HSSFCellStyle contextstyle =workbookcreateCellStyle();
HSSFCell contentCell = contentRowcreateCell(j);
Boolean isNum = false;//data是否为数值型
Boolean isInteger=false;//data是否为整数
Boolean isPercent=false;//data是否为百分数
if (data != null || ""equals(data)) {
//判断data是否为数值型
isNum = datatoString()matches("^(-\\d+)(\\\\d+)$");
//判断data是否为整数(小数部分是否为0)
isInteger=datatoString()matches("^[-\\+][\\d]$");
//判断data是否为百分数(是否包含“%”)
isPercent=datatoString()contains("%");
}
//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
if (isNum && !isPercent) {
HSSFDataFormat df = workbookcreateDataFormat(); // 此处设置数据格式
if (isInteger) {
contextstylesetDataFormat(dfgetBuiltinFormat("#,#0"));//数据格式只显示整数
}else{
contextstylesetDataFormat(dfgetBuiltinFormat("#,##000"));//保留两位小数点
}
// 设置单元格格式
contentCellsetCellStyle(contextstyle);
// 设置单元格内容为double类型
contentCellsetCellValue(DoubleparseDouble(datatoString()));
} else {
contentCellsetCellStyle(contextstyle);
// 设置单元格内容为字符型
contentCellsetCellValue(datatoString());
}
}
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
如上,有两个比较重要的点:
1、先用正则表达式判断数据是否为数值型,如果为数值型,则设置单元格格式为整数或者小数;
2、然后往单元格中存放数据的时候要设置数据的格式为double类型,如果查看poi的源码HSSFCelljava会发现设置数据的方法如下,所以用setCellValue(double)方法即可。
优化
到了这里,您可能以为万事大吉啊了,其实上面的代码有个陷阱,如果不经过大数据量的测试是发觉不出来的哦~~
如果数据量大的话,系统可能会报错“The maximum number of cell styles was exceeded You can define up to 4000 styles in a xls workbook”,原因是style创建的次数太多了,解决这个问题的方法很简单,在循环体外面创建单元格格式contextstyle(即把它当成一个“全局”变量),不要在循环内部创建。
正确的代码如下:
/
导出Excel-胡玉洋-2015年11月11日
@param outPutParam Excel数据实体,包括要导出的excel标头、列标题、数据等
/
private void createContentRows(ExcelParam outPutParam) {
HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个Excel文件
HSSFCellStyle contextstyle =workbookcreateCellStyle();
// 遍历集合数据,产生数据行
for (int i = 0; i < outPutParamgetContent()size(); i++) {
int rowIndex = i + 2;
HSSFRow contentRow = sheetcreateRow(rowIndex);
Map<String, Object> rowDate = outPutParamgetContent()get(i);
//遍历列
for (int j = 0; j < outPutParamgetTitleList()size(); j++) {
Title headTitle = outPutParamgetTitleList()get(j);//获取第i行第j列列标题
String headerName = headTitlegetName();//获取第j列列标识
Object data = rowDateget(headerName);//获取第i行第j列所放数据
HSSFCell contentCell = contentRowcreateCell(j);
Boolean isNum = false;//data是否为数值型
Boolean isInteger=false;//data是否为整数
Boolean isPercent=false;//data是否为百分数
if (data != null || ""equals(data)) {
//判断data是否为数值型
isNum = datatoString()matches("^(-\\d+)(\\\\d+)$");
//判断data是否为整数(小数部分是否为0)
isInteger=datatoString()matches("^[-\\+][\\d]$");
//判断data是否为百分数(是否包含“%”)
isPercent=datatoString()contains("%");
}
//如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型
if (isNum && !isPercent) {
HSSFDataFormat df = workbookcreateDataFormat(); // 此处设置数据格式
if (isInteger) {
contextstylesetDataFormat(dfgetBuiltinFormat("#,#0"));//数据格式只显示整数
}else{
contextstylesetDataFormat(dfgetBuiltinFormat("#,##000"));//保留两位小数点
}
// 设置单元格格式
contentCellsetCellStyle(contextstyle);
// 设置单元格内容为double类型
contentCellsetCellValue(DoubleparseDouble(datatoString()));
} else {
contentCellsetCellStyle(contextstyle);
// 设置单元格内容为字符型
contentCellsetCellValue(datatoString());
}
}
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
以上就是关于JAVA 使用POI导出EXCEL文件,但是数据中有特殊字符该如何正确导出全部的内容,包括:JAVA 使用POI导出EXCEL文件,但是数据中有特殊字符该如何正确导出、poi Excel 如何取得列标题、poi *** 作excel表,怎么将单元格的格式设置为等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)