簡單的POI匯出JSP頁面表格資料到excel
資料庫中的equipment表格資料:
讀取資料庫中表格資料的程式碼TestExcel.java
public class TestExcel extends BaseAction{ /** * @param args * @throws Exception */ public String excel() { try{ Connection connection = con(); String sql = "select * from equipment"; PreparedStatement ps = pre(sql, connection); ResultSet rs = ps.executeQuery(); String [] string = {"裝置編號","學院名稱","入庫時間","實驗室位置","實驗箱名稱","使用狀態"}; ArrayList listname = new ArrayList(); for(int i = 0;i< string.length;i++){ listname.add(string[i]); } // ArrayList listname = (ArrayList) Arrays.asList(string); ArrayList listData = new ArrayList(); while(rs.next()){ ArrayList list = new ArrayList(); list.add(rs.getString(1)); list.add(rs.getString(2)); list.add(rs.getTimestamp(3)); list.add(rs.getString(4)); list.add(rs.getString(5)); list.add(rs.getString(6)); listData.add(list); } OutputStream out = response.getOutputStream(); //重置輸出流 response.reset(); //設定匯出Excel報表的匯出形式 response.setContentType("application/vnd.ms-excel"); //設定下載的excel檔名稱 response.setHeader("Content-Disposition", "attachment;filename=zfc.xls"); ExcelFileGenerator ex = new ExcelFileGenerator(listname,listData); ex.expordExcel(out); //設定輸出形式 System.setOut(new PrintStream(out)); //重新整理輸出流 out.flush(); //關閉輸出流 if(out!=null){ out.close(); } }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } public static Connection con() throws Exception{ Connection connection = null; Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ems", "root", "123456"); return connection; } public static PreparedStatement pre(String sql,Connection connection) throws Exception{ PreparedStatement ps = null; ps = connection.prepareStatement(sql); return ps; } }
將list集合的中的資料匯入到excel表中的步驟如下:
* 1、建立 HSSFWorkBook物件
* 2、獲取要匯出的表格的總記錄數
* 3、根據總記錄和每個excels的所容納的記錄數,進行分頁處理,得出分為幾個sheet的excels
* 4、得出sheet,進行每個sheet的迴圈處理
* 4.1、通過workbook物件進行建立createSheet,HSSFSheet物件
* 4.2、擁有了HSSFSheet物件,建立sheet.createRow行表頭,單獨的一行即資料說明
* 4.3、建立表頭行HSSFRow,開始匯入表頭行資料,開始對錶頭這一行進行資料迴圈填充
* 4.3.1、通過行頭物件HSSFRow建立HSSFCell列物件
* 4.3.2、有列物件,可以設定顯示的樣式,單元格寬度通過sheet物件設定
* 4.3.3、列物件設定完了,可以進行值的填充cell.setValue
* 4.4、接著開始迴圈每一行資料,對總記錄進行迴圈,如果超過最大容量,那麼最大值就是它,否則就是實際記錄數
* 4.5、開始進入迴圈,然後都要建立一個行物件HSSFRow,根據現在的頁數取出第幾條資料集合,進行迴圈
* 4.5.1、也是通過HSSFRow,建立HSSFCell列物件
* 4.5.2、通過cell物件設定相應的樣式或者編碼
* 4.5.3、編碼設定完,就可以進行每列資料的填充
* 5、返回workBook物件
程式碼ExcelFileGenerator.java:
public class ExcelFileGenerator { private final int SPLIT_COUNT = 1500; //Excel每個工作簿的行數 private ArrayList fieldName = null; //excel標題資料集 private ArrayList fieldData = null; //excel資料內容 private HSSFWorkbook workBook = null; /** * 構造器 * @param fieldName 結果集的欄位名 * @param data */ public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) { this.fieldName = fieldName; this.fieldData = fieldData; } /** * 1、建立 HSSFWorkBook物件 * 2、獲取要匯出的表格的總記錄數 * 3、根據總記錄和每個excels的所容納的記錄數,進行分頁處理,得出分為幾個sheet的excels * 4、得出sheet,進行每個sheet的迴圈處理 * 4.1、通過workbook物件進行建立createSheet,HSSFSheet物件 * 4.2、擁有了HSSFSheet物件,建立sheet.createRow行表頭,單獨的一行即資料說明 * 4.3、建立表頭行HSSFRow,開始匯入表頭行資料,開始對錶頭這一行進行資料迴圈填充 * 4.3.1、通過行頭物件HSSFRow建立HSSFCell列物件 * 4.3.2、有列物件,可以設定顯示的樣式,單元格寬度通過sheet物件設定 * 4.3.3、列物件設定完了,可以進行值的填充cell.setValue * 4.4、接著開始迴圈每一行資料,對總記錄進行迴圈,如果超過最大容量,那麼最大值就是它,否則就是實際記錄數 * 4.5、開始進入迴圈,然後都要建立一個行物件HSSFRow,根據現在的頁數取出第幾條資料集合,進行迴圈 * 4.5.1、也是通過HSSFRow,建立HSSFCell列物件 * 4.5.2、通過cell物件設定相應的樣式或者編碼 * 4.5.3、編碼設定完,就可以進行每列資料的填充 * 5、返回workBook物件 * 建立HSSFWorkbook物件 * @return HSSFWorkbook */ public HSSFWorkbook createWorkbook() { workBook = new HSSFWorkbook(); int rows = fieldData.size(); int sheetNum = 0; if (rows % SPLIT_COUNT == 0) { sheetNum = rows / SPLIT_COUNT; } else { sheetNum = rows / SPLIT_COUNT + 1; } for (int i = 1; i <= sheetNum; i++) { HSSFSheet sheet = workBook.createSheet("Page " + i); HSSFRow headRow = sheet.createRow((short) 0); for (int j = 0; j < fieldName.size(); j++) { HSSFCell cell = headRow.createCell((short) j); //新增樣式 cell.setCellType(HSSFCell.CELL_TYPE_STRING); cell.setEncoding(HSSFCell.ENCODING_UTF_16); //新增樣式 //設定所有單元格的寬度 sheet.setColumnWidth((short)j, (short)6000); //建立樣式(使用工作本的物件建立) HSSFCellStyle cellStyle = workBook.createCellStyle(); //建立字型的物件 HSSFFont font = workBook.createFont(); //將字型加粗 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //設定字型的顏色 short color = HSSFColor.RED.index; font.setColor(color); //將新設定的字型屬性放置到樣式中 cellStyle.setFont(font); if(fieldName.get(j) != null){ cell.setCellStyle(cellStyle); cell.setCellValue((String) fieldName.get(j)); }else{ cell.setCellStyle(cellStyle); cell.setCellValue("-"); } } for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) { HSSFRow row = sheet.createRow((short) (k + 1)); //將資料內容放入excel單元格 ArrayList rowList = (ArrayList) fieldData.get((i - 1)* SPLIT_COUNT + k); // ArrayList rowList = fieldData; for (int n = 0; n < rowList.size(); n++) { HSSFCell cell = row.createCell((short) n); cell.setEncoding(HSSFCell.ENCODING_UTF_16); if(rowList.get(n) != null){ cell.setCellValue((String) rowList.get(n).toString()); }else{ cell.setCellValue(""); } } } } return workBook; } public void expordExcel(OutputStream os) throws Exception { workBook = createWorkbook(); workBook.write(os); os.close(); } }