Java使用POI导出Excel文件

上一篇我们说到Java使用POI操作Excel,对Excel文件进行解析,并将数据导入到数据库中,今天这篇来分享一个Java封装的工具类,将数据库查询到的数据进行Excel形式的导出。

具体的说明都在工具类的注释中,调用该工具类的方法需要传几个参数,一个是导出文件的标题,一个是数据库查出的数据集合,还有一个输出流对象,然后调用该方法就能导出Excel文件。

public static void exportExcptDetails(String sheetTitle,
			List<Map<String, String>> columnList,
			List<DataModel> valueList, OutputStream out) {
  XSSFWorkbook workBook = new XSSFWorkbook();
  // 生成一个表格
  XSSFSheet sheet = workBook.createSheet(sheetTitle);

  // 样式
  XSSFCellStyle headerStyle = workBook.createCellStyle();
  // 生成一个头部样式 底纹为蓝色,汉字加租,加边框,居中显示
  // 设置样式HSSFColor.BLUE_GREY.index
  headerStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
  headerStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
  headerStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
  headerStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
  headerStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
  headerStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
  headerStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);

  // 生成一个字体
  XSSFFont font = workBook.createFont();
  font.setColor(HSSFColor.WHITE.index);
  font.setFontHeightInPoints((short) 11);
  font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  headerStyle.setWrapText(true);
  // 把生成的字体给当前的样式使用
  headerStyle.setFont(font);

  XSSFCellStyle bodystyle = workBook.createCellStyle();
  // 生产主体的样式 各列数据居中显示,加边框
  bodystyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
  bodystyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
  bodystyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
  bodystyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
  bodystyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);

  // 设置表格默认列宽度为20个字节
  sheet.setDefaultColumnWidth(20);
  // 画图
  XSSFDrawing patriarch = sheet.createDrawingPatriarch();
  // /:在第一行,插入表头
  XSSFRow row = sheet.createRow(0);
  XSSFCell cell = null;
  Map<String, String> maphead = null;

  for (int i = 0; i < columnList.size(); i++) {
    // list集合从0开始 故i-1
    maphead = columnList.get(i);
    cell = row.createCell(Integer.parseInt(maphead.get("ORDERID")
                                           .toString()));
    cell.setCellValue(maphead.get("NAME_ZH") == null ? "" : maphead
                      .get("NAME_ZH").toString());

    sheet.setColumnWidth(
      i,
      (maphead.get("NAME_ZH") == null ? "" : maphead.get(
        "NAME_ZH").toString()).getBytes().length * 2 * 256); // 设置自动列宽
    //			headerStyle.setLocked(true); // 设置锁定
    cell.setCellStyle(headerStyle);
  }

  // 从第二行开始插入数据 i 表示行数,故i=1
  XSSFRow rows = null;
  // key值
  String value = "";
  // 列值
  String mapValue = "";
  // 数据集合列表
  DataModel map = null;
  // 列信息
  Map<String, String> mapBody = null;

  //值的集合不为空才进行遍历
  if (valueList != null) {
    for (int i = 1; i <= valueList.size(); i++) {// 循环查询到的指
      // valueList集合从0开始 故i-1
      map = (DataModel) valueList.get(i - 1);
      rows = sheet.createRow(i);
      for (int j = 0; j < columnList.size(); j++) {// 循环取字段 列数
        // list集合从0开始 故i-1
        mapBody = columnList.get(j);
        cell = rows.createCell(Integer.parseInt(mapBody.get("ORDERID")
                                                .toString()));
        value = mapBody.get("NAME_EN") == null ? "" : mapBody.get(
          "NAME_EN").toString();
        mapValue = map.get(value) == null ? "" : map.get(value)
          .toString();

        cell.setCellValue(mapValue);
        //				bodystyle.setLocked(true); // 设置锁定
        cell.setCellStyle(bodystyle);
      }
    }
  }
  try {
    workBook.write(out);
    out.flush();
    out.close();
  } catch (Exception e) {
    log.error(e.getMessage(), e);
    e.printStackTrace();
  }
}

类似的还有导出PDF的工具类,以后有用到的场景,再进行分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当一艘船沉入海底8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值