jws 方式表格導出,excel文件導出,rest風格接口實現

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

一、思路:從數據庫表中查出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 格式的表格, 可以保存極大的數據量。

?

生成的臨時文件存放在工程中,記得刪除。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450347.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

先思再行 閉著眼睛編程

摘要&#xff1a;解決問題最重要的習慣不是一直盯著屏幕和編寫修改代碼&#xff0c;某些時候&#xff0c;阻止你成功的東西恰恰會是過于努力。這時候你需要暫停一下&#xff0c;平緩你的思緒&#xff0c;換一種方法或許能帶給你不一樣的效果。你會花多少時間思考如何編寫代碼&a…

javaScript復習

ES6字符串方法&#xff1a; //console.log(String.prototype);var str "abcdefabc";//console.log(str.includes("a"));//結果true//console.log(str.includes("abf"));//結果false//console.log(str.startsWith("d"));//false//cons…

STS的安裝教程-鵬鵬

STS全稱Spring Tools Suite。 簡介&#xff1a;Spring Tools Suite (STS)其實就是一個被包裝過的Eclipse&#xff0c;主要用于快速的開發Spring項目&#xff0c;我們不用再去編輯繁瑣的xml配置文件&#xff0c;而是由工具自動生成。STS有兩種安裝方式&#xff0c;一種是直接在E…

final的用法

final 根據程序上下文環境&#xff0c;Java關鍵字final有“這是無法改變的”或者“終態的”含義&#xff0c;它可以修飾非抽象類、非抽象類成員方法和變量。你可能出于兩種理解而需要阻止改變&#xff1a;設計或效率。 final類不能被繼承&#xff0c;沒有子類&#xff0c;f…

愛恨交織的編程語言 是什么吸引了你

摘要&#xff1a;每門編程語言都有自身獨特的地方&#xff0c;那么為什么有些語言會一直存活在我們周圍&#xff0c;而有些語言卻逐漸被人淡忘&#xff0c;是什么吸引你&#xff1f; 每名程序員至少知道兩門以上的編程語言&#xff0c;有些甚至不是所謂的編程語言&#xff08;比…

Unable to parse the date: 2017-12-30 日期格式轉化失敗

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff0c; 日期格式轉化失敗。 原因&#xff1a;參數是2017-09-23 這種格式&#xff0c;代碼卻是寫的轉為&#xff1a; &qu…

linux邏輯卷管理

2019獨角獸企業重金招聘Python工程師標準>>> 摘要&#xff1a; Linux用戶安裝Linux操作系統時遇到的一個最常見的難以決定的問題就是如何正確地給評估各分區大小&#xff0c;以分配合適的硬盤空間。而遇到出現某個分區空間耗盡時&#xff0c;解決的方法通常是使用符…

[LeedCode]921. 使括號有效的最少添加

題目描述&#xff1a; 給定一個由 ( 和 ) 括號組成的字符串 S&#xff0c;我們需要添加最少的括號&#xff08; ( 或是 )&#xff0c;可以在任何位置&#xff09;&#xff0c;以使得到的括號字符串有效。從形式上講&#xff0c;只有滿足下面幾點之一&#xff0c;括號字符串才是…

abstract的一些用法

&#xfeff;&#xfeff;abstract&#xff08;抽象&#xff09;修飾符&#xff0c;可以修飾類和方法 1&#xff0c;abstract修飾類&#xff0c;會使這個類成為一個抽象類&#xff0c;這個類將不能生成對象實例&#xff0c;但可以做為對象變量聲明的類型&#xff0c;也就是編譯…

github 如何設置項目的語言顯示

github 會根據一個項目文件最多的那個種類的文件顯示為對應的語言項目 如果想讓整個項目顯示為 HTML 項目, 需要進行以下步驟的設置 1.在根目錄下創建一個文件 .gitattributescreate .gitattributes2.在 .gitattributes 內編輯以下內容&#xff1a; *.js linguist-languageHTML…

C++提高進階,你知道多少?

C從零開始 ——何謂編程 引言 曾經有些人問我問題&#xff0c;問得都是一些很基礎的問題&#xff0c;但這些人卻已經能使用VC編一個對話框界面來進行必要的操作或者是文檔/視界面來實時接收端口數據并動態顯示曲線&#xff08;還使用了多線程技術&#xff09;&#xff0c;卻連…

POJ 3352 Road Construction ; POJ 3177 Redundant Paths (雙聯通)

這兩題好像是一樣的&#xff0c;就是3177要去掉重邊。 但是為什么要去重邊呢&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;我認為如果有重邊的話&#xff0c;應該也要考慮在內才是。 這兩題我用了求割邊&#xff0c;在去掉割邊&#xff0c;用DFS縮…

postman界面變成了左右結構怎么辦

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在左上角 file -- settongs中設置一下&#xff1a;

面向對象階段個人總結

&#xfeff;&#xfeff;面向對象階段的個人總結 我個人對面相對向的總結。我想到了我認為比較好的方法&#xff0c;就是對照每次學習一個大模塊的前的章節目錄進行回顧總結&#xff0c;比如我們這階段學習是面向對象的課程&#xff0c;下面我就來按照章節 目錄進行一個系統…

1.springboot:入門程序

一、Spring Boot 簡介 官網英文&#xff1a; Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. We take an opinionated view of the Spring platform and third-party libraries so you can get st…

2018.12.18運算符,分支結構(循環),異常處理,函數

1復習 <!DOCTYPE html><html><head> <meta charset"UTF-8"> <title>復習預習</title> <style> .b { /* 作用域: {}產生的, {作用域開始的標識, }作用域結束的標識 */ /*出現在作用域中的所有內…

javax.ws.rs.NotSupportedException: Cannot consume content type

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff1a;javax.ws.rs.NotSupportedException: Cannot consume content type 解決&#xff1a;使用postman發送 post 請求訪…

java異常預習

java中的異常捕獲結構有try&#xff0c;catch&#xff0c;finally三部分組成。其中&#xff0c;try語句塊存放的是可能發生異常的java語句&#xff1b;catch程序塊在try語句塊之后&#xff0c;用來激發被捕獲的異常&#xff1b;finally語句塊是異常處理結構的最后執行部分&…

【親測有效】Kali Linux無法安裝網易云音樂的解決方案

問題描述 由于 Kali Linux 的內核是基于 Debian 的&#xff0c;我們在安裝網易云音樂的時候更偏向于選擇安裝網易云音樂 v1.1.0 deepin15&#xff08;64位&#xff09; 的包&#xff0c;可是我發現在安裝過程中&#xff0c;無法定位 libqcef1 軟件包&#xff0c;對于很多鐘愛網…

C/C++函數名修飾約定

函數名字修飾&#xff08;Decorated Name&#xff09;方式 函數的名字修飾&#xff08;Decorated Name&#xff09;就是編譯器在編譯期間創建的一個字符串&#xff0c;用來指明函數的定義或原型。 正在裝載數據…… LINK程序或其他工具有時需要指定函數的名字修飾來定位函數的…