JXL导出Excel数据表

编程技术  /  houtizong 发布于 3年前   56

JXL导出Excel数据表

 

封装了一个简单易用、通用、动态的从数据库导出到Excel的方法,可以动态的指定导出那些列,显示什么名字,按什么顺序显示;支持本地文件存储和JSP/Servlet文件下载。

本方法包括两个类,Column是辅助类,Excel是主类:

Column:

 

/**  * 用于Excel导出的辅助类,映射数据结果集(ResultSet)内列名的元数据和Excel内的显示列名   */  public class Column {      private int index;      private String metaName;      private String displayName;      private int length;        /**      * 构造函数      *       * @param index      *            显示顺序,0 为显示的第一列      * @param meta      *            元列名,在ResultSet内的名字,必须大写      * @param display      *            显示列名,在Excel内的显示,可以是任何文字      * @param length      *            列名长度      */      public Column(int index, String meta, String display,int length) {          this.index = index;          this.metaName = meta;          this.displayName = display;          this.length = length;      }        /**      * 显示列名,在Excel内的显示,可以是任何文字      *       * @return      */      public String getDisplayName() {          return displayName;      }        /**      * 显示顺序,0 为显示的第一列      *       * @return      */      public int getIndex() {          return index;      }        /**      * 元列名,在ResultSet内的名字,必须大写      *       * @return      */      public String getMetaName() {          return metaName;      }        public void setDisplayName(String displayName) {          this.displayName = displayName;      }        public void setIndex(int index) {          this.index = index;      }        public void setMetaName(String metaName) {          this.metaName = metaName;      }        public int getLength() {          return length;      }        public void setLength(int length) {          this.length = length;      }  }  

Excel:

   /**

     * 从数据库读数据,写入Excel      *       * @param os      *            数据流,如果是写本地文件的话,可以是FileOutputStream;      *            如果是写Web下载的话,可以是ServletOupputStream      * @param title      *            Excel工作簿的标题,如果不用的话,可以写null或者""      * @param rs      *            数据结果集      * @param map      *            数据结果集对应Excel表列名映射:key对应数据结果集的列名,必须是大写; value,目前只能对应Column对象      * @throws Exception      *             方法内的父类异常有SQLException和IOException      */      public static void export(OutputStream os, String title, ResultSet rs,              Map map) throws Exception {            jxl.write.WritableWorkbook wbook = Workbook.createWorkbook(os); // 建立excel文件          jxl.write.WritableSheet wsheet = wbook.createSheet("第一页", 0); // sheet名称          jxl.write.Label wlabel = null; // Excel表格的Cell                    ResultSetMetaData rsmd = rs.getMetaData();          int count = rsmd.getColumnCount();                    // 如果有标题的话,要设置一下偏移          int offset = 1;          if (title == null || title.trim().equals(""))              offset = 0;          else {              // 设置标题字体              int numTitle = 18;// 列名字体大小              jxl.write.WritableFont titleFont = new jxl.write.WritableFont(              WritableFont.createFont("宋体"), numTitle, WritableFont.BOLD);              jxl.write.WritableCellFormat titleFormat = new jxl.write.WritableCellFormat(titleFont);              titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条              titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐              titleFormat.setAlignment(Alignment.CENTRE); // 水平对齐                // 添加excel标题              jxl.write.Label wlabel1 = new jxl.write.Label(0, 0, title, titleFormat);                      wsheet.addCell(wlabel1);              wsheet.mergeCells(0, 0, count-1, 0);//合并单元格          }           // 设置列名字体          int charTitle = 12;// 列名字体大小          jxl.write.WritableFont columnFont = new jxl.write.WritableFont(          WritableFont.createFont("宋体"), charTitle, WritableFont.BOLD);            jxl.write.WritableCellFormat columnFormat = new jxl.write.WritableCellFormat(                  columnFont);          columnFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条          columnFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐          columnFormat.setAlignment(Alignment.CENTRE); // 水平对齐          columnFormat.setWrap(true); // 是否换行          columnFormat.setBackground(Colour.GRAY_25);// 背景色暗灰-25%                    // 根据原数据和map来创建Excel的列名                    for (int i = 1; i <= count; i++) {              String name = rsmd.getColumnName(i).toUpperCase();              if (map.containsKey(name)) {                  Column col = (Column) map.get(name);                  wlabel = new jxl.write.Label(col.getIndex(), offset, col                          .getDisplayName(),columnFormat);                  wsheet.setColumnView(i-1, col.getLength()); // 设置列宽,第1列                  wsheet.addCell(wlabel);              }          }            // 设置正文字体          int charNormal = 10;// 标题字体大小          WritableFont normalFont = new WritableFont(WritableFont            .createFont("宋体"), charNormal);          jxl.write.WritableCellFormat normalFormat = new jxl.write.WritableCellFormat(            normalFont);          normalFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条          normalFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐          normalFormat.setAlignment(Alignment.CENTRE);// 水平对齐          normalFormat.setWrap(true); // 是否换行                    // 往Excel输出数据          int rowIndex = 1 + offset;          Collection array = map.values();          while (rs.next()) {              Iterator it = array.iterator();              while (it.hasNext()) {                  Column col = (Column) it.next();                  String value = rs.getString(col.getMetaName());                  wlabel = new jxl.write.Label(col.getIndex(), rowIndex, value,normalFormat);                  wsheet.addCell(wlabel);              }              rowIndex++;          }          wbook.write(); // 写入文件          wbook.close();          os.flush();          os.close();      }  }  

 //JSP页面的下载如下,同样的代码也可以改成Servlet的

  <%

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客