IT_Programming/Java
jxl.jar를 이용해서 Excel file 생성하기
JJun ™
2008. 1. 25. 11:51
1. http://www.andykhan.com/jexcelapi/index.html 에서 download JExcelApi. 2. tomcat의 경우 자신의 WEB-INF/lib에 위에서 받은 file중에 jxl.jar를 복사 한다 3. 자신에 계정의 CLASSPATH에 WEB-INF/lib/jxl.jar를 추가한다. 4. 적당한 name으로 다음 내용과 같은 html file을 만든다. <html><head> <title>Excel Test</title></head> <body> <form method="POST" action="/???/servlet/ExcelTest"> <input type="submit" value="Excel" name="ok"> </form></body></html> 4. WEB-INF/classes에서 ExcelTest.Java를 다음과 같이 작성한다. import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import jxl.*; import jxl.write.*; public class ExcelTest extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filepath = "/tmp"; String filename = "output.xls"; try { WritableWorkbook workbook = Workbook.createWorkbook(new File( filepath+ "/" + filename )); WritableSheet sheet = workbook.createSheet("First Sheet", 0); Label label = new Label(0, 2, "Pungjoo"); sheet.addCell(label); jxl.write.Number number = new jxl.write.Number(3, 4, 3.1459); sheet.addCell(number); workbook.write(); workbook.close(); } catch ( Exception e ){ } try { File file = new File( filepath+ "/" + filename ); FileInputStream fin = new FileInputStream(file); int ifilesize = (int)file.length(); byte b[] = new byte[ifilesize]; response.setContentLength(ifilesize); response.setContentType("application/smnet"); response.setHeader( "Content-Disposition", "attachment; filename=" + filename+";" ); ServletOutputStream oout = response.getOutputStream(); fin.read(b); oout.write(b,0,ifilesize); oout.close(); fin.close(); file.delete(); } catch ( Exception e ) { } } } 5. 자세한 사용법은 http://www.andykhan.com/jexcelapi/tutorial.html 를 본다. 6. code가 엉성하죠?.. 그냥 심심해서.... 7. tutorial을 자세히 보면 Form file을 작성하고 위와 같은 방식으로 좌표 값을 넣고 병합을 하는 방식이 있습니다. 즉 2개의 File을 이용한다는 것 입니다. 하나는 Form file로 Chart나 합을 구한다던가 뭐 하여간 이런 저런 저런 것을 넣은 File을 편하게 Excel로 만들고 위와 같은 방식으로 해당 Form file의 Cell 좌표에 값을 넣는 File 하나를 만들고 Form File과 위 방식으로 만든 File을 병합하면 됩니다. 또는 원본 File을 참조해 modify 방법으로 out file을 만들 수 있습니다. tutorial하단에 나옵니다. 8. 쩝. 지금까지 저는 Excel로 원하는 Form을 작성하고 그것을 html로 변환하고 Form에서 특정 값을 mark하고 그 값을 edit에서 search해서 data를 넘겨 주고 하는 방식으로 작성을 했습니다. 이렇게 하다보니 Form에서 한 Cell만 바뀌어도 다시 작성하는 바보 같은 짓을 했습니다. 저 같은 바보 짓을 하지 맙시다. 9. 위에 분께서 workload에 대해서 언급을 하셨는데 저는 잘 모르겠습니다. Compaq Alpha DS20E Server에서 Test를 해서 그런지 또는 file 내용이 부실해서.. 10. modify부분을 만들어 봤습니다. 우선 Excel로 A3 Cell에 "당신의 이름은?" 라고 넣고 form.xls로 저장합니다. Server의 /tmp directory에 위 form.xls file을 복사합니다. 11. 위에 ExcelTest file을 아래와 같이 변경합니다. import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import jxl.*; import jxl.write.*; public class ExcelTest extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filepath = "/tmp"; String filename = "output.xls"; try { Workbook workbook = Workbook.getWorkbook(new File("/tmp/form.xls")); WritableWorkbook copy = Workbook.createWorkbook( new File( filepath+ "/" + filename ), workbook ); WritableSheet sheet = copy.getSheet(0); Label label = new Label(1, 2, "Pungjoo"); sheet.addCell(label); copy.write(); copy.close(); } catch ( Exception e ) { } try { File file = new File( filepath+ "/" + filename ); FileInputStream fin = new FileInputStream(file); int ifilesize = (int)file.length(); byte b[] = new byte[ifilesize]; response.setContentLength(ifilesize); response.setContentType("application/smnet"); response.setHeader( "Content-Disposition", "attachment; filename=" + filename+";" ); ServletOutputStream oout = response.getOutputStream(); fin.read(b); oout.write(b,0,ifilesize); oout.close(); fin.close(); file.delete(); } catch ( Exception e ) { } } } 12. 위와 같이 하면 Excel file의 B3에 Pungjoo라고 병합이 되어 excel file이 생성됩니다. 13. 이번 Test는 Intel Pentium III (600MHz) / Linux에서 해 봤습니다. 위에 언습하신 분 말씀처럼 workload가 역시 있네요... 따뜻한 하루 하루를 보내시길..... -------------------------------------------------------------------------------------- 현존하는 인 보다 죽어 나간 인이 더 많은 시점에 같은 공간 같은 시간 속에 우리네들은 서 있다.