您好,登錄后才能下訂單哦!
本篇文章為大家展示了在java后臺使用Apache poi 實現生成一個excel文檔并提供前臺下載,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
step1:創建xls格式的模板
表頭含有我的甲方信息就打碼了,可以看到我搞了一個空的模板文件,現在有很多東西需要在后臺填入
step2:前臺觸發事件
搞一個按鈕,用戶點擊的時候用JavaScript的window.location.href將頁面重定向到你處理下載的URL去
比方說,這是我項目的前臺,看到那個表面質量按鈕嗎,來看一下當它被點擊的時候調用的函數
function exportBatch() { //get請求,可以傳遞參數,比方說我這里就傳了一堆卷號,我只生成傳過去的這堆卷號的檢驗記錄 //參數rollNumbers的細節就不展示了,業務相關 window.location.href = '../ir/exportSurface?rollNumberList=' + rollNumbers; }
有朋友可能想用什么Ajax來發送請求,我反正是沒搞出來,挺麻煩的,網上找的相關解決方案也都比較蛋疼,因此不傳什么復雜的敏感的參數,就這么寫就可以。
step3:后臺處理
首先你當然要把Apache poi那一套東西引入你的項目啦,我的項目是Maven項目,添加依賴很容易
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency>
然后,為了方便導出Excel,在項目中建了一個ExcelUtils工具類,后面給出源碼,這么一來導出Excel會變得更簡單。ExcelUtils里面除了一些既定的方法外,還有就是你具體怎么去操作模板的方法了。當然你用的少的話可以不用我這工具類,而是在你需要的時候import相關的類,然后在你處理的時候就把操作模板的邏輯寫進去也可以。但我這個項目很多次用到導出Excel,所以抽象出一個工具類是很有必要的,符合設計模式。
我的項目是基于SpringMVC的,來看看我后臺接收到請求以后做了些什么吧
Controller:
/*** * 批量導出表面質量檢驗記錄 * * @return * @throws Exception */ @RequestMapping(value = "exportSurface", method = RequestMethod.GET) @ResponseBody public void exportSurface(HttpServletRequest request, HttpServletResponse response) throws Exception { //參數獲取及處理,業務相關不展示 //把要填寫的數據放在一個map里 Map<String, Object> map = new HashMap<String, Object>(); map.put("sequence", "0001");//mock編號 map.put("date", DateUtils.toDateStr(new Date(), DateUtils.DEFAULT_DATE_PATTERN_CHINESE)); map.put("chetaihao", "1#");//mock車臺號 map.put("productName", "預應力鋼絞線");//mock品名 map.put("specification", "規格");//mock規格 map.put("memo", "備注");//mock備注 map.put("inspectRecordBizList", inspectRecodeBizList); ExcelUtils.exportInspectionRecordSurface(request, response, map); }
最后調用ExcelUtils里的相關導出方法,這個方法是自定義的,它定義的是怎樣去操作模板
自定義的方法:
public static void exportInspectionRecordSurface(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException { //模板的路徑,這個在自己的項目中很容易弄錯,相對位置一定要寫對啊 String psth = request.getRealPath("/") + INSPECTIONRECORD_SURFACE_TEMPLET_PATH; Workbook webBook = readExcel(psth); createCellStyle(webBook); Sheet sheet = webBook.getSheetAt(0); //開始操作模板,找到某行某列(某個cell),需要注意的是這里有個坑,行和列的計數都是從0開始的 //一次數據插入的位置不對,別灰心,多試幾次就好啦,你要是能看懂我下面的代碼,數據插在了什么位置,你就明白了 int rows = 1; Row row = sheet.getRow(rows); row.createCell(1).setCellValue((String) map.get("sequence")); row.createCell(3).setCellValue((String) map.get("date")); row.createCell(9).setCellValue((String) map.get("chetaihao")); rows = 2; row = sheet.getRow(rows); row.createCell(1).setCellValue((String) map.get("productName")); row.createCell(3).setCellValue((String) map.get("specification")); row.createCell(9).setCellValue((String) map.get("memo")); //檢驗記錄的插入業務相關,不展示,其實就是for循環在合適的行合適的列插入一個個對象的屬性即可,你這么聰明,沒問題的 writeExcel(response, webBook, "表面質量檢驗記錄"); }
ExcelUtils:
//這里得有你自己的package名 import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Created by bwju on 2016/12/06. */ public class ExcelUtils { private static final String INSPECTIONRECORD_SURFACE_TEMPLET_PATH = "/asserts/templete/InspectionRecordSurface.xls"; private static HSSFCellStyle cellstyle = null; public static void exportInspectionRecordSurface(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException { //實現上文里有,改個函數名,寫你的操作模板函數吧! } private static Workbook readExcel(String filePath) { InputStream in = null; Workbook work = null; try { in = new FileInputStream(filePath); work = new HSSFWorkbook(in); } catch (FileNotFoundException e) { System.out.println("文件路徑錯誤"); e.printStackTrace(); } catch (IOException e) { System.out.println("文件輸入流錯誤"); e.printStackTrace(); } return work; } private static void writeExcel(HttpServletResponse response, Workbook work, String fileName) throws IOException { OutputStream out = null; try { out = response.getOutputStream(); response.setContentType("application/ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" .concat(String.valueOf(URLEncoder.encode(fileName + ".xls", "UTF-8")))); work.write(out); } catch (IOException e) { System.out.println("輸出流錯誤"); e.printStackTrace(); } finally { out.close(); } } private static Cell setCellStyleWithStyleAndValue(CellStyle style, Cell cell, String value) { cell.setCellStyle(style); cell.setCellValue(value); return cell; } private static Cell setCellStyleWithValue(Cell cell, String value) { cell.setCellStyle(cellstyle); cell.setCellValue(value); return cell; } private static Cell setCellStyleWithStyleAndValue(CellStyle style, Cell cell, RichTextString value) { cell.setCellStyle(style); cell.setCellValue(value); return cell; } private static Cell setCellStyleWithValue(Cell cell, int value) { cell.setCellStyle(cellstyle); cell.setCellValue(value); return cell; } private static Cell setCellStyleWithValue(Cell cell, double value) { cell.setCellStyle(cellstyle); cell.setCellValue(value); return cell; } private static HSSFCellStyle createCellStyle(Workbook wb) { cellstyle = (HSSFCellStyle) wb.createCellStyle(); cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); cellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); cellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); cellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN); cellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN); cellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return cellstyle; } }
step4:啟動項目,然后測試一下,看!完美的導出了。。。有圖為證
上述內容就是在java后臺使用Apache poi 實現生成一個excel文檔并提供前臺下載,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。