Excel 보고서 읽기 jxl.read.biff.BiffException: Unable to recognize OLE stream

3149 단어 exception
최근에 발생한 문제입니다. 시스템에서 Excle을 내보낸 후 excel의 일부 필드 내용을 수정한 다음 Excel을 가져옵니다. jxl을 통해 Excel을 읽으면 jxl이 파일을 읽는 데 이상이 발생합니다.
jxl.read.biff.BiffException: Unable to recognize OLE stream    
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)    
    at jxl.read.biff.File.<init>(File.java:127)    
    at jxl.Workbook.getWorkbook(Workbook.java:221)    
    at jxl.Workbook.getWorkbook(Workbook.java:198)  

가져온 excel은 jxl이 인정한 표준적인 OLE 파일이 아니지만 열려 있는 것은 Excle로 보입니다. 그리고 이 Excel을 다시 Excel로 저장했습니다. 기본적인 저장 형식은'단일 파일 웹 페이지'(EditPlus를 통해 Excle을 열면 웹 파일로 보임)입니다. 그리고 그 보안 형식을 Microsoft Office Excel로 수정해서 가져오기를 저장하면 정확하게 가져올 수 있습니다.
또 다른 가능한 원인은 excel의 버전 문제이다
 
그러나 다른 이름으로 저장하지 않고 가져올 수도 있습니다.
 
1. Excel 읽기는 텍스트로 읽기
2. Excel을 내보내고 jxl에 맞는 방식으로 내보내기
 
public void outPutExcel(List<InvoiceRequisitionSo> result,HttpServletResponse response ){
    OutputStream os = null;
    try{
        os = response.getOutputStream();
    }catch (IOException el){

    }
    response.reset();
    response.setHeader("Content-disposition", "attachment; filename=InvoiceRequisitionListToExcel.xls");
    response.setContentType("application/msexcel");
    WritableWorkbook wwb=null;
    WritableSheet ws=null;
    WritableCellFormat cellFormat = new WritableCellFormat();
    WritableCellFormat cellFormatContent = new WritableCellFormat();
    WritableFont font= new WritableFont(WritableFont.createFont(" "),10, WritableFont.NO_BOLD);
    WritableFont font1= new WritableFont(WritableFont.createFont(" "),10, WritableFont.NO_BOLD);
    try{
       wwb = Workbook.createWorkbook(os);
       ws = wwb.createSheet(" ", 0);
       font.setColour(Colour.WHITE);
       WritableCellFormat cellFormatContentt = new WritableCellFormat(font);
       font1.setColour(Colour.RED);
       WritableCellFormat cellFormatContentred = new WritableCellFormat(font1);
       ws.getSettings().setDefaultColumnWidth(18);
       // 
     cellFormat.setBackground(Colour.GRAY_25);
       cellFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
       cellFormatContent.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
       cellFormatContentt.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
       int i = 0;
       for (InvoiceRequisitionSo so : result) {
             ws.addCell(new Label(0,i,so.getInvoice(),cellFormatContentred ));
              // 
         ws.mergeCells(1, i , 2, i );
              ws.addCell(new Label(1, i, so.getEno(), cellFormatContent));
              i++;
      }
    }catch (Exception e){

    } finally{
            try {
                wwb.write();
                wwb.close();
                os.close();
            } catch (Exception e) {

            }
        }
}

좋은 웹페이지 즐겨찾기