java后台導出數據生成excel


感謝我同事分享的工具類 我覺得比較好用就分享出來= =

  1 package com.tianyan.school.utils;
  2 
  3 import org.apache.poi.hssf.usermodel.*;
  4 import org.apache.poi.ss.usermodel.Cell;
  5 import org.apache.poi.ss.util.CellRangeAddress;
  6 import org.apache.poi.xssf.usermodel.*;
  7 
  8 import javax.servlet.http.HttpServletRequest;
  9 import javax.servlet.http.HttpServletResponse;
 10 import javax.validation.constraints.NotNull;
 11 import javax.validation.constraints.Null;
 12 import java.io.*;
 13 import java.net.URLEncoder;
 14 import java.util.ArrayList;
 15 import java.util.List;
 16 import java.util.Map;
 17 import java.util.Set;
 18 import java.util.regex.Matcher;
 19 import java.util.regex.Pattern;
 20 
 21 /**
 22  *   單表頭 多表頭  多sheet頁導出
 23  *
 24  * @author qhp
 25  */
 26 public class ExcelUtil {
 27 
 28 
 29     /**
 30      * 用於正則表達式判斷private static修飾可以更快匹配
 31      */
 32     private static Pattern pattern = Pattern.compile("-?[0-9]*\\.?[0-9]+");
 33 
 34     /**
 35      * 導出Excel
 36      *
 37      * @param sheetName sheet名稱
 38      * @param title     標題
 39      * @param values    內容
 40      * @param wb        HSSFWorkbook對象
 41      * @return
 42      */
 43     public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
 44 
 45         // 第一步,創建一個HSSFWorkbook,對應一個Excel文件
 46         if (wb == null) {
 47             wb = new HSSFWorkbook();
 48         }
 49         // 第二步,在workbook中添加一個sheet,對應Excel文件中的sheet
 50         HSSFSheet sheet = wb.createSheet(sheetName);
 51         for (int i = 0; i < 32; i++) {
 52             sheet.setColumnWidth(i, 256 * 20 + 184);
 53         }
 54         // 第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制
 55         HSSFRow row = sheet.createRow(0);
 56         // 第四步,創建單元格,並設置值表頭 設置表頭居中
 57         HSSFCellStyle style = wb.createCellStyle();
 58         // 創建一個居中格式
 59         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
 60         HSSFFont font = wb.createFont();
 61         font.setFontName("黑體");
 62         //設置字體大小
 63         font.setFontHeightInPoints((short) 14);
 64         style.setFont(font);
 65         //聲明列對象
 66         HSSFCell cell = null;
 67         //創建標題
 68         for (int i = 0; i < title.length; i++) {
 69             cell = row.createCell(i);
 70             cell.setCellValue(title[i]);
 71             cell.setCellStyle(style);
 72         }
 73         //創建內容
 74         for (int i = 0; i < values.length; i++) {
 75             row = sheet.createRow(i + 1);
 76             for (int j = 0; j < values[i].length; j++) {
 77                 //將內容按順序賦給對應的列對象
 78                 cell = row.createCell(j);
 79                 if (values[i][j] == null || "".equals(values[i][j])) {
 80                     continue;
 81                 } else {
 82                     cell.setCellValue(values[i][j]);
 83                 }
 84             }
 85         }
 86         return wb;
 87     }
 88 
 89 
 90 
 91 
 92 
 93     /**
 94      * 導出Excel
 95      *
 96      * @param sheetName sheet名稱
 97      * @param title     標題1
 98      * @param values    內容
 99      * @param wb        HSSFWorkbook對象
100      * @param title1    標題2
101      * @param headnum0  標題1位置
102      * @param headnum1  標題2位置
103      * @return 兩行列名
104      */
105     public static HSSFWorkbook getHSSFWorkbookTwo(String sheetName, String[] title, String[] title1, String[] headnum0, String[] headnum1, String[][] values, HSSFWorkbook wb) {
106         // 第一步,創建一個HSSFWorkbook,對應一個Excel文件
107         if (wb == null) {
108             wb = new HSSFWorkbook();
109             HSSFCellStyle cellStyle = wb.createCellStyle();
110             // 設置背景色
111             cellStyle.setFillForegroundColor((short) 13);
112             cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
113             //下邊框
114             cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
115             //左邊框
116             cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
117             //上邊框
118             cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
119             //右邊框
120             cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
121         }
122         // 第二步,在workbook中添加一個sheet,對應Excel文件中的sheet
123         HSSFSheet sheet = wb.createSheet(sheetName);
124         for (int i = 0; i < 32; i++) {
125             sheet.setColumnWidth(i, 256 * 20 + 184);
126         }
127         // 第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制
128         HSSFRow row = sheet.createRow(0);
129         // 第四步,創建單元格,並設置值表頭 設置表頭居中
130         HSSFCellStyle style = wb.createCellStyle();
131         // 創建一個居中格式
132         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
133         HSSFFont font = wb.createFont();
134         font.setFontName("黑體");
135         //設置字體大小
136         font.setFontHeightInPoints((short) 14);
137         //粗體顯示
138         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
139         style.setFont(font);
140         //聲明列對象
141         HSSFCell cell = null;
142         //創建標題
143         for (int i = 0; i < title.length; i++) {
144             cell = row.createCell(i);
145             cell.setCellValue(title[i]);
146             cell.setCellStyle(style);
147         }
148         for (int i = 0; i < headnum0.length; i++) {
149             String[] temp = headnum0[i].split(",");
150             Integer startrow = Integer.parseInt(temp[0]);
151             Integer overrow = Integer.parseInt(temp[1]);
152             Integer startcol = Integer.parseInt(temp[2]);
153             Integer overcol = Integer.parseInt(temp[3]);
154             sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,
155                     startcol, overcol));
156         }
157         row = sheet.createRow(1);
158         for (int i = 0; i < title1.length; i++) {
159             cell = row.createCell(i);
160             cell.setCellValue(title1[i]);
161             cell.setCellStyle(style);
162         }
163         //動態合並單元格
164         for (int i = 0; i < headnum1.length; i++) {
165             String[] temp = headnum1[i].split(",");
166             Integer startrow = Integer.parseInt(temp[0]);
167             Integer overrow = Integer.parseInt(temp[1]);
168             Integer startcol = Integer.parseInt(temp[2]);
169             Integer overcol = Integer.parseInt(temp[3]);
170             sheet.addMergedRegion(new CellRangeAddress(startrow, overrow,
171                     startcol, overcol));
172         }
173         for (int i = 0; i < values.length; i++) {
174             row = sheet.createRow(i + 2);
175             for (int j = 0; j < values[i].length; j++) {
176                 //將內容按順序賦給對應的列對象
177                 cell = row.createCell(j);
178                 if (values[i][j] == null || "".equals(values[i][j])) {
179                     continue;
180                 } else {
181                     cell.setCellValue(values[i][j]);
182                 }
183             }
184         }
185         return wb;
186     }
187 
188     public static void setResponseHeader(HttpServletRequest request, HttpServletResponse response, String fileName) {
189         try {
190             final String userAgent = request.getHeader("USER-AGENT").toLowerCase();
191             response.reset();
192             response.setCharacterEncoding("UTF-8");
193             if (userAgent.contains("MSIE")) {
194                 //IE瀏覽器
195                 fileName = URLEncoder.encode(fileName, "UTF-8");
196             } else if (userAgent.contains("MOZILLA") || userAgent.contains("FIREFOX")) {
197                 fileName = new String(fileName.getBytes(), "ISO8859-1");
198             } else if (userAgent.contains("EDGE")) {
199                 fileName = URLEncoder.encode(fileName, "UTF-8").replace("+", " ");
200             } else {
201                 //其他瀏覽器
202                 fileName = URLEncoder.encode(fileName, "UTF-8");
203             }
204             response.setContentType("application/octet-stream;charset=ISO8859-1");
205             response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
206             response.addHeader("Pargam", "no-cache");
207             response.addHeader("Cache-Control", "no-cache");
208         } catch (Exception ex) {
209             ex.printStackTrace();
210         }
211     }
212 
213     public static boolean isNumeric(String str) {
214         Matcher isNum = pattern.matcher(str);
215         if (!isNum.matches()) {
216             return false;
217         }
218         return true;
219     }
220 
221     /**
222      * @param list
223      * @param sheet
224      * @Time 2018-11-13
225      */
226     public static void multipleExcel(@NotNull List<Map<String, Object>> list, XSSFSheet sheet) {
227         List<Object[]> dataList = new ArrayList<Object[]>();
228         // 取下標為0得元素
229         if (list == null || list.size() <= 0) {
230             return;
231         }
232         Map s = list.get(0);
233         // 動態獲取表頭
234         Set<String> set = s.keySet();
235         List<String> rowName = new ArrayList<>(set);
236         // 循環所有數據
237         for (int i = 0; i < list.size(); i++) {
238             Map h = list.get(i);
239             // 創建一個數組
240             Object[] a = new Object[rowName.size()];
241             // 根據表頭獲取值
242             for (int j = 0; j < set.size(); j++) {
243                 a[j] = h.get(rowName.get(j));
244             }
245             // 存入集合中
246             dataList.add(a);
247         }
248 
249         // 定義所需列數
250         int columnNum = rowName.size();
251         XSSFRow rowRowName = sheet.createRow(0);
252 
253         // 將列頭設置到sheet的單元格中
254         for (int n = 0; n < columnNum; n++) {
255             // 創建列頭對應個數的單元格
256             XSSFCell cellRowName = rowRowName.createCell(n);
257             // 設置列頭單元格的數據類型
258             cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
259             // 設置列頭單元格的值
260             XSSFRichTextString text = new XSSFRichTextString(rowName.get(n));
261             cellRowName.setCellValue(text);
262         }
263         // 將查詢出的數據設置到sheet對應的單元格中
264         for (int i = 0; i < dataList.size(); i++) {
265             // 遍歷每個對象
266             Object[] obj = dataList.get(i);
267             // 創建所需的行數
268             XSSFRow row = sheet.createRow(i + 1);
269             for (int j = 0; j < obj.length; j++) {
270                 // 設置單元格的數據類型
271                 XSSFCell cell = null;
272                 cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);
273                 if (!"".equals(obj[j]) && obj[j] != null) {
274                     // 設置單元格的值
275                     cell.setCellValue(obj[j].toString());
276 
277                 }
278             }
279         }
280     }
281 
282 
283     /**
284      * 將臨時文件下載到本地並刪除臨時文件
285      *
286      * @param tempFile 文件路徑
287      * @param workbook 工作表
288      * @param fileName 文件名
289      * @param response
290      */
291     public static void fileExcel(File tempFile, XSSFWorkbook workbook, String fileName, HttpServletResponse response) {
292 
293         FileOutputStream out = null;
294         FileInputStream in = null;
295         OutputStream out1 = null;
296         try {
297             out = new FileOutputStream(tempFile);
298             workbook.write(out);
299             out1 = response.getOutputStream();
300             byte[] b = new byte[1024];
301             response.setCharacterEncoding("utf-8");
302             fileName = URLEncoder.encode(fileName, "UTF-8");
303             response.setHeader("content-disposition", "attachment; filename=" + fileName);
304             in = new FileInputStream(tempFile);
305             int n;
306             while ((n = in.read(b)) != -1) {
307                 out1.write(b, 0, n);
308             }
309 
310         } catch (Exception e) {
311             e.printStackTrace();
312         } finally {
313             if (in != null) {
314                 try {
315                     in.close();
316                 } catch (IOException e) {
317                     e.printStackTrace();
318                 }
319             }
320             if (out != null) {
321                 try {
322                     out.close();
323                 } catch (IOException e) {
324 
325                     e.printStackTrace();
326                 }
327             }
328             if (out1 != null) {
329                 try {
330                     out1.close();
331                 } catch (IOException e) {
332                     e.printStackTrace();
333                 }
334             }
335             if (tempFile.exists()) {
336                 tempFile.delete();
337             }
338         }
339 
340     }
341 
342     public static List<List<String>> readXls(String path) throws Exception {
343         InputStream is = new FileInputStream(path);
344         // HSSFWorkbook 標識整個excel
345         XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);
346         List<List<String>> result = new ArrayList<List<String>>();
347         int size = hssfWorkbook.getNumberOfSheets();
348         // 循環每一頁,並處理當前循環頁
349         for (int numSheet = 0; numSheet < size; numSheet++) {
350             // HSSFSheet 標識某一頁
351             XSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
352             if (hssfSheet == null) {
353                 continue;
354             }
355             // 處理當前頁,循環讀取每一行
356             for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
357                 // HSSFRow表示行
358                 XSSFRow hssfRow = hssfSheet.getRow(rowNum);
359                 int minColIx = hssfRow.getFirstCellNum();
360                 int maxColIx = hssfRow.getLastCellNum();
361                 List<String> rowList = new ArrayList<String>();
362                 // 遍歷改行,獲取處理每個cell元素
363                 for (int colIx = minColIx; colIx < maxColIx; colIx++) {
364                     // HSSFCell 表示單元格
365                     XSSFCell cell = hssfRow.getCell(colIx);
366                     if (cell == null) {
367                         continue;
368                     }
369                     rowList.add(getStringVal(cell));
370                 }
371                 result.add(rowList);
372             }
373         }
374         return result;
375     }
376 
377     public static String getStringVal(XSSFCell cell) {
378         switch (cell.getCellType()) {
379             case Cell.CELL_TYPE_BOOLEAN:
380                 return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
381             case Cell.CELL_TYPE_FORMULA:
382                 return cell.getCellFormula();
383             case Cell.CELL_TYPE_NUMERIC:
384                 cell.setCellType(Cell.CELL_TYPE_STRING);
385                 return cell.getStringCellValue();
386             case Cell.CELL_TYPE_STRING:
387                 return cell.getStringCellValue();
388             default:
389                 return "";
390         }
391     }
392 }
工具類
 public void exportBigItem(HttpServletRequest request, HttpServletResponse response) {
        try {
            TreeMap<String, Object> map = RequestUtils.getParameterMapObject(request);
            String shour = "";
            List<BigItem> list = new ArrayList<>();
            //天級
            if (Constant.Selector.DAY.equals(map.get("timeType"))) {
                Date dateD = new SimpleDateFormat("yyyy-MM-dd").parse(shour);
                shour = new SimpleDateFormat("yyyyMMdd").format(dateD);
                map.put("shour", shour);
                list = rptVolteOverviewDMapper.excelBigItem(map);   
            } else {
                Date dateH = new SimpleDateFormat("yyyy-MM-dd HH").parse(shour);
                shour = new SimpleDateFormat("yyyyMMddHH").format(dateH);
                map.put("shour", shour);
                list = rptVolteOverviewHMapper.excelBigItem(map);   //查詢語句 按小時來
            }
            //判斷小區還是切片
            String type = "";
            String dataType = request.getParameter("dataType");
            if (Constant.Selector.CI.equals(dataType)) {
                type = "XX";
            } else {
                type = "XX";
            }
            //excel標題
            String[] title = {"XX", "XX" + type + "數", "XX", "XX", "XX", "XX", "XX", "XX",                 //表頭   手寫  與下面的一一對應
                    "XXX", "XXX", "XXX", "XXX", "XXX", "XXX",
                    "XXX",
                    "X",
                    "X"
            };
            //excel文件名
            String fileName = "xxx報表" + shour + ".xls";
            //sheet名
            String sheetName = "xxx報表";
            String[][] content = new String[list.size()][17];
            for (int i = 0; i < list.size(); i++) {
                BigItem bigItem = list.get(i);                            //創建一個實體  每一個i就代表一行
                content[i][0] = bigItem.getScity();                    
                content[i][1] = bigItem.getLowQuality();            
                content[i][2] = bigItem.getFault();
                content[i][3] = bigItem.getCover();
                content[i][4] = bigItem.getInterference();
                content[i][5] = bigItem.getCapacity();
                content[i][6] = bigItem.getParameter();
                content[i][7] = bigItem.getOthers();
                content[i][8] = bigItem.getCoreNetwork();
                content[i][9] = bigItem.getUlLostPacketRate();
                content[i][10] = bigItem.getDlLostPacketRate();
                content[i][11] = bigItem.getVolteDropRate();
                content[i][12] = bigItem.getEsrvccSuccessRate();
                content[i][13] = bigItem.getVolteSuccessRate();
                content[i][14] = bigItem.getFrrcSucConEstrRate();
                content[i][15] = bigItem.getFerabSucEstRate();
                content[i][16] = bigItem.getFwlsSucCallRate();
            }
            //創建HSSFWorkbook
            HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
            //響應到客戶端
            ExcelUtil.setResponseHeader(request, response, fileName);
            OutputStream os = response.getOutputStream();
            wb.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            log.error("導出異常!" + e.getMessage());
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM