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());
        }
    }

猜你喜欢

转载自www.cnblogs.com/joenSu/p/11750493.html