前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
一、思路:從數據庫表中查出list ,封裝到 HSSFWorkook 中,再由HSSFWorkook ?寫出到 File 中,
用 response 的 build 方法 ?實現下載、導出。
?
二、 實現代碼:
要加上注解 :@Produces ,文本就寫 text , 圖片寫 ?img ( 如果我沒有記錯的話)
?
@Path("/exportWWCollectReport")@Produces("text/plain")@GET@Overridepublic Response exportWorkWeights(@QueryParam("tableName") @DefaultValue("工作權重統計報表") String tableName,@QueryParam("startTime") String startTime,@QueryParam("endTime") String endTime,@QueryParam("employeeNo") String employeeNo,@QueryParam("organizeId") String organizeId,@QueryParam("employeeName") String employeeName,@QueryParam("position") String position,@QueryParam("jobTypeId") String jobTypeId,@QueryParam("projectId") String projectId) {try{return workWeightCollectService.exportWorkWeights(tableName, startTime, endTime, employeeNo,organizeId, employeeName, position, jobTypeId, projectId);}catch (Exception ex){logger.debug("工作權重統計報表導出失敗:",ex.getMessage());return null;}}
?
?
要導這個包下的 response :
?
?
?
import javax.ws.rs.core.Response;
?
@Overridepublic Response exportWorkWeights(String tableName, String startTime, String endTime, String employeeNo,String organizeId, String employeeName, String position, String jobTypeId, String projectId) throws Exception {// 要導出的列表數據String sql = getWorkWeightCollectReportSql( startTime, endTime, employeeNo,organizeId, employeeName, position, jobTypeId, projectId);List<Object> wwList = getResultList(sql);if (null == wwList){return null;}List<List<Object>> list = new ArrayList<List<Object>>(); // list 是要導出的表數據WorkWeightDto ww = null;String startT = null;String endT = null;WorkWeightDto wwdto = new WorkWeightDto();for (Object ob : wwList) {Object[] obj = (Object[])ob;List<Object> dataList = new ArrayList<Object>();startT = String.valueOf(obj[0]) == null ? "":String.valueOf(obj[0]);endT = String.valueOf(obj[1]) == null ? "": String.valueOf(obj[1]);dataList.add(startT+" 至 "+endT);dataList.add(String.valueOf(obj[2]) == null ? "":String.valueOf(obj[2])); // 工號dataList.add(String.valueOf(obj[10]) == null ? "":String.valueOf(obj[10])); // 中心String bu = String.valueOf(obj[11]);wwdto = setOrganizeBu(wwdto, bu);String ke = String.valueOf(obj[12]);wwdto = setOrganizeKe(wwdto,ke);String shi = String.valueOf(obj[13]);if(shi.substring(shi.length()-2,shi.length()).contains("室")){wwdto.setShi(shi);}else {wwdto = setOrganizeKe(wwdto, shi);}dataList.add(wwdto.getBu()); // 部dataList.add(wwdto.getKe()); // 科dataList.add(wwdto.getShi()); // 室dataList.add(String.valueOf(obj[3]) == null ? "":String.valueOf(obj[3])); //姓名dataList.add(String.valueOf(obj[8]) == null ? "":String.valueOf(obj[8])); // 職級dataList.add(String.valueOf(obj[5]) == null ? "":String.valueOf(obj[5])); // 工作類型dataList.add(String.valueOf(obj[7]) == null ? "":String.valueOf(obj[7])); // 項目dataList.add(String.valueOf(obj[9]) == null ? "":String.valueOf(obj[14])); // 工作任務dataList.add(String.valueOf(obj[9]) == null ? "":String.valueOf(obj[9])); // 比例list.add(dataList);}//表頭String[] headers = new String[]{"所屬周期","工號","中心","部門","科","室","姓名","職級","工作類型","項目","工作任務","比例"};FileOutputStream fileOut = null;try{HSSFWorkbook workbook = ExportUtil.excelOut(headers, list);fileOut = new FileOutputStream(tableName+".xlsx");workbook.write(fileOut);// 以上是寫入文件,以下是下載文件File file = new File(tableName+".xlsx");Response.ResponseBuilder response = Response.ok(file);response.header("Content-Disposition","attachment; filename=" +new String((tableName+".xlsx").getBytes("gbk"), "iso8859-1"));return response.build();} catch (Exception e){e.printStackTrace();return null;}finally {fileOut.close();}}
?
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;import java.io.FileOutputStream;
import java.util.List;public class ExportUtil {public static HSSFWorkbook excelOut(String[] cloumName, List<List<Object>> list){//聲明一個工作簿HSSFWorkbook workbook = new HSSFWorkbook();//生成一個表格HSSFSheet sheet = workbook.createSheet();//設置表格默認列寬度為20個字符sheet.setDefaultColumnWidth(20);//生成一個樣式,用來設置標題樣式HSSFCellStyle style = workbook.createCellStyle();// 表頭居中style.setAlignment(HorizontalAlignment.CENTER);//生成一個字體HSSFFont font = workbook.createFont();font.setFontHeightInPoints((short) 12); // 字體高度font.setFontName(" 黑體 "); // 字體//把字體應用到當前的樣式style.setFont(font);// 生成并設置另一個樣式,用于設置內容樣式HSSFCellStyle style2 = workbook.createCellStyle();style2.setAlignment(HorizontalAlignment.CENTER);// 生成另一個字體HSSFFont font2 = workbook.createFont();font2.setFontName(" 黑體 "); // 字體// 把字體應用到當前的樣式style2.setFont(font2);HSSFRow row = sheet.createRow(0);for(int i = 0; i < cloumName.length; i++){//單元格HSSFCell cellHead = row.createCell(i);cellHead.setCellStyle(style);HSSFRichTextString text = new HSSFRichTextString(cloumName[i]);cellHead.setCellValue(text);}for (int i = 0; i < list.size(); i++){row = sheet.createRow(i + 1);List<Object> dataList = list.get(i);for (int j = 0; j < dataList.size(); j++) {// 表格內容樣式設置HSSFCell cellHead = row.createCell(j);cellHead.setCellStyle(style2);HSSFRichTextString text = new HSSFRichTextString(String.valueOf(dataList.get(j)));// 為空if(text == null || text.toString() == ""){cellHead.setCellValue("");}/* // 整數,不為電話else if(ValidateUtils.isInteger(String.valueOf(text))&& !(StringUtils.startsWith(String.valueOf(text),"1")&& String.valueOf(text).length() == 11)){cellHead.setCellValue(Integer.parseInt(String.valueOf(text)));}// 有小數、或為電話else if(ValidateUtils.isDouble(dataList.get(j).toString())){cellHead.setCellValue(Double.parseDouble(String.valueOf(text)));}*/// 字符串else{cellHead.setCellValue(String.valueOf(text));}}}return workbook;}
}
?
另: ?xlsx 格式的表格,容量數據條數有上限,大約是36000+條數據。建議使用 csv 格式的表格, 可以保存極大的數據量。
?
生成的臨時文件存放在工程中,記得刪除。
?
?