美文网首页
POI导出工具类

POI导出工具类

作者: 周六不算加班 | 来源:发表于2018-12-12 17:54 被阅读30次

1、导入相关的类

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>

2、工具类

public class ExcelUtils {

  static Logger logger = LogManager.getLogger(ExcelUtils.class);
  // excel默认宽度;
  private static int width = 256 * 14;
  // 默认字体
  private static String excelfont = "微软雅黑";

  /**
   * 
   * @param excelName
   *            导出的EXCEL名字
   * @param sheetName
   *            导出的SHEET名字 当前sheet数目只为1
   * @param headers
   *            导出的表格的表头
   * @param ds_titles
   *            导出的数据 map.get(key) 对应的 key
   * @param ds_format
   *            导出数据的样式 1:String left; 2:String center 3:String right 4 int right
   *            5:float ###,###.## right 6:number: #.00% 百分比 right
   * @param widths
   *            表格的列宽度 默认为 256*14
   * @param data
   *            数据集 List<Map>
   * @param response
   * @throws IOException
   */
  public static void export(String excelName, String sheetName, List<String> headers, List<String> ds_titles,
        int[] ds_format, int[] widths, List<Map<String, Object>> data, HttpServletRequest request,
        HttpServletResponse response) throws IOException {
    HttpSession session = request.getSession();
    // session.setAttribute("state", null);
    logger.info("export->");
    if (widths == null) {
        widths = new int[ds_titles.size()];
        for (int i = 0; i < ds_titles.size(); i++) {
            widths[i] = width;
        }
    }
    if (ds_format == null) {
        ds_format = new int[ds_titles.size()];
        for (int i = 0; i < ds_titles.size(); i++) {
            ds_format[i] = 1;
        }
    }
    // 设置文件名
    String fileName = "";
    if (StringUtils.isNotEmpty(excelName)) {
        fileName = excelName;
    }
    // 创建一个工作薄
    @SuppressWarnings("resource")
    HSSFWorkbook wb = new HSSFWorkbook();
    // 创建一个sheet
    HSSFSheet sheet = wb.createSheet(StringUtils.isNotEmpty(sheetName) ? sheetName : "excel");
    // 创建表头,如果没有跳过
    int headerrow = 0;
    if (headers != null) {
        HSSFRow row = sheet.createRow(headerrow);
        // 表头样式
        HSSFCellStyle style = wb.createCellStyle();
        HSSFFont font = wb.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setFontName(excelfont);
        font.setFontHeightInPoints((short) 11);
        style.setFont(font);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        for (int i = 0; i < headers.size(); i++) {
            sheet.setColumnWidth((short) i, (short) widths[i]);
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(headers.get(i));
            cell.setCellStyle(style);
        }
        headerrow++;
    }
    // 表格主体 解析list
    if (data != null) {
        List<HSSFCellStyle> styleList = new ArrayList<>();

        for (int i = 0; i < ds_titles.size(); i++) { // 列数
            HSSFCellStyle style = wb.createCellStyle();
            HSSFFont font = wb.createFont();
            font.setFontName(excelfont);
            font.setFontHeightInPoints((short) 10);
            style.setFont(font);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            if (ds_format[i] == 1) {
                style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
            } else if (ds_format[i] == 2) {
                style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            } else if (ds_format[i] == 3) {
                style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
                // int类型
            } else if (ds_format[i] == 4) {
                style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
                // int类型
                style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0"));
            } else if (ds_format[i] == 5) {
                // float类型
                style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
                style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));
            } else if (ds_format[i] == 6) {
                // 百分比类型
                style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
                style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
            }
            styleList.add(style);
        }
        for (int i = 0; i < data.size(); i++) { // 行数
            HSSFRow row = sheet.createRow(headerrow);
            Map<String, Object> map = data.get(i);
            for (int j = 0; j < ds_titles.size(); j++) { // 列数
                HSSFCell cell = row.createCell(j);
                
                Object o = map.get(ds_titles.get(j));
                //增加对对象的处理
                if(o!=null&&!(o instanceof String)&&!(o instanceof Integer)&&!(o instanceof byte[])){
                      JSONObject obj= JSONObject.parseObject(o.toString());
                        if(obj.size()>1){
                            o=obj.get("value");
                        }   
                }
              
                if (o == null || "".equals(o)) {
                    cell.setCellValue("");
                } else if (ds_format[j] == 4) {
                    // int
                    cell.setCellValue((Long.valueOf(o + "")).longValue());
                } else if (ds_format[j] == 5 || ds_format[j] == 6) {
                    // float
                    cell.setCellValue((Double.valueOf(o + "")).doubleValue());
                } else {
                    cell.setCellValue(o + "");
                }

                cell.setCellStyle((HSSFCellStyle) styleList.get(j));
            }
            headerrow++;
        }
    }

    fileName = fileName + ".xls";

    response.setHeader("Content-disposition", fileName);
    response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    response.setHeader("Content-disposition", "attachment;filename=" +  new String(fileName.getBytes(),"ISO-8859-1"));
    response.setHeader("Pragma", "No-cache");
    response.setCharacterEncoding("UTF-8");
    OutputStream ouputStream = response.getOutputStream();
    wb.write(ouputStream);
    ouputStream.flush();
    ouputStream.close();
}

}

相关文章

网友评论

      本文标题:POI导出工具类

      本文链接:https://www.haomeiwen.com/subject/cdpphqtx.html