2016-10-26 6 views
3

나는 jxl 라이브러리를 사용하여 Excel 파일을 만들었습니다. 코드가 제대로 작동하지만 유일한 문제는 서비스에서 가져 오는 동적 값에서 Excel 파일을 빌드 할 때마다 Excel의 내용이 아래 그림과 같이 test.xls으로 덮어 쓰여지고 있다는 것입니다.자바를 사용하여 메모리에 Excel 파일을 만들고 다운로드 용 바이트로 전달

File file = new File("test.xls"); 
WritableWorkbook workbook = Workbook.createWorkbook(file); 
: 
: 
: 
: 

InputStream in = new FileInputStream(file); 

if (in == null) { 
    out.close(); 
} 
else 
{ 
    byte[] buffer = new byte[4096]; 
    int len; 

    while ((len = in.read(buffer)) != -1) { 
     out.write(buffer, 0, len); 
    } 

    out.flush(); 
    in.close(); 
    out.close(); 
} 

사람이

답변

3

에 좀 도와 주시겠습니까 메모리에 엑셀을 구축하고 ("Test.xls를을")을 다운로드하는 대신 외부 파일을 만들기위한 바이트를 전달할 수있는 방법이 있나요 ByteArrayOutputStreamWorkbook.createWorkbook(OutputStream os) 메서드와 함께 사용하여 메모리에 통합 문서를 만들고 원하는 출력 스트림에 만든 바이트 배열을 덤프하십시오.

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
WritableWorkbook workbook = Workbook.createWorkbook(baos); 

// ... 

workbook.close(); 
out.write(baos.toByteArray()); 
out.flush(); 
out.close(); 

또는, 중간 바이트 배열을 이용하지 않고, 즉시 그것을 할 수 : JXL 어쨌든 메모리의 통합을 유지하고이 방법이 바람직하다

WritableWorkbook workbook = Workbook.createWorkbook(out); 

// ... 

workbook.close(); 
out.flush(); 
out.close(); 

을, 단지 그것이 플러시 통합 문서가 닫힐 때 스트림을 출력합니다.

+0

고맙습니다 .......... –

+0

Apache POI에서이를 달성 할 수있는 방법이 있습니까? 감사 –

0

다음은 POI를 사용하여 Excel을 만들고이를 바이트로 변환하는 예입니다.

XSSFWorkbook workbook = new XSSFWorkbook(); 
    XSSFSheet sheet = workbook.createSheet("Sheet 1"); 

    Row row = sheet.createRow(1); 
    Cell cell = row.createCell(cellnum++); 
    cell.setCellValue((String) obj); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     workbook.write(bos); 
    } catch (IOException e) { 
    } finally { 
     try { 
      bos.close(); 
      workbook.close(); 
     } catch (IOException e) { 
     } 
    } 
    byte[] bytes = bos.toByteArray();