대량 데이터 excel 파일 다운로드

5068 단어
현재 프로젝트는 대량의 데이터 excel 데이터를 내보내고 다운로드해야 한다. excel 03 버전은 최대 65536, 07 버전 1048576개, Excel 2003의 최대 열 수는 256열, 2007 이상 버전은 16384열이다.만약 다운로드할 excel에 수백만 개에서 수천만 개의 데이터가 포함되어 있다면, excel 파일을 직접 다운로드하면 JVM 메모리가 넘치기 쉽다.이 문제를 피하기 위해 다운로드 excel을 다운로드 csv 파일로 바꾸면 대량의 메모리를 절약할 수 있습니다.현재 20만여 건의 데이터를 다운로드하는 것은 문제없다. 수백만 건, 심지어 천만 건의 데이터가 스트레스 테스트 중이다...
//  CSV 
            String[] title = new String[]{" "," "," "};
            String csvData = Utils.createCSVData(parseDetailDescription(result) , title);
            response.setContentType("text/plain");    
            response.addHeader("Content-Disposition", "attachment;filename=detailDescription.csv");    
            OutputStream out = response.getOutputStream();    
            OutputStreamWriter write = new OutputStreamWriter(out , "gb2312");      
            write.write(csvData);       
            write.flush();   
            return null;
/**
     * @Description  csv 
     * @param exportData
     * @param title
     * @return
     */
    public static String createCSVData(List<String[]> exportData , String[] title){ 
    	if(exportData == null || exportData.size() == 0 || null == title || title.length == 0){
    		if(logger.isDebugEnabled()){
    			logger.debug(" csv ,exportData=" + exportData + ",title=" + title);      
    		}
    		return null;
    	}
    	StringBuffer result = new StringBuffer();
    	for(int i = 0 ; i < title.length ; i++){
    		result.append(title[i]);
    		if(i == title.length - 1){
    			result.append("\r
"); } else { result.append(","); } } String[] data = null; for(int i = 0 ; i < exportData.size() ; i++){ data = (String[])exportData.get(i); if(null == data){ continue; } for(int j = 0 ; j < data.length ; j++){ result.append(data[j]); if(j == title.length - 1){ result.append("\r
"); } else { result.append(","); } } } return result.toString(); }
/**
     * @Description  
     * @param description
     * @return
     */
    private List<String[]> parseDetailDescription(String description){
    	if(StringUtils.isBlank(description)){
    		return null;
    	}
    	int errorIndex = description.indexOf(" ");
    	if(errorIndex == -1){
    		return null;
    	}
    	int warnIndex = description.indexOf(" ");
    	int infoIndex = description.indexOf(" ");
    	String errorMsg = null;
    	String warnMsg = null;
    	String infoMsg = null;   
    	if(warnIndex == -1){  
    		if(infoIndex == -1){
    			errorMsg = description.substring(errorIndex + 3);
    		} else {
    			errorMsg = description.substring(errorIndex + 3 , infoIndex);
    			infoMsg = description.substring(infoIndex + 3); 
    		}
    	} else {
    		errorMsg = description.substring(errorIndex + 3 , warnIndex);
    		if(infoIndex == -1){
    			warnMsg = description.substring(warnIndex + 3); 
    		} else {
    			warnMsg = description.substring(warnIndex + 3 , infoIndex); 
    			infoMsg = description.substring(infoIndex + 3); 
    		}
    	}
    	String[] temp = null;
    	String[] msgArr = null;
    	String[] data = null;
    	List<String[]> result = new ArrayList<String[]>();
    	if(StringUtils.isNotBlank(errorMsg)){
    		msgArr = errorMsg.split(";");
    		for(int i = 0 ; i < msgArr.length ; i++){
    			if(StringUtils.isBlank(msgArr[i])){
    				continue;
    			}
    			data = new String[3];
    			data[0] = " ";
    			temp = msgArr[i].split(" ");
    			if(temp.length < 2){
    				data[1] = "";
    				data[2] = msgArr[i];
    			} else {
    				data[1] = temp[0];
    				data[2] = temp[1];
    			} 
    			result.add(data);
    		}
    	}
    	if(StringUtils.isNotBlank(warnMsg)){
    		msgArr = warnMsg.split(";");
    		for(int i = 0 ; i < msgArr.length ; i++){
    			if(StringUtils.isBlank(msgArr[i])){
    				continue;
    			}
    			data = new String[3]; 
    			data[0] = " ";
    			temp = msgArr[i].split(" ");
    			if(temp.length < 2){
    				data[1] = "";
    				data[2] = msgArr[i];
    			} else {
    				data[1] = temp[0];
    				data[2] = temp[1];
    			} 
    			result.add(data);
    		}
    	}
    	if(StringUtils.isNotBlank(infoMsg)){
    		msgArr = infoMsg.split(";");
    		for(int i = 0 ; i < msgArr.length ; i++){
    			if(StringUtils.isBlank(msgArr[i])){
    				continue;
    			}
    			data = new String[3];     
    			data[0] = " ";
    			temp = msgArr[i].split(" ");
    			if(temp.length < 2){
    				data[1] = "";
    				data[2] = msgArr[i];
    			} else {
    				data[1] = temp[0];
    				data[2] = temp[1];
    			} 
    			result.add(data);
    		}
    	}
    	return result;
    }

좋은 웹페이지 즐겨찾기