考勤管理模块中的签到记录列表数据导出excel2003表时,如果数据量太大,超过了65535条就会报错.
解决办法:当数据每隔65535条时,就新建一个sheet工作表写数据,把数据写到多张sheet表里面.
/**
* excel 2003版本的导出方法 支持多个sheet导出 导出的文件后缀为.xls
* 由于excel2003最多导出65535条数据
* @param dataMap 要导出的数据
* @param excelFilePath excel文件的存放位置
* @param fileName excel文件名字
* @return
*/
public String exportXlsExcel(Map<String,List<String[]>> dataMap,String excelFilePath,String fileName){
FileOutputStream fout=null;
String fileLocal="";
try{
File file=new File(excelFilePath);
if(!file.exists()){
file.mkdirs();
}
// 第一步,创建一个webbook,对应一个Excel文件
HSSFWorkbook wb=new HSSFWorkbook();
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet=null;
List<String[]> dataList=null;
HSSFCellStyle style=wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//
dataList=dataMap.get("签到记录列表");
int i;
int k;
/**
* k表示sheet工作表的张数
*/
int dataSizeNum=dataList.size()-1; //减去表头
if (dataSizeNum%EXCEL_EXPORT_PARAM==0){
k=(dataList.size()-1)/EXCEL_EXPORT_PARAM;
}else {
k=(dataList.size()-1)/EXCEL_EXPORT_PARAM+1;
}
for (int t=0;t<k;t++){
int titleNum=t+1;
sheet=wb.createSheet("签到记录列表"+"("+titleNum+")");
for(i=0;i<=EXCEL_EXPORT_PARAM;i++){
// 生成第一行 第一行是表头,包括表头在内,所以多加一行
HSSFRow row=sheet.createRow(i);
/**
* 1EXCEL_EXPORT_PARAM表示每张sheet工作表最多写的记录的条数(不包括表头)
*/
int num=(t*EXCEL_EXPORT_PARAM)+i;
if (num>=dataList.size()){
break;
}
String[] arr=dataList.get(num);
/**
* t不等于0且i=0时说明又是一张sheet表
*/
if (t!=0&&i==0){
arr=dataList.get(0);
}
for(int j=0;null!=arr&&j<arr.length;j++){
// 给这一行的第一列赋值
HSSFCell cell=row.createCell(j);
String value = arr[j];
if(value==null ||"null".equals(value)){
value = "";
}
cell.setCellValue(value);
cell.setCellStyle(style);
if(i==0){
HSSFCellStyle tempStyle=style;
tempStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
tempStyle.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);
cell.setCellStyle(tempStyle);
}
}
}
}
// 第六步,将文件存到指定位置
fileLocal=excelFilePath+"/"+fileName+".xls";
fout=new FileOutputStream(fileLocal);
wb.write(fout);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(fout != null) {
fout.close();
}
}catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return fileLocal;
}