java 导出excel表格并下载(poi)
生活随笔
收集整理的這篇文章主要介紹了
java 导出excel表格并下载(poi)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先聲明一下我這邊的環境:idea+jdk1.8+springboot+maven
首先是導包。特別提醒:導包的時候可以從maven中選取最新的包,但兩個包的版本要互相兼容,不然可能會因為某個包中需要的方法,在另一個包中找不到而報錯。
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency>然后就是生成表格的工具類,工具類上會有詳細注釋,同時提供了將顏色碼,轉為 XSSFColor 的工具類,畢竟作為一個傳統的碼農,讓我用二維數組的方式表示顏色,還是很困難的,言歸正傳,上代碼
package com.ymkj.ccb_order.poi;import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URLEncoder; import java.util.List;public class ExportExcelUtils {/*** 下載文件* @param response* @param fileName* @param data* @throws Exception*/public static void exportExcel(HttpServletResponse response, String fileName, ExcelData data) throws Exception {// 告訴瀏覽器用什么軟件可以打開此文件response.setHeader("content-Type", "application/vnd.ms-excel");// 下載文件的默認名稱response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));exportExcel(data, response.getOutputStream());}/*** 創建 表格* @param data* @param out* @throws Exception*/public static void exportExcel(ExcelData data, OutputStream out) throws Exception {XSSFWorkbook wb = new XSSFWorkbook();try {String sheetName = data.getName();if (null == sheetName) {sheetName = "Sheet1";}XSSFSheet sheet = wb.createSheet(sheetName);writeExcel(wb, sheet, data);wb.write(out);} finally {wb.close();}}/*** 將數據寫入表格* @param wb* @param sheet* @param data*/private static void writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {int rowIndex = 0;rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles());writeRowsToExcel(wb, sheet, data.getRows(), rowIndex);autoSizeColumns(sheet, data.getTitles().size() + 1);}/*** 寫入表頭* @param wb* @param sheet* @param titles* @return*/private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List<String> titles) {int rowIndex = 0;int colIndex = 0;Font titleFont = wb.createFont();//獲取字體titleFont.setFontName("simsun");//設置字體名稱(宋體)titleFont.setBold(true);//設置字體加粗titleFont.setColor(IndexedColors.BLACK.index);//設置字體顏色 黑色XSSFCellStyle titleStyle = wb.createCellStyle();//獲取單元格樣式titleStyle.setAlignment(HorizontalAlignment.CENTER);//設置單元格的水平對齊類型(這里是水平居中)titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//設置單元格的垂直對齊類型(這里是居中)titleStyle.setFillForegroundColor(createXssfColor("#FFFFFF"));//設置單元格前景色(白色)titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//指定圖案和純色單元格填充的單元格填充信息(實心前景)titleStyle.setFont(titleFont);//設置字體樣式setBorder(titleStyle, BorderStyle.THIN, createXssfColor("#000000"));//設置邊框樣式(細線、黑色)Row titleRow = sheet.createRow(rowIndex);//在該工作簿中創建第一行.colIndex = 0;for (String field : titles) {//循環創建列Cell cell = titleRow.createCell(colIndex);cell.setCellValue(field);cell.setCellStyle(titleStyle);colIndex++;}rowIndex++;//將行數++ 返回用于下面添加數據return rowIndex;}/*** 將數據寫入* @param wb* @param sheet* @param rows* @param rowIndex* @return*/private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex) {int colIndex = 0;Font dataFont = wb.createFont();//獲取字體dataFont.setFontName("simsun");//設置字體名稱(宋體)dataFont.setColor(IndexedColors.BLACK.index);//設置字體顏色 黑色XSSFCellStyle dataStyle = wb.createCellStyle();//獲取單元格樣式dataStyle.setAlignment(HorizontalAlignment.CENTER);//設置單元格的水平對齊類型(這里是水平居中)dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);//設置單元格的垂直對齊類型(這里是居中)dataStyle.setFont(dataFont);//設置字體樣式setBorder(dataStyle, BorderStyle.THIN, createXssfColor("#000000"));//設置邊框樣式(細線、黑色)for (List<Object> rowData : rows) {//循環寫入數據Row dataRow = sheet.createRow(rowIndex);colIndex = 0;for (Object cellData : rowData) {Cell cell = dataRow.createCell(colIndex);if (cellData != null) {cell.setCellValue(cellData.toString());} else {cell.setCellValue("");}cell.setCellStyle(dataStyle);colIndex++;}rowIndex++;}return rowIndex;}/*** 自動調整大小* @param sheet* @param columnNumber*/private static void autoSizeColumns(Sheet sheet, int columnNumber) {for (int i = 0; i < columnNumber; i++) {int orgWidth = sheet.getColumnWidth(i);sheet.autoSizeColumn(i, true);int newWidth = (int) (sheet.getColumnWidth(i) + 100);if (newWidth > orgWidth) {sheet.setColumnWidth(i, newWidth);} else {sheet.setColumnWidth(i, orgWidth);}}}/*** 設置表格樣式* @param style* @param border* @param color*/private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) {style.setBorderTop(border);style.setBorderLeft(border);style.setBorderRight(border);style.setBorderBottom(border);style.setBorderColor(XSSFCellBorder.BorderSide.TOP, color);style.setBorderColor(XSSFCellBorder.BorderSide.LEFT, color);style.setBorderColor(XSSFCellBorder.BorderSide.RIGHT, color);style.setBorderColor(XSSFCellBorder.BorderSide.BOTTOM, color);}/*** 將rgb顏色碼 轉換為 XSSFColor* @param color* @return*/private static XSSFColor createXssfColor(String color) {int[] rgbColor = hexToRgb(color);XSSFColor xssfColor = new XSSFColor(new java.awt.Color(rgbColor[0], rgbColor[1], rgbColor[2]), new DefaultIndexedColorMap());return xssfColor;}/*** 將顏色碼 轉換為 r g b* @param hex* @return*/public static int[] hexToRgb(String hex) {String colorStr = hex;if (hex.startsWith("#")) {colorStr = hex.substring(1);}if (StringUtils.length(colorStr) == 8) {colorStr = hex.substring(2);}int r= Integer.valueOf( colorStr.substring( 0, 2 ), 16 );int g= Integer.valueOf( colorStr.substring( 2, 4 ), 16 );int b= Integer.valueOf( colorStr.substring( 4, 6 ), 16 );return new int[] { r, g, b };}}?工具中用到的實體類(其中的@Data注解是 lombok 中的注解,意思是注入set、get、tostring等方法,若沒有使用lombok可將該注解去掉,自寫set、get方法)
package com.ymkj.ccb_order.poi;import lombok.Data;import java.io.Serializable; import java.util.List; @Data public class ExcelData implements Serializable {private static final long serialVersionUID = 4454016249210520899L;/*** 表頭*/private List<String> titles;/*** 數據*/private List<List<Object>> rows;/*** 頁簽名稱*/private String name;}測試類:
package com.ymkj.ccb_order.controller;import com.ymkj.ccb_order.poi.ExcelData; import com.ymkj.ccb_order.poi.ExportExcelUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List;@RestController public class ExcelController {@RequestMapping(value = "/excel", method = RequestMethod.GET)public void excel(HttpServletResponse response) throws Exception {ExcelData data = new ExcelData();data.setName("hello");List<String> titles = new ArrayList();titles.add("姓名");titles.add("性別");titles.add("年齡");titles.add("手機號");data.setTitles(titles);List<List<Object>> rows = new ArrayList();List<Object> row1 = new ArrayList();row1.add("張三");row1.add("男");row1.add("23");row1.add("18612341234");List<Object> row2 = new ArrayList();row2.add("李四");row2.add("女");row2.add("24");row2.add("15312341234");rows.add(row1);rows.add(row2);data.setRows(rows);ExportExcelUtils.exportExcel(response,"聯系人表.xlsx",data);} }下載效果:
總結
以上是生活随笔為你收集整理的java 导出excel表格并下载(poi)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS精灵 background-pos
- 下一篇: 原创:姜子牙为何不劝伯邑考别进宫