2014-05-14 4 views
0

일부 코드를 사용하여 데이터베이스의 다른 테이블에서 다른 값으로 엑셀을 만들려고합니다. 코드가 작동하지만 엑셀 시트에 두 번 인쇄됩니다. 나는 모든 것을 검사했습니다. 사람이 이제 쿼리가 정확하고 작업데이터베이스에서 엑셀 시트를 생성하는 중

public class ExcelFileGen extends HttpServlet { 

public void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, java.io.IOException { 

    HttpSession session = request.getSession(true); 
    String eid = (String) session.getAttribute("eid"); 

    try { 
     String filename = "D:\\DailyWork.xls"; 
     HSSFWorkbook hwb = new HSSFWorkbook(); 
     HSSFSheet sheet = hwb.createSheet("new sheet"); 

     HSSFRow rowhead = sheet.createRow((short) 0); 

     rowhead.createCell(0).setCellValue("date"); 
     rowhead.createCell(1).setCellValue("description"); 
     rowhead.createCell(2).setCellValue("Support HRS"); 
     rowhead.createCell(3).setCellValue("Development HRS"); 
     rowhead.createCell(4).setCellValue("training HRS"); 
     rowhead.createCell(5).setCellValue("Research HRS"); 
     rowhead.createCell(6).setCellValue("Meeting HRS"); 
     rowhead.createCell(7).setCellValue("leave hrs"); 
     rowhead.createCell(8).setCellValue("Project Name"); 
     rowhead.createCell(9).setCellValue("activity"); 
     rowhead.createCell(10).setCellValue("eid"); 
     rowhead.createCell(11).setCellValue("intime"); 
     rowhead.createCell(12).setCellValue("outtime"); 

     Connection con = ConnectionManager.getConnection(); 
     Statement st = con.createStatement(); 
       ResultSet rs = st.executeQuery("select u.date, u.description, u.field1, u.field2, u.field3, u.field4, u.field5, u.field6, u.field7, u.activity, u.eid, d.intime, d.outtime, d.eid from updatework AS u, fulltime as d where d.eid = u.eid AND u.eid='" 
         + eid + "'"); 
     int i = 1; 
     while (rs.next()) 

     { 
      HSSFRow row = sheet.createRow((short) i); 
      row.createCell(0).setCellValue(rs.getString("date")); 
      row.createCell(1).setCellValue(rs.getString("description")); 
      sheet.autoSizeColumn(1); 
      row.createCell(2).setCellValue(rs.getString("field1")); 
      sheet.autoSizeColumn(2); 
      row.createCell(3).setCellValue(rs.getString("field2")); 
      sheet.autoSizeColumn(3); 
      row.createCell(4).setCellValue(rs.getString("field3")); 
      sheet.autoSizeColumn(4); 
      row.createCell(5).setCellValue(rs.getString("field4")); 
      sheet.autoSizeColumn(5); 
      row.createCell(6).setCellValue(rs.getString("field5")); 
      sheet.autoSizeColumn(6); 
      row.createCell(7).setCellValue(rs.getString("field6")); 
      sheet.autoSizeColumn(7); 
      row.createCell(8).setCellValue(rs.getString("field7")); 
      sheet.autoSizeColumn(8); 
      row.createCell(9).setCellValue(rs.getString("activity")); 
      sheet.autoSizeColumn(9); 
      row.createCell(10).setCellValue(rs.getString("eid")); 
      sheet.autoSizeColumn(10); 
      row.createCell(11).setCellValue(rs.getString("intime")); 
      sheet.autoSizeColumn(11); 
      row.createCell(12).setCellValue(rs.getString("outtime")); 
      sheet.autoSizeColumn(12); 

      i++; 
     } 
     FileOutputStream fileOut = new FileOutputStream(filename); 
     hwb.write(fileOut); 
     fileOut.close(); 
     System.out.println("Your excel file has been generated!"); 

    } catch (Exception ex) { 
     System.out.println(ex); 

    } 
} 

}

+0

데이터 세트를 Excel 및 기타 형식으로 직접 변환 할 수있는 다른 API를 사용할 수 있습니다. –

+3

select 문이 두 행을 반환하는 것으로 의심됩니다. 코드가 소리가납니다. –

+2

테이블을 알지 못해도 솔루션을 제공 할 수는 없지만 Kenneth가 맞았습니다. 데이터베이스에 대해 쿼리를 실행하고 조인이 필요한 결과를 반환하는지 확인하십시오. 그런데 PreparedStatement를 사용하고 쿼리를 매개 변수로 연결하지 말고 (SQL 인젝션 공격에 취약 해집니다), 프리젠 테이션 계층 (스프레드 시트를 작성하는 곳)에서 데이터베이스 액세스 코드를 분리하려고 생각하십시오. 명확성과 재사용 성 –

답변

0

여기 내 솔루션의 모든 것을는 정확하지만 쿼리가 적절하지 않았다입니다 .. 내 코드는 여기 ... 여기 를 좀 도와주세요 ...

ResultSet rs = st.executeQuery("select u.date, u.description, u.field1, u.field2, u.field3, u.field4, u.field5, u.field6, u.field7, u.activity, u.eid, d.intime, d.outtime, d.eid from updatework AS u, fulltime as d where (d.date=u.date) and (d.eid = u.eid) AND u.eid='" 
        + eid + "'"); 
관련 문제