excel导出_excel导出数据 - CSDN
精华内容
参与话题
  • java导出excel的两种方式

    万次阅读 多人点赞 2019-04-05 10:24:31
    一、在后台实现,利用java的poi ...2、在util下写一个公共类,该类主要利用Jakarta POI HSSF API组件(用于操作Excel的组件),主要部分包括Excel对象,样式和格式,还有辅助操作。 常用组件: ...

    在这里插入图片描述
    一、在后台实现,利用java的poi
    1、导入jar包,需要导入lib文件夹下如下包:
    poi-3.11-20141221.jar
    poi-ooxml.jar
    poi-ooxml-schemas.jar
    2、在util下写一个公共类,该类主要利用Jakarta POI HSSF API组件(用于操作Excel的组件),主要部分包括Excel对象,样式和格式,还有辅助操作。

     常用组件:
        HSSFWorkbook        excel的文档对象
        HSSFSheet           excel的表单
        HSSFRow             excel的行
        HSSFCell            excel的格子单元
        HSSFFont            excel字体
        HSSFDataFormat      日期格式
        HSSFHeader         sheet头
        HSSFFooter         sheet尾(只有打印的时候才能看到效果)
    
        样式:
        HSSFCellStyle                       cell样式
        辅助操作包括:
        HSSFDateUtil                        日期
        HSSFPrintSetup                      打印
        HSSFErrorConstants                  错误信息表
    

    3、该类的操作代码如下:

    package com.bdqn.util;
    
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFRichTextString;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    public class ExportExcel {
    
      // 显示的导出表的标题
      private String title;
      // 导出表的列名
      private String[] rowName;
      private List<Object[]> dataList = new ArrayList<Object[]>();
    
      // 构造函数,传入要导出的数据
      public ExportExcel(String title, String[] rowName, List<Object[]> dataList) {
        this.dataList = dataList;
        this.rowName = rowName;
        this.title = title;
      }
    
      // 导出数据
      public void export(OutputStream out) throws Exception {
        try {
          HSSFWorkbook workbook = new HSSFWorkbook();
          HSSFSheet sheet = workbook.createSheet(title);
    
          // 产生表格标题行
          HSSFRow rowm = sheet.createRow(0);
          HSSFCell cellTitle = rowm.createCell(0);
          
          
          //sheet样式定义【】
          HSSFCellStyle columnTopStyle=this.getColumnTopStyle(workbook);
          HSSFCellStyle style=this.getStyle(workbook);
          sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1)));
          cellTitle.setCellStyle(columnTopStyle);
          cellTitle.setCellValue(title);
    
          // 定义所需列数
          int columnNum = rowName.length;
          HSSFRow rowRowName = sheet.createRow(2);
    
          // 将列头设置到sheet的单元格中
          for (int n = 0; n < columnNum; n++) {
            HSSFCell cellRowName = rowRowName.createCell(n);
            cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
            HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
            cellRowName.setCellValue(text);
            cellRowName.setCellStyle(columnTopStyle);
    
          }
          // 将查询到的数据设置到sheet对应的单元格中
          for (int i = 0; i < dataList.size(); i++) {
            Object[] obj = dataList.get(i);// 遍历每个对象
            HSSFRow row = sheet.createRow(i + 3);// 创建所需的行数
    
            for (int j = 0; j < obj.length; j++) {
              HSSFCell cell = null;
              if (j == 0) {
                cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC);
                cell.setCellValue(i + 1);
              } else {
                cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);
                if (!"".equals(obj[j]) && obj[j] != null) {
                  cell.setCellValue(obj[j].toString());
                }
              }
              cell.setCellStyle(style);
    
            }
    
          }
    
          // 让列宽随着导出的列长自动适应
          for (int colNum = 0; colNum < columnNum; colNum++) {
            int columnWidth = sheet.getColumnWidth(colNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
              HSSFRow currentRow;
              if (sheet.getRow(rowNum) == null) {
                currentRow = sheet.createRow(rowNum);
              } else {
                currentRow = sheet.getRow(rowNum);
              }
              if (currentRow.getCell(colNum) != null) {
                HSSFCell currentCell = currentRow.getCell(colNum);
                if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                  int length = currentCell.getStringCellValue().getBytes().length;
                  if (columnWidth < length) {
                    columnWidth = length;
                  }
                }
              }
            }
            if (colNum == 0) {
              sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
            } else {
              sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
            }
          }
    
          if (workbook != null) {
            try {
    
              workbook.write(out);
    
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
    
        } catch (Exception e) {
    
        }
      }
    

    4、单元格样式:

    /*
       * 列头单元格样式
       */
      public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
        // 设置字体
        HSSFFont font = workbook.createFont();
    
        // 设置字体大小
        font.setFontHeightInPoints((short) 11);
        // 字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置低边框
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置低边框颜色
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置右边框
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框
        style.setTopBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框颜色
        style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式中应用设置的字体
        style.setFont(font);
        // 设置自动换行
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
    
      }
    
      public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
        // 设置字体
        HSSFFont font = workbook.createFont();
        // 设置字体大小
        font.setFontHeightInPoints((short) 10);
        // 字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式;
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置底边框;
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置底边框颜色;
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置左边框;
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // 设置左边框颜色;
        style.setLeftBorderColor(HSSFColor.BLACK.index);
        // 设置右边框;
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // 设置右边框颜色;
        style.setRightBorderColor(HSSFColor.BLACK.index);
        // 设置顶边框;
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 设置顶边框颜色;
        style.setTopBorderColor(HSSFColor.BLACK.index);
        // 在样式用应用设置的字体;
        style.setFont(font);
        // 设置自动换行;
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
      }
    

    5、前台主要代码如下:
    5.1 第一种,我们没有传入页面的查询参数,到后台我们无论怎么查询,都是把整个数据库不分条件的全部导出。不能够满足用户需求,体验不好,不推荐。

      <button type="button" class="btn btn-success" id="delPro" "dao()">导出Excel</button>
    function dao() {
      location.href="MedicineAdminServlet?a=dao&pageon="+${page.pageon};
    }
    

    5、2第二种,我们往后台传入时,把查询的参数一并传入后台,后台接收后作为条件去数据库找符合条件的,查到符合条件的导出,比较人性化。

    <a href="SendMedicineServlet?a=dao&patientid=${param.patientid }&prescriptionid=${param.prescriptionid}&patientname=${param.patientname }&starttime=${param.starttime }&endtime=${param.endtime }">
              <button type="button" class="btn btn-success" id="delPro">导出Excel</button>
              </a>
    

    6、为了方便读者理解,前端页面如下:查询条件为病历号,姓名等,会根据曾经的查询条件导出。

    在这里插入图片描述

    7、后台servlet操作主要代码如下:(传入当前页将会只打印当前页)

    /**
         * 导出excel文件
         */
    
    else if (a.equals("dao")) {
      String patientid = request.getParameter("patientid");
      int patientid3 = 0;
      if (patientid != null && !patientid.equals("")) {
        patientid3 = Integer.parseInt(patientid);
      }
    
      String dname = request.getParameter("dname");
      String subjectroom = request.getParameter("subjectroom");
      String starttime = request.getParameter("starttime");
      String endtime = request.getParameter("endtime");
    
      // 页码
      int pageon = 1;
      String pageon1 = request.getParameter("pageon");
      if (pageon1 != null && !pageon1.equals("")) {
        pageon = Integer.parseInt(pageon1);
      }
      // 操作导出excel
      List<RegRum> selectlists = rs.querySelect2(patientid3, dname, subjectroom, starttime, endtime);
     //excel标题
      String title = "挂号信息表";
      //excel列头信息
      String[] rowsName = new String[] { "门诊编号", "主治医师", "挂号时间", "挂号科室", "状态" };
      List<Object[]> dataList = new ArrayList<Object[]>();
      Object[] objs = null;
      for (int i = 0; i < selectlists.size(); i++) {
        RegRum regRum = selectlists.get(i);
        objs = new Object[rowsName.length];
        objs[0] = regRum.getPatientid();
        objs[1] = regRum.getDoctor().getDname();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        objs[2] = regRum.getDate();
        objs[3] = regRum.getDoctor().getSubroomname();
        objs[4] = regRum.getStatus();
        dataList.add(objs);
    
      }
    

    8、下面这部分代码主要是把数据传给浏览器,前面部分告诉浏览器该数据流是什么类型的,本例传的是excel格式的,浏览器会自动判定为excel,提示是否保存。

    //给文件命名。随机命名
    String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
         //告诉浏览器数据格式,将头和数据传到前台
          String headStr = "attachment; filename=\"" + fileName + "\"";
          response.setContentType("APPLICATION/OCTET-STREAM");
          response.setHeader("Content-Disposition", headStr);
          OutputStream out = response.getOutputStream();
    
    //调用poi的工具类
          ExportExcel ex = new ExportExcel(title, rowsName, dataList);
          try {
            ex.export(out);
          } catch (Exception e) {
            e.printStackTrace();
          }
          out.flush();
          out.close();
          return;
        }
    

    9、注意:如果从数据库查到的是数字,比如0代表男,1代表女,不加处理,会导出数字,处理方法如下:(主要代码),下面代码又没有的当前页的限制,根据条件查到多少打印多少。

    String patientid1 = request.getParameter("patientid");
          int patientid = 0;
          if (patientid1 != null && !patientid1.equals("")) {
            patientid = Integer.parseInt(patientid1);
          }
          String prescriptionid1 = request.getParameter("prescriptionid");
          int prescriptionid = 0;
          if (prescriptionid1 != null && !prescriptionid1.equals("")) {
            prescriptionid = Integer.parseInt(prescriptionid1);
          }
          String patientname = request.getParameter("patientname");
          String starttime = request.getParameter("starttime");
          String endtime = request.getParameter("endtime");
          List<Prescription> prescriptions = new ArrayList<Prescription>();
          prescriptions = sm.queryDao(prescriptionid, patientid, patientname, starttime, endtime);
          String title = "发药信息表";
          String[] rowsName = new String[] { "处方号", "病历号", "姓名", "日期", "状态" };
          List<Object[]> dataList = new ArrayList<Object[]>();
          //导出excel
          Object[] objs = null;
          for (int i = 0; i < prescriptions.size(); i++) {
            Prescription regRum = prescriptions.get(i);
            objs = new Object[rowsName.length];
            objs[0] = regRum.getPrescriptionid();
            objs[1] = regRum.getPatientid();
            objs[2] = regRum.getName();
            objs[3] = regRum.getPrescriptiondate();
            //对数字的操作
            if(regRum.getStatus().equals("1")) {
              objs[4] = "已结算";
            }
            else {
              objs[4]="已发药";
            }
            dataList.add(objs);
          }
          //下面代码主要跟上面一致
    

    10.数据库操作代码如下:(比较简单,只是把满足条件的list集合传到servlet,转变为数组,方便调用poi类)

    @Override
      public List<Prescription> query(int prescriptionid,int patientid, String patientname, String starttime, String endtime, int pageon) {
        Connection con = Jndi.getConnection();
        ResultSet rs = null;
        PreparedStatement ps = null;
        String sql = "select p.patientid,p.prescriptionid,r.patientname, p.diagnose ,p.prescriptiondate,sum(chargemoney*number),p.`pstatus` \r\n"
            + "from prescription p,regnum r,chargeitem c,prescriptioncharge pc  \r\n" + "\r\n"
            + " where  p.patientid=r.patientid and pc.prescriptionid=p.prescriptionid\r\n" + "\r\n" + "\r\n"
            + " and c.chargeid=pc.chargeid   ";
        if (patientid != 0) {
          sql = sql + " and p.patientid=" + patientid;
        }
        if (prescriptionid != 0) {
          sql = sql + " and p.prescriptionid=" + prescriptionid;
        }
        if (patientname != null && !patientname.equals("")) {
          sql = sql + " and r.patientname like '%" + patientname + "%'";
        }
        if (starttime != null && !starttime.equals("")) {
          sql = sql + " and p.prescriptiondate>'" + starttime + "'";
        }
        if (endtime != null && !endtime.equals("")) {
          sql = sql + " and p.prescriptiondate<'" + endtime + "'";
        }
        
    
    sql = sql + "  GROUP BY p.prescriptionid";
    if (pageon != 0) {
      sql = sql + " limit " + (pageon - 1) * 4 + ",4";
    }
    
    List<Prescription> listregs = new ArrayList<Prescription>();
    try {
      ps = con.prepareStatement(sql);
      rs = ps.executeQuery();
    
      while (rs.next()) {
        Prescription prescription = new Prescription();
        prescription.setPatientid(rs.getInt("patientid"));
        prescription.setPrescriptionid(rs.getInt("p.prescriptionid"));
        prescription.setDiagnose(rs.getString("diagnose"));
        prescription.setPrescriptiondate(rs.getString("prescriptiondate"));
        prescription.setStatus(rs.getString("pstatus"));
        prescription.setSummoney(rs.getDouble(6));
        prescription.setName(rs.getString(3));
        listregs.add(prescription);
      }
    
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      Jndi.close(rs, ps, con);
    }
    return listregs;
    

    第一种比较复杂,如果想很快搞定,可以用纯js在前端导出table表格,需要导入四个js文件。引入进去。

    在这里插入图片描述
    二、纯js实现前台导出excel。
    1、导入js文件,可能也需要导入jquery文件,自行尝试。所需js文件地址。
    链接:https://pan.baidu.com/s/14-riXUTElxWaLHRHLe04SA
    提取码:fpnp

    <script type="text/javascript" src="<%=path %>/Js/jszip.min.js"></script>
    <script type="text/javascript" src="<%=path %>/Js/demo.page.js"></script>
    <script type="text/javascript" src="<%=path %>/Js/excel-gen.js"></script>
    <script type="text/javascript" src="<%=path %>/Js/FileSaver.js"></script>
    

    2、js代码如下

    <script type="text/javascript">
      $(document).ready(function(){
        alert()
        excel = new ExcelGen({
          "src_id":"test_table",//table的id
          "show_header":true
        });
        $("#generate-excel").click(function () {
          excel.generate();//执行导入包中的方法。
        })
      });
    </script>
    

    3、body中主要代码

    <table class="table table-bordered table-hover definewidth m10" id="test_table">
    //id在table中写
    //调用方法名在button写
    <button type="button" class="btn btn-success" id="generate-excel">导出Excel</button>
    

    注意:第二种方式,只能导出当前页的信息,它是根据table里面tr的数量导的,不会打印下一页。如果希望打印下一页的内容,提供一种思路,可以在按钮上添加跳转页面,跳到另一个页面,让另一个页面返回数据库全查需要的数据,写入新建页的table中,打印新table,有兴趣的可以尝试。 到这儿,可能读累了吧,听懂的给个赞,thanks.

    在这里插入图片描述

    展开全文
  • Java导出Excel(附完整源码)

    万次阅读 多人点赞 2019-05-12 22:00:11
    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下。 所用技术就是SpringBoot,然后是MVC架构模式。 废话不多说,直接上代码了,源码点末尾链接就可以下载。 (1)新建一个...

    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下。
    所用技术就是SpringBoot,然后是MVC架构模式。
    废话不多说,直接上代码了,源码点末尾链接就可以下载。
    (1)新建一个SpringBoot项目(可以官网https://start.spring.io/直接生成下载,然后导入eclipse),项目结构如下:
    在这里插入图片描述
    (2)修改pom文件,添加依赖;

    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    
    		<!-- 导出excel -->
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi</artifactId>
    			<version>3.14</version>
    		</dependency>
    
    		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml</artifactId>
    			<version>3.14</version>
    		</dependency>
    
    		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-contrib -->
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-contrib</artifactId>
    			<version>3.6</version>
    		</dependency>
    		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml-schemas</artifactId>
    			<version>3.17</version>
    		</dependency>
    		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-scratchpad</artifactId>
    			<version>3.17</version>
    		</dependency>
    

    (3)新建一个实体类,命名为User.java;

    package com.twf.springcloud.ExportExcel.po;
    import java.io.Serializable;
    public class User implements Serializable{
    	private static final long serialVersionUID = -9180229310895087286L;
    	private String name; // 姓名
    	private String sex; // 性别
    	private Integer age; // 年龄
    	private String phoneNo; // 手机号
    	private String address; // 地址
    	private String hobby; // 爱好
    	public User(String name, String sex, Integer age, String phoneNo, String address, String hobby) {
    		super();
    		this.name = name;
    		this.sex = sex;
    		this.age = age;
    		this.phoneNo = phoneNo;
    		this.address = address;
    		this.hobby = hobby;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public Integer getAge() {
    		return age;
    	}
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    	public String getPhoneNo() {
    		return phoneNo;
    	}
    	public void setPhoneNo(String phoneNo) {
    		this.phoneNo = phoneNo;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	public String getHobby() {
    		return hobby;
    	}
    	public void setHobby(String hobby) {
    		this.hobby = hobby;
    	}
    	@Override
    	public String toString() {
    		return "User [name=" + name + ", sex=" + sex + ", age=" + age + ", phoneNo=" + phoneNo + ", address=" + address
    				+ ", hobby=" + hobby + "]";
    	}
    }
    

    (4)新建一个excel样式工具类;

    package com.twf.springcloud.ExportExcel.utils;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.xssf.streaming.SXSSFCell;
    import org.apache.poi.xssf.streaming.SXSSFRow;
    import org.apache.poi.xssf.streaming.SXSSFSheet;
    import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    /**
     * excle样式工具类
     */
    public class ExcelFormatUtil {
        /**
         * 设置报表头样式
         * @param workbook
         * @return
         */
    	public static CellStyle headSytle(SXSSFWorkbook workbook){
    		// 设置style1的样式,此样式运用在第二行
    		CellStyle style1 = workbook.createCellStyle();// cell样式
    		// 设置单元格背景色,设置单元格背景色以下两句必须同时设置
    		style1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 设置填充样式
    		style1.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);// 设置填充色
    		// 设置单元格上、下、左、右的边框线
    		style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    		style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    		style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
    		style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
    		Font font1 = workbook.createFont();// 创建一个字体对象
    		font1.setBoldweight((short) 10);// 设置字体的宽度
    		font1.setFontHeightInPoints((short) 10);// 设置字体的高度
    		font1.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示
    		style1.setFont(font1);// 设置style1的字体
    		style1.setWrapText(true);// 设置自动换行
    		style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向)
    		style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)
    		return style1;
    	}
    	/**
    	 * 设置报表体样式
    	 * @param wb
    	 * @return
    	 */
    	public static CellStyle contentStyle(SXSSFWorkbook wb){
           // 设置style1的样式,此样式运用在第二行
    		CellStyle style1 = wb.createCellStyle();// cell样式
    		// 设置单元格上、下、左、右的边框线
    		style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    		style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    		style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
    		style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
    		style1.setWrapText(true);// 设置自动换行
    		style1.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 设置单元格字体显示居中(左右方向)
    		style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)
    		return style1;
    	}
    	/**
    	 * 设置报表标题样式
    	 * @param workbook
    	 * @return
    	 */
    	public static HSSFCellStyle titleSytle(HSSFWorkbook workbook,short color,short fontSize){
    		// 设置style1的样式,此样式运用在第二行
    				HSSFCellStyle style1 = workbook.createCellStyle();// cell样式
    				// 设置单元格背景色,设置单元格背景色以下两句必须同时设置
    				//style1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 设置填充样式
    				//short fcolor = color;
    				if(color != HSSFColor.WHITE.index){
    					style1.setFillForegroundColor(color);// 设置填充色	
    				}
    				// 设置单元格上、下、左、右的边框线
    				style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    				style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    				style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
    				style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
    				HSSFFont font1 = workbook.createFont();// 创建一个字体对象
    				font1.setBoldweight(fontSize);// 设置字体的宽度
    				font1.setFontHeightInPoints(fontSize);// 设置字体的高度
    				font1.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示
    				style1.setFont(font1);// 设置style1的字体
    				style1.setWrapText(true);// 设置自动换行
    				style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向)
    				style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)
    				return style1;
    	}
    	/**
    	 *设置表头 
    	 * @param sheet
    	 */
    	public static void initTitleEX(SXSSFSheet sheet, CellStyle header,String title[],int titleLength[]) {
    		SXSSFRow row0 = sheet.createRow(0);
    		row0.setHeight((short) 800);	
    		for(int j = 0;j<title.length; j++) {
    			SXSSFCell cell = row0.createCell(j);
    			//设置每一列的字段名
    			cell.setCellValue(title[j]);
    			cell.setCellStyle(header);
    			sheet.setColumnWidth(j, titleLength[j]);
    		}
    	}
    }
    

    (5)新建一个Service接口;

    package com.twf.springcloud.ExportExcel.sevice;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.http.ResponseEntity;
    public interface ExportService {
    	ResponseEntity<byte[]> exportExcel(HttpServletRequest request, HttpServletResponse response);
    }
    

    (6)新建一个Service接口实现类;

    package com.twf.springcloud.ExportExcel.sevice.impl;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.xssf.streaming.SXSSFCell;
    import org.apache.poi.xssf.streaming.SXSSFRow;
    import org.apache.poi.xssf.streaming.SXSSFSheet;
    import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    
    import com.twf.springcloud.ExportExcel.controller.BaseFrontController;
    import com.twf.springcloud.ExportExcel.po.User;
    import com.twf.springcloud.ExportExcel.sevice.ExportService;
    import com.twf.springcloud.ExportExcel.utils.ExcelFormatUtil;
    
    @Service
    public class ExportServiceImpl implements ExportService{
    	Logger logger = LoggerFactory.getLogger(ExportServiceImpl.class);
    
    	@Override
    	public ResponseEntity<byte[]> exportExcel(HttpServletRequest request, HttpServletResponse response) {
    		try {
    			logger.info(">>>>>>>>>>开始导出excel>>>>>>>>>>");
    			
    			// 造几条数据
    			List<User> list = new ArrayList<>();
    			list.add(new User("唐三藏", "男", 30, "13411111111", "东土大唐", "取西经"));
    			list.add(new User("孙悟空", "男", 29, "13411111112", "菩提院", "打妖怪"));
    			list.add(new User("猪八戒", "男", 28, "13411111113", "高老庄", "偷懒"));
    			list.add(new User("沙悟净", "男", 27, "13411111114", "流沙河", "挑担子"));
    			
    			BaseFrontController baseFrontController = new BaseFrontController();
    			return baseFrontController.buildResponseEntity(export((List<User>) list), "用户表.xls");
    		} catch (Exception e) {
    			e.printStackTrace();
    			logger.error(">>>>>>>>>>导出excel 异常,原因为:" + e.getMessage());
    		}
    		return null;
    	}
    
    	private InputStream export(List<User> list) {
    		logger.info(">>>>>>>>>>>>>>>>>>>>开始进入导出方法>>>>>>>>>>");
    		ByteArrayOutputStream output = null;
    		InputStream inputStream1 = null;
    		SXSSFWorkbook wb = new SXSSFWorkbook(1000);// 保留1000条数据在内存中
    		SXSSFSheet sheet = wb.createSheet();
    		// 设置报表头样式
    		CellStyle header = ExcelFormatUtil.headSytle(wb);// cell样式
    		CellStyle content = ExcelFormatUtil.contentStyle(wb);// 报表体样式
    		
    		// 每一列字段名
    		String[] strs = new String[] { "姓名", "性别", "年龄", "手机号", "地址","爱好" };
    		
    		// 字段名所在表格的宽度
    		int[] ints = new int[] { 5000, 5000, 5000, 5000, 5000, 5000 };
    		
    		// 设置表头样式
    		ExcelFormatUtil.initTitleEX(sheet, header, strs, ints);
    		logger.info(">>>>>>>>>>>>>>>>>>>>表头样式设置完成>>>>>>>>>>");
    		
    		if (list != null && list.size() > 0) {
    			logger.info(">>>>>>>>>>>>>>>>>>>>开始遍历数据组装单元格内容>>>>>>>>>>");
    			for (int i = 0; i < list.size(); i++) {
    				User user = list.get(i);
    				SXSSFRow row = sheet.createRow(i + 1);
    				int j = 0;
    
    				SXSSFCell cell = row.createCell(j++);
    				cell.setCellValue(user.getName()); // 姓名
    				cell.setCellStyle(content);
    
    				cell = row.createCell(j++);
    				cell.setCellValue(user.getSex()); // 性别
    				cell.setCellStyle(content);
    
    				cell = row.createCell(j++);
    				cell.setCellValue(user.getAge()); // 年龄
    				cell.setCellStyle(content);
    
    				cell = row.createCell(j++);
    				cell.setCellValue(user.getPhoneNo()); // 手机号
    				cell.setCellStyle(content);
    
    				cell = row.createCell(j++);
    				cell.setCellValue(user.getAddress()); // 地址
    				cell.setCellStyle(content);
    				
    				cell = row.createCell(j++);
    				cell.setCellValue(user.getHobby()); // 爱好
    				cell.setCellStyle(content);
    			}
    			logger.info(">>>>>>>>>>>>>>>>>>>>结束遍历数据组装单元格内容>>>>>>>>>>");
    		}
    		try {
    			output = new ByteArrayOutputStream();
    			wb.write(output);
    			inputStream1 = new ByteArrayInputStream(output.toByteArray());
    			output.flush();
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (output != null) {
    					output.close();
    					if (inputStream1 != null)
    						inputStream1.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		return inputStream1;
    	}
    }
    

    (7)新建一个下载文件的通用controller;

    package com.twf.springcloud.ExportExcel.controller;
    
    import java.io.InputStream; 
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.poi.util.IOUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.util.StringUtils;
    import org.springframework.validation.annotation.Validated;
    
    @Validated
    public class BaseFrontController {
    	
    	/**
    	 * slf4j 日志 logger
    	 */
    	protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    	/**
    	 * 下载文件,纯SpringMVC的API来完成
    	 *
    	 * @param is 文件输入流
    	 * @param name 文件名称,带后缀名
    	 *
    	 * @throws Exception
    	 */
    	public ResponseEntity<byte[]> buildResponseEntity(InputStream is, String name) throws Exception {
    		logger.info(">>>>>>>>>>>>>>>>>>>>开始下载文件>>>>>>>>>>");
    		if (this.logger.isDebugEnabled())
    			this.logger.debug("download: " + name);
    		HttpHeaders header = new HttpHeaders();
    		String fileSuffix = name.substring(name.lastIndexOf('.') + 1);
    		fileSuffix = fileSuffix.toLowerCase();
    		
    		Map<String, String> arguments = new HashMap<String, String>();
    		arguments.put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    		arguments.put("xls", "application/vnd.ms-excel");
    		
    		String contentType = arguments.get(fileSuffix);
    		header.add("Content-Type", (StringUtils.hasText(contentType) ? contentType : "application/x-download"));
    		if(is!=null && is.available()!=0){
    			header.add("Content-Length", String.valueOf(is.available()));
    			header.add("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(name, "UTF-8"));
    			byte[] bs = IOUtils.toByteArray(is);
    			logger.info(">>>>>>>>>>>>>>>>>>>>结束下载文件-有记录>>>>>>>>>>");
    			logger.info(">>>>>>>>>>结束导出excel>>>>>>>>>>");
    			return new ResponseEntity<>(bs, header, HttpStatus.OK);
    		}else{
    			String string="数据为空";
    			header.add("Content-Length", "0");
    			header.add("Content-Disposition", "attachment;filename*=utf-8'zh_cn'" + URLEncoder.encode(name, "UTF-8"));
    			logger.info(">>>>>>>>>>>>>>>>>>>>结束下载文件-无记录>>>>>>>>>>");
    			logger.info(">>>>>>>>>>结束导出excel>>>>>>>>>>");
    			return new ResponseEntity<>(string.getBytes(), header, HttpStatus.OK);
    		}
    	}
    }
    

    (8)新建一个controller,作为请求的入口;

    package com.twf.springcloud.ExportExcel.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.twf.springcloud.ExportExcel.sevice.ExportService;
    
    @RestController
    @RequestMapping("/exportExcel/")
    public class ExportController {
    	
    	@Autowired
    	private ExportService exportService;
    
    	// 导出excel
    	@RequestMapping("exportExcel")
    	public ResponseEntity<byte[]> exportExcel(HttpServletRequest request, HttpServletResponse response) {
    		return exportService.exportExcel(request,response);
    	}
    }
    

    (9)运行ExportExcelApplication,浏览器访问http://localhost:8080/exportExcel/exportExcel,可以下载excel,打开如下:
    在这里插入图片描述
    (10)项目源码,提取码为:wvfm。

    展开全文
  • Java导出Excel(Poi详解)

    万次阅读 多人点赞 2019-04-18 09:01:46
    直接可用的导出,自己根据下边的讲解自行修改,不修改直接用也可以! https://blog.csdn.net/w893932747/article/details/89370894 一、POI简介: Apache POI是Apache软件基金会的开放源码函式库,POI提供API给...

    福利:

    直接可用的导出,自己根据下边的讲解自行修改,不修改直接用也可以!

    https://blog.csdn.net/w893932747/article/details/89370894

    一、POI简介:

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

    HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

    二、POI结构说明

    包名称说明

    1. HSSF提供读写Microsoft Excel XLS格式档案的功能。
    2. XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
    3. HWPF提供读写Microsoft Word DOC格式档案的功能。
    4. HSLF提供读写Microsoft PowerPoint格式档案的功能。
    5. HDGF提供读Microsoft Visio格式档案的功能。
    6. HPBF提供读Microsoft Publisher格式档案的功能。
    7. HSMF提供读Microsoft Outlook格式档案的功能。

    三、POI常用类说明

            类名                            说明

    HSSFWorkbook           Excel的文档对象

    HSSFSheet                  Excel的表单

    HSSFRow                    Excel的行

    HSSFCell                     Excel的格子单元

    HSSFFont                    Excel字体

    HSSFDataFormat        格子单元的日期格式

    HSSFHeader               Excel文档Sheet的页眉

    HSSFFooter                Excel文档Sheet的页脚

    HSSFCellStyle            格子单元样式

    HSSFDateUtil             日期

    HSSFPrintSetup         打印

    HSSFErrorConstants   错误信息表

    四、Excel的基本操作

    • 得到Excel常用对象
    //获得Excel对象
        @Test
        public void testExcel1(){
            try {
                //获取系统文档
                POIFSFileSystem fspoi=new POIFSFileSystem(new FileInputStream("/Users/wangjun/temp/demo1.xls"));
                //创建工作薄对象
                HSSFWorkbook workbook=new HSSFWorkbook(fspoi);
                //创建工作表对象
                HSSFSheet sheet=workbook.getSheet("sheet1");
                //得到Excel表格
                HSSFRow row = sheet.getRow(1);
                //得到Excel工作表指定行的单元格
                HSSFCell cell = row.getCell(1);
                System.out.println(cell);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    • 创建Excel文档
        //创建Excel对象
        @Test
        public void testExcel2() throws IOException {
            //创建工作薄对象
            HSSFWorkbook workbook=new HSSFWorkbook();//这里也可以设置sheet的Name
            //创建工作表对象
            HSSFSheet sheet = workbook.createSheet();
            //创建工作表的行
            HSSFRow row = sheet.createRow(0);//设置第一行,从零开始
            row.createCell(2).setCellValue("aaaaaaaaaaaa");//第一行第三列为aaaaaaaaaaaa
            row.createCell(0).setCellValue(new Date());//第一行第一列为日期
            workbook.setSheetName(0,"sheet的Name");//设置sheet的Name
    
            //文档输出
            FileOutputStream out = new FileOutputStream("/Users/wangjun/temp/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls");
            workbook.write(out);
            out.close();
        }
    • 创建Excel文档,添加摘要信息

    这个信息添加完是有的,但是在mac下一直找不到怎么查看,有知道的童鞋希望不吝赐教,我是放到Win中查看的。

        //创建文档摘要信息
        @Test
        public void testExcel3() throws IOException {
            //创建HSSFWorkbook工作薄对象
            HSSFWorkbook workbook=new HSSFWorkbook();
            //创建HSSFSheet对象
            HSSFSheet sheet=workbook.createSheet("sheet1");
            //创建行的单元格,从0开始
            HSSFRow row = sheet.createRow(0);
            //创建单元格,从0开始
            HSSFCell cell = row.createCell(0);
            cell.setCellValue("a");
            //一下为简写
            row.createCell(1).setCellValue("aa");
            row.createCell(2).setCellValue("aaa");
            row.createCell(3).setCellValue("aaaa");
    
            //创建文档信息
            workbook.createInformationProperties();
            //获取DocumentSummaryInformation对象
            DocumentSummaryInformation documentSummaryInformation = workbook.getDocumentSummaryInformation();
            documentSummaryInformation.setCategory("类别:Excel文件");//类别
            documentSummaryInformation.setManager("管理者:王军");//管理者
            documentSummaryInformation.setCompany("公司:Action");//公司
    
            //文档输出
            FileOutputStream out = new FileOutputStream("/Users/wangjun/temp/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls");
            workbook.write(out);
            out.close();
        }
    • 创建批注
        //创建批注
        @Test
        public void testExcel4() throws IOException {
            //创建Excel工作薄对象
            HSSFWorkbook workbook=new HSSFWorkbook();
            //创建Excel工作表对象
            HSSFSheet sheet = workbook.createSheet("wj");
            HSSFPatriarch patr = sheet.createDrawingPatriarch();
            //创建批注位置(row1-row3:直接理解为高度,col1-col2:直接理解为宽度)
            HSSFClientAnchor anchor = patr.createAnchor(0, 0, 0, 0, 5, 1, 8, 3);
            //创建批注
            HSSFComment comment = patr.createCellComment(anchor);
            //设置批注内容
            comment.setString(new HSSFRichTextString("这是一个批注段落!"));
            //设置批注作者
            comment.setAuthor("wangjun");
            //设置批注默认显示
            comment.setVisible(true);
            HSSFCell cell = sheet.createRow(2).createCell(1);
            cell.setCellValue("测试");
            //把批注赋值给单元格
            cell.setCellComment(comment);
    
            //文档输出
            FileOutputStream out = new FileOutputStream("/Users/wangjun/temp/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls");
            workbook.write(out);
            out.close();
        }

    创建批注位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)方法参数说明:

    1. dx1 第1个单元格中x轴的偏移量
    2. dy1 第1个单元格中y轴的偏移量
    3. dx2 第2个单元格中x轴的偏移量
    4. dy2 第2个单元格中y轴的偏移量
    5. col1 第1个单元格的列号
    6. row1 第1个单元格的行号
    7. col2 第2个单元格的列号
    8. row2 第2个单元格的行号
    • 创建页眉和页脚
        //创建页眉页脚
        @Test
        public void testExcel5() throws IOException {
            //创建Excel工作薄对象
            HSSFWorkbook workbook=new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
            HSSFHeader header =sheet.getHeader();//得到页眉
            header.setLeft("页眉左边");
            header.setRight("页眉右边");
            header.setCenter("页眉中间");
            HSSFFooter footer =sheet.getFooter();//得到页脚
            footer.setLeft("页脚左边");
            footer.setRight("页脚右边");
            footer.setCenter("页脚中间");
    
            //文档输出
            FileOutputStream out = new FileOutputStream("/Users/wangjun/temp/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls");
            workbook.write(out);
            out.close();
        }

    五、Excel的单元格操作

        //Excel的单元格操作
        @Test
        public void testExcel6() throws IOException {
            //创建Excel工作薄对象
            HSSFWorkbook workbook=new HSSFWorkbook();
            //创建Excel工作表对象
            HSSFSheet sheet = workbook.createSheet("wj");
            //创建行的单元格,从0开始
            HSSFRow row = sheet.createRow(0);
            //创建单元格
            HSSFCell cell=row.createCell(0);
            //设置值
            cell.setCellValue(new Date());
            //创建单元格样式
            HSSFCellStyle style=workbook.createCellStyle();
            style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
            cell.setCellStyle(style);
            //设置保留2位小数--使用Excel内嵌的格式
            HSSFCell cell1 = row.createCell(1);
            cell1.setCellValue(12.3456789);
            style=workbook.createCellStyle();
            style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
            cell1.setCellStyle(style);
            //设置货币格式--使用自定义的格式
            HSSFCell cell2 = row.createCell(2);
            cell2.setCellValue(12345.6789);
            style=workbook.createCellStyle();
            style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0"));
            cell2.setCellStyle(style);
            //设置百分比格式--使用自定义的格式
            HSSFCell cell3 = row.createCell(3);
            cell3.setCellValue(0.123456789);
            style=workbook.createCellStyle();
            style.setDataFormat(workbook.createDataFormat().getFormat("0.00%"));
            cell3.setCellStyle(style);
            //设置中文大写格式--使用自定义的格式
            HSSFCell cell4 = row.createCell(4);
            cell4.setCellValue(12345);
            style=workbook.createCellStyle();
            style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0"));
            cell4.setCellStyle(style);
            //设置科学计数法格式--使用自定义的格式
            HSSFCell cell5 = row.createCell(5);
            cell5.setCellValue(12345);
            style=workbook.createCellStyle();
            style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00"));
            cell5.setCellStyle(style);
    
            //文档输出
            FileOutputStream out = new FileOutputStream("/Users/wangjun/temp/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls");
            workbook.write(out);
            out.close();
        }

    HSSFDataFormat.getFormat和HSSFDataFormat.getBuiltinFormat的区别: 

           当使用Excel内嵌的(或者说预定义)的格式时,直接用HSSFDataFormat.getBuiltinFormat静态方法即可。当使用自己定义的格式时,必须先调用HSSFWorkbook.createDataFormat(),因为这时在底层会先找有没有匹配的内嵌FormatRecord,如果没有就会新建一个FormatRecord,所以必须先调用这个方法,然后你就可以用获得的HSSFDataFormat实例的getFormat方法了,当然相对而言这种方式比较麻烦,所以内嵌格式还是用HSSFDataFormat.getBuiltinFormat静态方法更加直接一些。

    合并单元格

        //合并单元格
        @Test
        public void testExcel7() throws IOException {
            //创建Excel工作薄对象
            HSSFWorkbook workbook=new HSSFWorkbook();
            //创建Excel工作表对象
            HSSFSheet sheet = workbook.createSheet("wj");
            //创建行的单元格,从0开始
            HSSFRow row = sheet.createRow(0);
            //创建单元格
            HSSFCell cell=row.createCell(0);
            //设置值
            cell.setCellValue(new Date());
            //合并列
            cell.setCellValue("合并列");
            CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5);
            sheet.addMergedRegion(region);
            //合并行
            HSSFCell cell1 = row.createCell(6);
            cell1.setCellValue("合并行");
            region=new CellRangeAddress(0, 5, 6, 6);
            sheet.addMergedRegion(region);
    
            //文档输出
            FileOutputStream out = new FileOutputStream("/Users/wangjun/temp/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls");
            workbook.write(out);
            out.close();
        }

    CellRangeAddress对象其实就是表示一个区域,其构造方法如下:

    CellRangeAddress(firstRow, lastRow, firstCol, lastCol),参数的说明:

    1. firstRow 区域中第一个单元格的行号
    2. lastRow 区域中最后一个单元格的行号
    3. firstCol 区域中第一个单元格的列号
    4. lastCol 区域中最后一个单元格的列号

    提示: 即使你没有用CreateRow和CreateCell创建过行或单元格,也完全可以直接创建区域然后把这一区域合并,Excel的区域合并信息是单独存储的,和RowRecord、ColumnInfoRecord不存在直接关系。

    (3)单元格对齐

    1. HSSFCell cell=row.createCell(0);
    2. cell.setCellValue("单元格对齐");
    3. HSSFCellStyle style=workbook.createCellStyle();
    4. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
    5. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
    6. style.setWrapText(true);//自动换行
    7. style.setIndention((short)5);//缩进
    8. style.setRotation((short)60);//文本旋转,这里的取值是从-90到90,而不是0-180度。
    9. cell.setCellStyle(style);

         水平对齐相关参数

    1. 如果是左侧对齐就是 HSSFCellStyle.ALIGN_FILL;
    2. 如果是居中对齐就是 HSSFCellStyle.ALIGN_CENTER;
    3. 如果是右侧对齐就是 HSSFCellStyle.ALIGN_RIGHT;
    4. 如果是跨列举中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION;
    5. 如果是两端对齐就是 HSSFCellStyle.ALIGN_JUSTIFY;
    6. 如果是填充就是 HSSFCellStyle.ALIGN_FILL;

         垂直对齐相关参数

    1. 如果是靠上就是 HSSFCellStyle.VERTICAL_TOP;
    2. 如果是居中就是 HSSFCellStyle.VERTICAL_CENTER;
    3. 如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM;
    4. 如果是两端对齐就是 HSSFCellStyle.VERTICAL_JUSTIFY;

    (4)使用边框

         边框和其他单元格设置一样也是调用CellStyle接口,CellStyle有2种和边框相关的属性,分别是:

    边框相关属性

    说明

    范例

    Border+ 方向

    边框类型

    BorderLeft, BorderRight 等

    方向 +BorderColor

    边框颜色

    TopBorderColor,BottomBorderColor 等

    1. HSSFCell cell=row.createCell(1);
    2. cell.setCellValue("设置边框");
    3. HSSFCellStyle style=workbook.createCellStyle();
    4. style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上边框
    5. style.setBorderBottom(HSSFCellStyle.BORDER_THICK);//下边框
    6. style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);//左边框
    7. style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//右边框
    8. style.setTopBorderColor(HSSFColor.RED.index);//上边框颜色
    9. style.setBottomBorderColor(HSSFColor.BLUE.index);//下边框颜色
    10. style.setLeftBorderColor(HSSFColor.GREEN.index);//左边框颜色
    11. style.setRightBorderColor(HSSFColor.PINK.index);//右边框颜色
    12. cell.setCellStyle(style);

         其中边框类型分为以下几种:

    边框范例图

    对应的静态值

    HSSFCellStyle. BORDER_DOTTED

    HSSFCellStyle. BORDER_HAIR

    HSSFCellStyle. BORDER_DASH_DOT_DOT

    HSSFCellStyle. BORDER_DASH_DOT

    HSSFCellStyle. BORDER_DASHED

    HSSFCellStyle. BORDER_THIN

    HSSFCellStyle. BORDER_MEDIUM_DASH_DOT_DOT

    HSSFCellStyle. BORDER_SLANTED_DASH_DOT

    HSSFCellStyle. BORDER_MEDIUM_DASH_DOT

    HSSFCellStyle. BORDER_MEDIUM_DASHED

    HSSFCellStyle. BORDER_MEDIUM

    HSSFCellStyle. BORDER_THICK

    HSSFCellStyle. BORDER_DOUBLE

    (5)设置字体

    1. HSSFCell cell = row.createCell(1);
    2. cell.setCellValue("设置字体");
    3. HSSFCellStyle style = workbook.createCellStyle();
    4. HSSFFont font = workbook.createFont();
    5. font.setFontName("华文行楷");//设置字体名称
    6. font.setFontHeightInPoints((short)28);//设置字号
    7. font.setColor(HSSFColor.RED.index);//设置字体颜色
    8. font.setUnderline(FontFormatting.U_SINGLE);//设置下划线
    9. font.setTypeOffset(FontFormatting.SS_SUPER);//设置上标下标
    10. font.setStrikeout(true);//设置删除线
    11. style.setFont(font);
    12. cell.setCellStyle(style);

    下划线选项值:

    单下划线 FontFormatting.U_SINGLE

    双下划线 FontFormatting.U_DOUBLE

    会计用单下划线 FontFormatting.U_SINGLE_ACCOUNTING

    会计用双下划线 FontFormatting.U_DOUBLE_ACCOUNTING

    无下划线 FontFormatting.U_NONE

         上标下标选项值:

    上标 FontFormatting.SS_SUPER

    下标 FontFormatting.SS_SUB

    普通,默认值 FontFormatting.SS_NONE

    (6)背景和纹理

    1. HSSFCellStyle style = workbook.createCellStyle();
    2. style.setFillForegroundColor(HSSFColor.GREEN.index);//设置图案颜色
    3. style.setFillBackgroundColor(HSSFColor.RED.index);//设置图案背景色
    4. style.setFillPattern(HSSFCellStyle.SQUARES);//设置图案样式
    5. cell.setCellStyle(style);

         图案样式及其对应的值:

    图案样式

    常量

    HSSFCellStyle. NO_FILL

    HSSFCellStyle. ALT_BARS

    HSSFCellStyle. FINE_DOTS

    HSSFCellStyle. SPARSE_DOTS

    HSSFCellStyle. LESS_DOTS

    HSSFCellStyle. LEAST_DOTS

    HSSFCellStyle. BRICKS

    HSSFCellStyle. BIG_SPOTS

    HSSFCellStyle. THICK_FORWARD_DIAG

    HSSFCellStyle. THICK_BACKWARD_DIAG

    HSSFCellStyle. THICK_VERT_BANDS

    HSSFCellStyle. THICK_HORZ_BANDS

    HSSFCellStyle. THIN_HORZ_BANDS

    HSSFCellStyle. THIN_VERT_BANDS

    HSSFCellStyle. THIN_BACKWARD_DIAG

    HSSFCellStyle. THIN_FORWARD_DIAG

    HSSFCellStyle. SQUARES

    HSSFCellStyle. DIAMONDS

    (7)设置宽度和高度

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(1);
    3. HSSFCell cell = row.createCell(1);
    4. cell.setCellValue("123456789012345678901234567890");
    5. sheet.setColumnWidth(1, 31 * 256);//设置第一列的宽度是31个字符宽度
    6. row.setHeightInPoints(50);//设置行的高度是50个点

         这里你会发现一个有趣的现象,setColumnWidth的第二个参数要乘以256,这是怎么回事呢?其实,这个参数的单位是1/256个字符宽度,也就是说,这里是把B列的宽度设置为了31个字符。

         设置行高使用HSSFRow对象的setHeight和setHeightInPoints方法,这两个方法的区别在于setHeightInPoints的单位是点,而setHeight的单位是1/20个点,所以setHeight的值永远是setHeightInPoints的20倍。

         你也可以使用HSSFSheet.setDefaultColumnWidth、HSSFSheet.setDefaultRowHeight和HSSFSheet.setDefaultRowHeightInPoints方法设置默认的列宽或行高。

    (8)判断单元格是否为日期

         判断单元格是否为日期类型,使用DateUtil.isCellDateFormatted(cell)方法,例如:

    1. HSSFCell cell = row.createCell(1);
    2. cell.setCellValue(new Date());//设置日期数据
    3. System.out.println(DateUtil.isCellDateFormatted(cell));//输出:false
    4. HSSFCellStyle style =workbook.createCellStyle();
    5. style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
    6. cell.setCellStyle(style);//设置日期样式
    7. System.out.println(DateUtil.isCellDateFormatted(cell));//输出:true

    4.使用Excel公式

    (1)基本计算

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. HSSFCell cell = row.createCell(0);
    4. cell.setCellFormula("2+3*4");//设置公式
    5. cell = row.createCell(1);
    6. cell.setCellValue(10);
    7. cell = row.createCell(2);
    8. cell.setCellFormula("A1*B1");//设置公式

    (2)SUM函数

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. row.createCell(0).setCellValue(1);
    4. row.createCell(1).setCellValue(2);
    5. row.createCell(2).setCellValue(3);
    6. row.createCell(3).setCellValue(4);
    7. row.createCell(4).setCellValue(5);
    8. row = sheet.createRow(1);
    9. row.createCell(0).setCellFormula("sum(A1,C1)");//等价于"A1+C1"
    10. row.createCell(1).setCellFormula("sum(B1:D1)");//等价于"B1+C1+D1"

    (3)日期函数

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFCellStyle style=workbook.createCellStyle();
    3. style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd"));
    4. HSSFRow row = sheet.createRow(0);
    5. Calendar date=Calendar.getInstance();//日历对象
    6. HSSFCell cell=row.createCell(0);
    7. date.set(2011,2, 7);
    8. cell.setCellValue(date.getTime());
    9. cell.setCellStyle(style);//第一个单元格开始时间设置完成
    10. cell=row.createCell(1);
    11. date.set(2014,4, 25);
    12. cell.setCellValue(date.getTime());
    13. cell.setCellStyle(style);//第一个单元格结束时间设置完成
    14. cell=row.createCell(3);
    15. cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"y\"),\"年\")");
    16. cell=row.createCell(4);
    17. cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"m\"),\"月\")");
    18. cell=row.createCell(5);
    19. cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"d\"),\"日\")");

    以上代码中的公式说明:

         DATEDIF(A1,B1,\"y\") :取得 A1 单元格的日期与 B1 单元格的日期的时间间隔。 ( “ y ” : 表示以年为单位 , ” m ”表示以月为单位 ; ” d ”表示以天为单位 ) 。

              CONCATENATE( str1,str2, … ) :连接字符串。

              更多 Excel 的日期函数可参考:http://tonyqus.sinaapp.com/archives/286

    (4)字符串相关函数

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. row.createCell(0).setCellValue("abcdefg");
    4. row.createCell(1).setCellValue("aa bb cc dd ee fF GG");
    5. row.createCell(3).setCellFormula("UPPER(A1)");
    6. row.createCell(4).setCellFormula("PROPER(B1)");

        

    以上代码中的公式说明:

         UPPER( String ) :将文本转换成大写形式。

     

              PROPER( String ) :将文字串的首字母及任何非字母字符之后的首字母转换成大写。将其余的字母转换成小写。

              更多 Excel 的字符串函数可参考:http://tonyqus.sinaapp.com/archives/289

    (5)IF函数

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. row.createCell(0).setCellValue(12);
    4. row.createCell(1).setCellValue(23);
    5. row.createCell(3).setCellFormula("IF(A1>B1,\"A1大于B1\",\"A1小于等于B1\")");

         以上代码中的公式说明:

              IF(logical_test,value_if_true,value_if_false)用来用作逻辑判断。其中Logical_test表示计算结果为 TRUE 或 FALSE 的任意值或表达式 ; value_if_true表示当表达式Logical_test的值为TRUE时的返回值;value_if_false表示当表达式Logical_test的值为FALSE时的返回值。

    (6)CountIf和SumIf函数

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. row.createCell(0).setCellValue(57);
    4. row.createCell(1).setCellValue(89);
    5. row.createCell(2).setCellValue(56);
    6. row.createCell(3).setCellValue(67);
    7. row.createCell(4).setCellValue(60);
    8. row.createCell(5).setCellValue(73);
    9. row.createCell(7).setCellFormula("COUNTIF(A1:F1,\">=60\")");
    10. row.createCell(8).setCellFormula("SUMIF(A1:F1,\">=60\",A1:F1)");

         以上代码中的公式说明:

              COUNTIF(range,criteria):满足某条件的计数的函数。参数range:需要进行读数的计数;参数criteria:条件表达式,只有当满足此条件时才进行计数。

              SumIF(criteria_range, criteria,sum_range):用于统计某区域内满足某条件的值的求和。参数criteria_range:条件测试区域,第二个参数Criteria中的条件将与此区域中的值进行比较;参数criteria:条件测试值,满足条件的对应的sum_range项将进行求和计算;参数sum_range:汇总数据所在区域,求和时会排除掉不满足Criteria条件的对应的项。

    (7)Lookup函数

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. row.createCell(0).setCellValue(0);
    4. row.createCell(1).setCellValue(59);
    5. row.createCell(2).setCellValue("不及格");
    6. row = sheet.createRow(1);
    7. row.createCell(0).setCellValue(60);
    8. row.createCell(1).setCellValue(69);
    9. row.createCell(2).setCellValue("及格");
    10. row = sheet.createRow(2);
    11. row.createCell(0).setCellValue(70);
    12. row.createCell(1).setCellValue(79);
    13. row.createCell(2).setCellValue("良好");
    14. row = sheet.createRow(3);
    15. row.createCell(0).setCellValue(80);
    16. row.createCell(1).setCellValue(100);
    17. row.createCell(2).setCellValue("优秀");
    18. row = sheet.createRow(4);
    19. row.createCell(0).setCellValue(75);
    20. row.createCell(1).setCellFormula("LOOKUP(A5,$A$1:$A$4,$C$1:$C$4)");
    21. row.createCell(2).setCellFormula("VLOOKUP(A5,$A$1:$C$4,3,true)");

        

    以上代码中的公式说明:

         LOOKUP(lookup_value,lookup_vector,result_vector) ,第一个参数:需要查找的内容,本例中指向 A5 单元格,也就是 75 ;第二个参数:比较对象区域,本例中的成绩需要与 $A$1:$A$4 中的各单元格中的值进行比较;第三个参数:查找结果区域,如果匹配到会将此区域中对应的数据返回。如本例中返回$C$1:$C$4 中对应的值。

     

     

    可能有人会问,字典中没有 75 对应的成绩啊,那么 Excel 中怎么匹配的呢?答案是模糊匹配,并且 LOOKUP 函数只支持模糊匹配。 Excel 会在 $A$1:$A$4 中找小于 75 的最大值,也就是 A3 对应的 70 ,然后将对应的 $C$1:$C$4 区域中的 C3 中的值返回,这就是最终结果“良好”的由来。

         VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy ) ,第一个参数:需要查找的内容,这里是 A5 单元格;第二个参数:需要比较的表,这里是 $A$1:$C$4 ,注意 VLOOKUP 匹配时只与表中的第一列进行匹配。第三个参数:匹配结果对应的列序号。这里要对应的是成绩列,所以为 3 。第四个参数:指明是否模糊匹配。例子中的 TRUE 表示模糊匹配,与上例中一样。匹配到的是第三行。如果将此参数改为 FALSE ,因为在表中的第 1 列中找不到 75 ,所以会报“#N/A ”的计算错误。

     

    另外,还有与 VLOKUP 类似的 HLOOKUP 。不同的是 VLOOKUP 用于在表格或数值数组的首列查找指定的数值,并由此返回表格或数组当前行中指定列处的数值。而HLOOKUP 用于在表格或数值数组的首行查找指定的数值,并由此返回表格或数组当前列中指定行处的数值。读者可以自已去尝试。

    (8)随机数函数

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. row.createCell(0).setCellFormula("RAND()");//取0-1之间的随机数
    4. row.createCell(1).setCellFormula("int(RAND()*100)");//取0-100之间的随机整数
    5. row.createCell(2).setCellFormula("rand()*10+10");//取10-20之间的随机实数
    6. row.createCell(3).setCellFormula("CHAR(INT(RAND()*26)+97)");//随机小写字母
    7. row.createCell(4).setCellFormula("CHAR(INT(RAND()*26)+65)");//随机大写字母
    8. //随机大小写字母
    9. row.createCell(5).setCellFormula("CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,97,65))");

         以上代码中的公式说明:

              上面几例中除了用到RAND函数以外,还用到了CHAR函数用来将ASCII码换为字母,INT函数用来取整。值得注意的是INT函数不会四舍五入,无论小数点后是多少都会被舍去。

    (9)获得公式的返回值

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(0);
    3. row.createCell(0).setCellValue(7);//A1
    4. row.createCell(1).setCellValue(8);//B1
    5. HSSFCell cell=row.createCell(2);
    6. cell.setCellFormula("A1*B1+14");
    7. HSSFFormulaEvaluator e = newHSSFFormulaEvaluator(workbook);
    8. cell = e.evaluateInCell(cell);//若Excel文件不是POI创建的,则不必调用此方法
    9. System.out.println("公式计算结果:"+cell.getNumericCellValue());

    5.使用图形

    (1)画线

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
    3. HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short)1, 0,(short)4, 4);
    4. HSSFSimpleShape line = patriarch.createSimpleShape(anchor);
    5. line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//设置图形类型
    6. line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//设置图形样式
    7. line.setLineWidth(6350);//在POI中线的宽度12700表示1pt,所以这里是0.5pt粗的线条。

         通常,利用POI画图主要有以下几个步骤:

              1. 创建一个Patriarch(注意,一个sheet中通常只创建一个Patriarch对象);

              2. 创建一个Anchor,以确定图形的位置;

              3. 调用Patriarch创建图形;

              4. 设置图形类型(直线,矩形,圆形等)及样式(颜色,粗细等)。

         关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数,有必要在这里说明一下:

              dx1:起始单元格的x偏移量,如例子中的0表示直线起始位置距B1单元格左侧的距离;

              dy1:起始单元格的y偏移量,如例子中的0表示直线起始位置距B1单元格上侧的距离;

              dx2:终止单元格的x偏移量,如例子中的0表示直线起始位置距E5单元格左侧的距离;

              dy2:终止单元格的y偏移量,如例子中的0表示直线起始位置距E5单元格上侧的距离;

              col1:起始单元格列序号,从0开始计算;

              row1:起始单元格行序号,从0开始计算,如例子中col1=1,row1=0就表示起始单元格为B1;

              col2:终止单元格列序号,从0开始计算;

              row2:终止单元格行序号,从0开始计算,如例子中col2=4,row2=4就表示起始单元格为E5;

         最后,关于LineStyle属性,有如下一些可选值,对应的效果分别如图所示:

    (2)画矩形

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFPatriarch patriarch=sheet.createDrawingPatriarch();
    3. HSSFClientAnchor anchor = new HSSFClientAnchor(255,122,255, 122, (short)1, 0,(short)4, 3);
    4. HSSFSimpleShape rec = patriarch.createSimpleShape(anchor);
    5. rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
    6. rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//设置边框样式
    7. rec.setFillColor(255, 0, 0);//设置填充色
    8. rec.setLineWidth(25400);//设置边框宽度
    9. rec.setLineStyleColor(0, 0, 255);//设置边框颜色

    (3)画圆形

         更改上例的代码如下:

             rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);//设置图片类型

    (4)画Grid

         在POI中,本身没有画Grid(网格)的方法。但我们知道Grid其实就是由横线和竖线构成的,所在我们可以通过画线的方式来模拟画Grid。代码如下:

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. HSSFRow row = sheet.createRow(2);
    3. row.createCell(1);
    4. row.setHeightInPoints(240);
    5. sheet.setColumnWidth(2, 9000);
    6. int linesCount = 20;
    7. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
    8. //因为HSSFClientAnchor中dx只能在0-1023之间,dy只能在0-255之间,这里采用比例的方式
    9. double xRatio = 1023.0 / (linesCount * 10);
    10. double yRatio = 255.0 / (linesCount * 10);
    11. // 画竖线
    12. int x1 = 0;
    13. int y1 = 0;
    14. int x2 = 0;
    15. int y2 = 200;
    16. for (int i = 0; i < linesCount; i++)
    17. {
    18.  HSSFClientAnchor a2 = new HSSFClientAnchor();
    19. a2.setAnchor((short) 2, 2, (int) (x1 * xRatio),
    20.  (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio),
    21.  (int) (y2 * yRatio));
    22.  HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2);
    23. shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
    24. x1 += 10;
    25. x2 += 10;
    26. }
    27. // 画横线
    28. x1 = 0;
    29. y1 = 0;
    30. x2 = 200;
    31. y2 = 0;
    32. for (int i = 0; i < linesCount; i++)
    33. {
    34.  HSSFClientAnchor a2 = new HSSFClientAnchor();
    35. a2.setAnchor((short) 2, 2, (int) (x1 * xRatio),
    36.  (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio),
    37.  (int) (y2 * yRatio));
    38.  HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2);
    39. shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);
    40. y1 += 10;
    41. y2 += 10;
    42. }

    (5)插入图片

    1. HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)
    2. FileInputStream stream=newFileInputStream("d:\\POI\\Apache.gif");
    3. byte[] bytes=new byte[(int)stream.getChannel().size()];
    4. stream.read(bytes);//读取图片到二进制数组
    5. int pictureIdx = workbook.addPicture(bytes,HSSFWorkbook.PICTURE_TYPE_JPEG);
    6. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
    7. HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short)0, 0, (short)5, 5);
    8. HSSFPicture pict = patriarch.createPicture(anchor,pictureIdx);
    9. //pict.resize();//自动调节图片大小,图片位置信息可能丢失

    (6)从Excel文件提取图片

    1. InputStream inp = new FileInputStream(filePath);
    2. HSSFWorkbook workbook = new HSSFWorkbook(inp);//读取现有的Excel文件
    3. List<HSSFPictureData> pictures = workbook.getAllPictures();
    4. for(int i=0;i<pictures.size();i++)
    5. {
    6.  HSSFPictureData pic=pictures.get(i);
    7.  String ext = pic.suggestFileExtension();
    8.  if (ext.equals("png"))//判断文件格式
    9.  {
    10.  FileOutputStream png=newFileOutputStream("d:\\POI\\Apache.png");
    11. png.write(pic.getData());
    12. png.close();//保存图片
    13.  }
    14. }

    6.Excel表操作

    (1)设置默认工作表

    1. HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)
    2. workbook.createSheet("Test0");// 创建工作表(Sheet)
    3. workbook.createSheet("Test1");// 创建工作表(Sheet)
    4. workbook.createSheet("Test2");// 创建工作表(Sheet)
    5. workbook.createSheet("Test3");// 创建工作表(Sheet)
    6. workbook.setActiveSheet(2);//设置默认工作表

    (2)重命名工作表

    1. HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)
    2. workbook.createSheet("Test0");// 创建工作表(Sheet)
    3. workbook.createSheet("Test1");// 创建工作表(Sheet)
    4. workbook.createSheet("Test2");// 创建工作表(Sheet)
    5. workbook.createSheet("Test3");// 创建工作表(Sheet)
    6. workbook.setSheetName(2, "1234");//重命名工作表

    (3)调整表单显示比例

    1. HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)
    2. HSSFSheet sheet1= workbook.createSheet("Test0");// 创建工作表(Sheet)
    3. HSSFSheet sheet2=workbook.createSheet("Test1");// 创建工作表(Sheet)
    4. HSSFSheet sheet3=workbook.createSheet("Test2");// 创建工作表(Sheet)
    5. sheet1.setZoom(1,2);//50%显示比例
    6. sheet2.setZoom(2,1);//200%显示比例
    7. sheet3.setZoom(1,10);//10%显示比例

    (4)显示/隐藏网格线

    1. HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)
    2. HSSFSheet sheet1= workbook.createSheet("Test0");// 创建工作表(Sheet)
    3. HSSFSheet sheet2=workbook.createSheet("Test1");// 创建工作表(Sheet)
    4. sheet1.setDisplayGridlines(false);//隐藏Excel网格线,默认值为true
    5. sheet2.setGridsPrinted(true);//打印时显示网格线,默认值为false

    (5)遍历Sheet

    1. String filePath = "d:\\users\\lizw\\桌面\\POI\\sample.xls";
    2. FileInputStream stream = new FileInputStream(filePath);
    3. HSSFWorkbook workbook = new HSSFWorkbook(stream);//读取现有的Excel
    4. HSSFSheet sheet= workbook.getSheet("Test0");//得到指定名称的Sheet
    5. for (Row row : sheet)
    6. {
    7.  for (Cell cell : row)
    8.  {
    9.  System.out.print(cell + "\t");
    10.  }
    11.  System.out.println();
    12. }

    7.Excel行列操作

    (1)组合行、列

    1. HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)
    2. sheet.groupRow(1, 3);//组合行
    3. sheet.groupRow(2, 4);//组合行
    4. sheet.groupColumn(2, 7);//组合列

         这里简单的介绍一下什么叫做组合:组合分为行组合和列组合,所谓行组合,就是让n行组合成一个集合,能够进行展开和合拢操作。

         使用POI也可以取消组合,例如:sheet.ungroupColumn(1, 3);//取消列组合

    (2)锁定列

         在Excel中,有时可能会出现列数太多或是行数太多的情况,这时可以通过锁定列来冻结部分列,不随滚动条滑动,方便查看。

    1. HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)
    2. sheet.createFreezePane(2, 3, 15, 25);//冻结行列

         下面对CreateFreezePane的参数作一下说明:

              第一个参数表示要冻结的列数;

              第二个参数表示要冻结的行数,这里只冻结列所以为0;

              第三个参数表示右边区域可见的首列序号,从1开始计算;

              第四个参数表示下边区域可见的首行序号,也是从1开始计算,这里是冻结列,所以为0;

    (3)上下移动行

    1. FileInputStream stream = new FileInputStream(filePath);
    2. HSSFWorkbook workbook = new HSSFWorkbook(stream);
    3. HSSFSheet sheet = workbook.getSheet("Test0");
    4. sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移动两行

         HSSFSheet.shiftRows(startRow, endRow, n)参数说明

              startRow:需要移动的起始行;

              endRow:需要移动的结束行;

              n:移动的位置,正数表示向下移动,负数表示向上移动;

     

    8.Excel的其他功能

    (1)设置密码

    1. HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)
    2. HSSFRow row=sheet.createRow(1);
    3. HSSFCell cell=row.createCell(1);
    4. cell.setCellValue("已锁定");
    5. HSSFCellStyle locked = workbook.createCellStyle();
    6. locked.setLocked(true);//设置锁定
    7. cell.setCellStyle(locked);
    8. cell=row.createCell(2);
    9. cell.setCellValue("未锁定");
    10. HSSFCellStyle unlocked = workbook.createCellStyle();
    11. unlocked.setLocked(false);//设置不锁定
    12. cell.setCellStyle(unlocked);
    13. sheet.protectSheet("password");//设置保护密码

    (2)数据有效性

    1. HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)
    2. HSSFRow row=sheet.createRow(0);
    3. HSSFCell cell=row.createCell(0);
    4. cell.setCellValue("日期列");
    5. CellRangeAddressList regions = new CellRangeAddressList(1, 65535,0, 0);//选定一个区域
    6. DVConstraint constraint = DVConstraint.createDateConstraint(DVConstraint . OperatorType . BETWEEN , "1993-01-01" ,"2014-12-31" , "yyyy-MM-dd" );
    7. HSSFDataValidation dataValidate = new HSSFDataValidation(regions,constraint);
    8. dataValidate.createErrorBox("错误", "你必须输入一个时间!");
    9. sheet.addValidationData(dataValidate);

    CellRangeAddressList类表示一个区域,构造函数中的四个参数分别表示起始行序号,终止行序号,起始列序号,终止列序号。65535是一个Sheet的最大行数。另外,CreateDateConstraint的第一个参数除了设置成DVConstraint.OperatorType.BETWEEN外,还可以设置成如下一些值,大家可以自己一个个去试看看效果:

    验证的数据类型也有几种选择,如下:

    (3)生成下拉式菜单

    1. CellRangeAddressList regions = new CellRangeAddressList(0, 65535,0, 0);
    2. DVConstraint constraint =DVConstraint.createExplicitListConstraint(new String[] { "C++","Java", "C#" });
    3. HSSFDataValidation dataValidate = new HSSFDataValidation(regions,constraint);
    4. sheet.addValidationData(dataValidate);

    (4)打印基本设置

    1. HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)
    2. HSSFPrintSetup print = sheet.getPrintSetup();//得到打印对象
    3. print.setLandscape(false);//true,则表示页面方向为横向;否则为纵向
    4. print.setScale((short)80);//缩放比例80%(设置为0-100之间的值)
    5. print.setFitWidth((short)2);//设置页宽
    6. print.setFitHeight((short)4);//设置页高
    7. print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//纸张设置
    8. print.setUsePage(true);//设置打印起始页码不使用"自动"
    9. print.setPageStart((short)6);//设置打印起始页码
    10. sheet.setPrintGridlines(true);//设置打印网格线
    11. print.setNoColor(true);//值为true时,表示单色打印
    12. print.setDraft(true);//值为true时,表示用草稿品质打印
    13. print.setLeftToRight(true);//true表示“先行后列”;false表示“先列后行”
    14. print.setNotes(true);//设置打印批注
    15. sheet.setAutobreaks(false);//Sheet页自适应页面大小

    更详细的打印设置请参考: http://tonyqus.sinaapp.com/archives/271

    (5)超链接

    1. HSSFSheet sheet = workbook.createSheet("Test0");
    2. CreationHelper createHelper = workbook.getCreationHelper();
    3. // 关联到网站
    4. Hyperlink link =createHelper.createHyperlink(Hyperlink.LINK_URL);
    5. link.setAddress("http://poi.apache.org/");
    6. sheet.createRow(0).createCell(0).setHyperlink(link);
    7. // 关联到当前目录的文件
    8. link = createHelper.createHyperlink(Hyperlink.LINK_FILE);
    9. link.setAddress("sample.xls");
    10. sheet.createRow(0).createCell(1).setHyperlink(link);
    11. // e-mail 关联
    12. link = createHelper.createHyperlink(Hyperlink.LINK_EMAIL);
    13. link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");
    14. sheet.createRow(0).createCell(2).setHyperlink(link);
    15. //关联到工作簿中的位置
    16. link = createHelper.createHyperlink(Hyperlink.LINK_DOCUMENT);
    17. link.setAddress("'Test0'!C3");//Sheet名为Test0的C3位置
    18. sheet.createRow(0).createCell(3).setHyperlink(link);

    9.POI对Word的基本操作

    (1)POI操作Word简介

    POI读写Excel功能强大、操作简单。但是POI操作时,一般只用它读取word文档,POI只能能够创建简单的word文档,相对而言POI操作时的功能太少。

    (2)POI创建Word文档的简单示例

    1. XWPFDocument doc = new XWPFDocument();// 创建Word文件
    2. XWPFParagraph p = doc.createParagraph();// 新建一个段落
    3. p.setAlignment(ParagraphAlignment.CENTER);// 设置段落的对齐方式
    4. p.setBorderBottom(Borders.DOUBLE);//设置下边框
    5. p.setBorderTop(Borders.DOUBLE);//设置上边框
    6. p.setBorderRight(Borders.DOUBLE);//设置右边框
    7. p.setBorderLeft(Borders.DOUBLE);//设置左边框
    8. XWPFRun r = p.createRun();//创建段落文本
    9. r.setText("POI创建的Word段落文本");
    10. r.setBold(true);//设置为粗体
    11. r.setColor("FF0000");//设置颜色
    12. p = doc.createParagraph();// 新建一个段落
    13. r = p.createRun();
    14. r.setText("POI读写Excel功能强大、操作简单。");
    15. XWPFTable table= doc.createTable(3, 3);//创建一个表格
    16. table.getRow(0).getCell(0).setText("表格1");
    17. table.getRow(1).getCell(1).setText("表格2");
    18. table.getRow(2).getCell(2).setText("表格3");
    19. FileOutputStream out = newFileOutputStream("d:\\POI\\sample.doc");
    20. doc.write(out);
    21. out.close();

    (3)POI读取Word文档里的文字

    1. FileInputStream stream = newFileInputStream("d:\\POI\\sample.doc");
    2. XWPFDocument doc = new XWPFDocument(stream);// 创建Word文件
    3. for(XWPFParagraph p : doc.getParagraphs())//遍历段落
    4. {
    5.  System.out.print(p.getParagraphText());
    6. }
    7. for(XWPFTable table : doc.getTables())//遍历表格
    8. {
    9.  for(XWPFTableRow row : table.getRows())
    10.  {
    11.  for(XWPFTableCell cell : row.getTableCells())
    12.  {
    13.  System.out.print(cell.getText());
    14.  }
    15.  }
    16. }

     

    展开全文
  • java实现Excel的导入导出

    万次阅读 多人点赞 2018-01-03 21:40:06
    一.Excel读写技术 ...1.从数据库将数据导出excel表格 public class JxlExcel { public static void main(String[] args) { //创建Excel文件 String[] title= {"姓名","课程名","分数"}; File

    一.Excel读写技术



    区别:



    二.jxl读写基础代码


    1.从数据库将数据导出到excel表格

    public class JxlExcel {
    public static void main(String[] args) {
    	//创建Excel文件
    	String[] title= {"姓名","课程名","分数"};
    	File file=new File("f:/sheet1.xls");
    	try {
    		file.createNewFile();
    		//创建工作簿
    		WritableWorkbook  workbook=Workbook.createWorkbook(file);
    		//创建Sheet
    		WritableSheet sheet=workbook.createSheet("表格一", 20);
    		//第一行设置列名
    		Label label=null;
    		for (int i = 0; i < title.length; i++) {
    			label=new Label(i, 0, title[i]);//第一个参数为列,第二个为行
    			sheet.addCell(label);
    		}
    		Data data=new Data();
    		ResultSet rs=data.getString();
    		while(rs.next()) {
    			System.out.println(rs.getString(1));
    			label=new Label(0,rs.getRow(),rs.getString(1));
    			sheet.addCell(label);
    			label=new Label(1,rs.getRow(),rs.getString(2));
    			sheet.addCell(label);
    			label=new Label(2,rs.getRow(),rs.getString(3));
    			sheet.addCell(label);
    		}
    		workbook.write();
    		workbook.close();
    	} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    
    }
    

    2,从Excel表格中读取数据
    public class JxlRead {
    public static void main(String[] args) {
    	//创建workbook
    	try {
    		Workbook workbook=Workbook.getWorkbook(new File("f:/sheet1.xls"));
       //获取第一个表格
    		Sheet sheet=workbook.getSheet(0);
    	//获取数据
    		for (int i = 0; i < sheet.getRows(); i++) {
    			for (int j = 0; j < sheet.getColumns(); j++) {
    				Cell cell=sheet.getCell(j, i);
    				System.out.print(cell.getContents()+" ");
    			}
    			System.out.println();
    		}
    	}  catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	
    }
    }
    

    三.Poi读写基础代码

    //所需jar包:commons-io-2.2.jar;poi-3.11-20141221.jar
    //通过poi进行excel导入数据
    public class PoiExcel {
    public static void main(String[] args) throws SQLException {
    	String title[]= {"名字","课程","分数"};
    	//1.创建Excel工作簿
    	HSSFWorkbook workbook=new HSSFWorkbook();
    	//2.创建一个工作表
    	HSSFSheet sheet=workbook.createSheet("sheet2");
    	//3.创建第一行
    	HSSFRow row=sheet.createRow(0);
    	HSSFCell cell=null;
    	//4.插入第一行数据
    	for (int i = 0; i < title.length; i++) {
    		cell=row.createCell(i);
    		cell.setCellValue(title[i]);
    	}
    	//5.追加数据
    	Data data=new Data();
    	ResultSet rs=data.getString();
    	while(rs.next()) {
    		HSSFRow row2=sheet.createRow(rs.getRow());
    		HSSFCell cell2=row2.createCell(0);
    		cell2.setCellValue(rs.getString(1));
    		cell2=row2.createCell(1);
    		cell2.setCellValue(rs.getString(2));
    		cell2=row2.createCell(2);
    		cell2.setCellValue(rs.getString(3));
    	}
    	//创建一个文件,将Excel内容存盘
    	File file=new File("e:/sheet2.xls");
    	try {
    		file.createNewFile();
    		FileOutputStream stream=FileUtils.openOutputStream(file);
    		workbook.write(stream);
    		stream.close();
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	
    }
    }
    

    //将Excel表中内容读取
    public class PoiRead {
    public static void main(String[] args) {
    	//需要解析的Excel文件
    	File file=new  File("e:/sheet2.xls");
    	try {
    		//获取工作簿
    		FileInputStream fs=FileUtils.openInputStream(file);
    		HSSFWorkbook workbook=new HSSFWorkbook(fs);
    	    //获取第一个工作表
    		HSSFSheet hs=workbook.getSheetAt(0);
    		//获取Sheet的第一个行号和最后一个行号
    	   int last=hs.getLastRowNum();
    	   int first=hs.getFirstRowNum();
    	   //遍历获取单元格里的信息
    	   for (int i = first; i <last; i++) {
    		HSSFRow row=hs.getRow(i);
    		int firstCellNum=row.getFirstCellNum();//获取所在行的第一个行号
    		int lastCellNum=row.getLastCellNum();//获取所在行的最后一个行号
    		for (int j = firstCellNum; j <lastCellNum; j++) {
    			HSSFCell cell=row.getCell(j);
    			String value=cell.getStringCellValue();
    			System.out.print(value+" ");
    		}
    		System.out.println();
    	}
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    }


    如果Excel版本过高则需要改写用XSSF
    public class PoiExpExcel2 {
    
    	/**
    	 * POI生成Excel文件
    	 * @author David
    	 * @param args
    	 */
    	public static void main(String[] args) {
    
    		String[] title = {"id","name","sex"};
    		
    		//创建Excel工作簿
    		XSSFWorkbook workbook = new XSSFWorkbook();
    		//创建一个工作表sheet
    		Sheet sheet = workbook.createSheet();
    		//创建第一行
    		Row row = sheet.createRow(0);
    		Cell cell = null;
    		//插入第一行数据 id,name,sex
    		for (int i = 0; i < title.length; i++) {
    			cell = row.createCell(i);
    			cell.setCellValue(title[i]);
    		}
    		//追加数据
    		for (int i = 1; i <= 10; i++) {
    			Row nextrow = sheet.createRow(i);
    			Cell cell2 = nextrow.createCell(0);
    			cell2.setCellValue("a" + i);
    			cell2 = nextrow.createCell(1);
    			cell2.setCellValue("user" + i);
    			cell2 = nextrow.createCell(2);
    			cell2.setCellValue("男");
    		}
    		//创建一个文件
    		File file = new File("e:/poi_test.xlsx");
    		try {
    			file.createNewFile();
    			//将Excel内容存盘
    			FileOutputStream stream = FileUtils.openOutputStream(file);
    			workbook.write(stream);
    			stream.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    	}
    
    }


    四.定制导入模板

    1.首先准备好模板的.xml文件,然后导入所需的jar包
    例子:student.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <excel id="student" code="student" name="学生信息导入">
        <colgroup>
            <col index="A" width='17em'></col>
            <col index="B" width='17em'></col>
            <col index="C" width='17em'></col>
            <col index="D" width='17em'></col>
            <col index="E" width='17em'></col>
            <col index="F" width='17em'></col>        
        </colgroup>
        <title>
            <tr height="16px">
                <td rowspan="1" colspan="6" value="学生信息导入" />
            </tr>
        </title>
        <thead>
            <tr height="16px">
            	<th value="编号" />
                <th value="姓名" />
                <th value="年龄" />
                <th value="性别" />
                <th value="出生日期" />
                <th value=" 爱好" />            
            </tr>
        </thead>
        <tbody>
            <tr height="16px" firstrow="2" firstcol="0" repeat="5">
                <td type="string" isnullable="false" maxlength="30" /><!--用户编号 -->
                <td type="string" isnullable="false" maxlength="50" /><!--姓名 -->
                <td type="numeric" format="##0" isnullable="false" /><!--年龄 -->
                <td type="enum" format="男,女" isnullable="true" /><!--性别 -->
                <td type="date" isnullable="false" maxlength="30" /><!--出生日期 -->
                <td type="enum" format="足球,篮球,乒乓球" isnullable="true" /><!--爱好 -->
            </tr>
        </tbody>
    </excel>

    所需jar包:
    commons-lang3-3.1.jar
    jdom.jar
    poi-3.11-20141221.jar
    commons-io-2.2.jar

    java代码:
    //准备工作:导入相关jar包commons-lang3-3.1.jar,jdom.jar,poi-3.11-20141221.jar
    public class CreateTemp {
    public static void main(String[] args) {
    	//获取解析Xml路径
    	String path=System.getProperty("user.dir")+"/student.xml";
    	File file=new File(path);
    	SAXBuilder builder=new SAXBuilder();
    	//解析xml文件
    	try {
    		Document document=builder.build(file);
    	//创建Excel
    		HSSFWorkbook workbook=new HSSFWorkbook();
    	//创建表格
    		HSSFSheet sheet=workbook.createSheet("sheet0");
    	//获取Xml文件的根节点
    		Element root=document.getRootElement();
    	//获取模板名称
    		String tempName=root.getAttributeValue("name");
    	//设置列宽
    		Element colgroup=root.getChild("colgroup");
    		setColumnWidth(sheet,colgroup);
    	//设置标题
    		int rownum = 0;
    		int column = 0;
    		Element title=root.getChild("title");
    		List<Element> trs=title.getChildren("tr");
    		for (int i = 0; i <trs.size(); i++) {
    			Element tr=trs.get(i);
    			List<Element> tds=tr.getChildren("td");
    			HSSFRow row=sheet.createRow(rownum);
    			HSSFCellStyle cellStyle=workbook.createCellStyle();//创建单元格格式
    			cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//标题居中
    			for (int j = 0; j < tds.size(); j++) {
    			   Element td=tds.get(j);
    			   HSSFCell cell=row.createCell(j);
    			   Attribute rowspan=td.getAttribute("rowspan");
    			   Attribute colspan=td.getAttribute("colspan");
    			   Attribute value=td.getAttribute("value");
    			   if (value!=null) {
    				String content=value.getValue();
    			
    				cell.setCellValue(content);
    				int rspan=rowspan.getIntValue()-1;
    				int cspan=colspan.getIntValue()-1;
    				//设置字体
    				HSSFFont font=workbook.createFont();
    				font.setFontName("仿宋_GB2312");
    				font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗
    //				font.setFontHeight((short)12);
    				font.setFontHeightInPoints((short)12);
    				cellStyle.setFont(font);
    				cell.setCellStyle(cellStyle);
    				//合并单元格居中
    				sheet.addMergedRegion(new CellRangeAddress(rspan, rspan, 0, cspan));
    			}
    			   
    			}
    			rownum++;
    			
    		}
    		//设置表头
    		Element thead=root.getChild("thead");
    		trs=thead.getChildren("tr");
    		for (int i = 0; i < trs.size(); i++) {
    			Element tr=trs.get(i);
    			HSSFRow row=sheet.createRow(rownum);
    			 List<Element> ths=tr.getChildren("th");
    			 for (int j = 0; j <ths.size(); j++) {
    				Element th=ths.get(j);
    				HSSFCell cell=row.createCell(j);
    			     Attribute value=th.getAttribute("value");
    			     if (value!=null) {
    			    	 String content=value.getValue();
                        cell.setCellValue(content);	
                       
    				}
    			 }
    			 rownum++;
    		}
    		
    		//设置数据区域样式
    		     Element  tbody = root.getChild("tbody");
    		     Element tr=tbody.getChild("tr");
    		     int repeat=tr.getAttribute("repeat").getIntValue();
    		     List<Element> tds=tr.getChildren("td");
    		     for (int i = 0; i < repeat; i++) {
    				HSSFRow row=sheet.createRow(rownum);
    				for (int j = 0; j < tds.size(); j++) {
    					Element td=tds.get(j);
    					HSSFCell cell=row.createCell(j);
    					setType(workbook,cell,td);
    				}
    			}
    		     rownum++;
    		//生成Excel导入模板
    		     File tempFile=new File("e:/"+tempName+".xls");
    		     tempFile.delete();
    		     tempFile.createNewFile();
    		     FileOutputStream fos=FileUtils.openOutputStream(tempFile);
    		     workbook.write(fos);
    		     fos.close();
    		     
    	}  catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    
    private static void setType(HSSFWorkbook workbook, HSSFCell cell, Element td) {
    	Attribute typeAttr = td.getAttribute("type");
    	String type = typeAttr.getValue();
    	HSSFDataFormat format = workbook.createDataFormat();
    	HSSFCellStyle cellStyle = workbook.createCellStyle();
    	if("NUMERIC".equalsIgnoreCase(type)){
    		cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
    		Attribute formatAttr = td.getAttribute("format");
    		String formatValue = formatAttr.getValue();
    		formatValue = StringUtils.isNotBlank(formatValue)? formatValue : "#,##0.00";
    		cellStyle.setDataFormat(format.getFormat(formatValue));
    	}else if("STRING".equalsIgnoreCase(type)){
    		cell.setCellValue("");
    		cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    		cellStyle.setDataFormat(format.getFormat("@"));
    	}else if("DATE".equalsIgnoreCase(type)){
    		cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
    		cellStyle.setDataFormat(format.getFormat("yyyy-m-d"));
    	}else if("ENUM".equalsIgnoreCase(type)){
    		CellRangeAddressList regions = 
    			new CellRangeAddressList(cell.getRowIndex(), cell.getRowIndex(), 
    					cell.getColumnIndex(), cell.getColumnIndex());
    		
    		Attribute enumAttr = td.getAttribute("format");
    		String enumValue = enumAttr.getValue();
    		//加载下拉列表内容
    		DVConstraint constraint = 
    			DVConstraint.createExplicitListConstraint(enumValue.split(","));
    		//数据有效性对象
    		HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);
    		workbook.getSheetAt(0).addValidationData(dataValidation);
    	}
    	cell.setCellStyle(cellStyle);
    	
    }
    
    private static void setColumnWidth(HSSFSheet sheet, Element colgroup) {
    	List<Element> cols=colgroup.getChildren("col");//获取col的节点
    	for (int i = 0; i < cols.size(); i++) {
    		Element col=cols.get(i);
    		Attribute width=col.getAttribute("width");//获取每列中的width属性
    		String unit = width.getValue().replaceAll("[0-9,\\.]", "");//单位
    		String value = width.getValue().replaceAll(unit, "");//数值
    		int v=0;
    		if(StringUtils.isBlank(unit) || "px".endsWith(unit)){
    			v = Math.round(Float.parseFloat(value) * 37F);
    		}else if ("em".endsWith(unit)){
    			v = Math.round(Float.parseFloat(value) * 267.5F);
    		}//对单位进行判断
    		sheet.setColumnWidth(i, v);
    	}
    	
    }
    }
    



    展开全文
  • Java使用POI导出Excel

    万次阅读 2019-06-09 13:05:46
    不管是Web开发还是桌面开发,对办公软件的操作是常有的需求,如对微软Excel电子表格的操作,经常需要对一些数据导出Excel文件,或将一个Excel文件的数据读取到数据库。在java操作Excel可以使用POI组件或JXL组件。 ...
  • POI百万级大数据量EXCEL导出

    万次阅读 多人点赞 2019-06-21 17:43:29
    excel导出,如果数据量在百万级,会出现俩点内存溢出的问题: 1. 查询数据量过大,导致内存溢出。 该问题可以通过分批查询来解决; 2. 最后下载的时候大EXCEL转换的输出流内存溢出;该方式可以通过新版的...
  • Excel导出

    千次阅读 2018-01-24 15:15:29
    这篇博客主要介绍的是excel导出数据的功能,将数据导入到excel表格中进行显示 1.准备相应的按钮和数据 给一个点击按钮,保证数据库里面有相应的数据,同时准备好查询语句。我这边准备的是一个查询所有数据的sql ...
  • 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个导出,POI百万级大数据量EXCEL导出 采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件上以解决...
  • JAVA实现Excel的导入导出

    万次阅读 2018-09-30 11:33:33
    近期项目中需要实现导入excel数据到数据库,导出数据库的数据生成excel表格,由于第一次使用,做一下笔记方便以后使用. 1.首先引入jar包,由于创建的是Maven项目,因此直接在项目中的pom.xml中配置 &amp;amp;amp...
  • 使用easyexcel导出excel文件

    万次阅读 热门讨论 2019-04-18 21:58:18
    这里是导出一个excel文件,里面有两个sheet 分别是税赋预测表和发票汇总表 controller层 @requestMapping(value = &amp;quot;/exportExcel/taxForecast&amp;quot;, method = Method.GET) public Result&...
  • 关于excel导出日期格式变化问题处理

    万次阅读 2019-03-13 15:03:10
    关于excel导出日期格式变化问题处理 1.问题描述:java web项目,本来部署在windows下,导出数据库数据是,创建日期格式为2018-08-08 08:08:08。因服务器性能问题,迁移服务器至linux(centos 7.5)。现成操作人员...
  • Easypoi模版形式导出excel导出图片

    千次阅读 2019-02-27 14:17:09
    若您正在使用easypoi进行excel导出的话,希望这篇文章能帮到您。 本文主要是使用easypoi通过模版的形式导出图片。 若需要导出多sheet得话,非模版形式,可以参考我的文章EasyPOI-&gt;非模版形式导出Excel(多...
  • easyPoi导出excel导出错误解决方案 最近项目中忽然出现excel不能导出的错误,以前测试是好用的,跟代码发现是在默认样式时报控制针问题,此问题为poi依赖缺少或者easypoi版本太低导致,项目中使用的为3.0.1版本,又...
  • 使用table2excel导出时间问题

    千次阅读 2018-02-14 22:42:28
    )进行转化,所以在存储的时候之间存成String类型,结果发现在使用table2excel导出的时候,时间出现了问题。然而查看之前的是java.util.Date类型的数据转化成的时间类型导出的时间是没有问题的,所以发现这个肯定是...
  • Excel导出失败的解决方案

    千次阅读 2019-03-27 11:45:27
    我按照同事给的步骤配置excel导出功能(如下所示)。 由于导出Excel功能需要服务器安装Microsoft Office Excel应用程序,并配置Asp.Net用户权限,以下是配置的操作步骤: 1)、开始--〉运行--〉cmd; 2)、命令提示...
  • excel导出引起的cpu 100% 和gc 的问题

    千次阅读 2018-12-29 14:20:11
     记一次 由excel导出 导致的cpu飙升200%,jvm 内存不足。 1. 场景复现  前端页面导出Excel,之前导出4,5W条数据都没什么问题的。  今天业务突然反馈说导出不了了,我试着导出了2w数据,发现页面卡住了,  ...
  • 如果是大项目、要求高,当然使用第三方插件,或者后台导出是必要的,但是如果是一些小型项目,并且对导出excel样式要求不是很严格的,而且前端框架用的是layui的,layui框架自带的excel导出就成了我们最方便快捷的...
  • 今天在做excel导出的时候,导出的表格中长度大于11的数字会自动用科学计数法显示。 一开始,我想着直接将数据全部转为string类型,没想到还是无法解决问题(可能是excel工具自动识别数字,又将其转成科学计数了)。...
  • java百万级别excel导出(easyExcel)

    千次阅读 2018-11-06 11:09:35
    1.为什么需要excel到处? 导出功能在各个领域都被广泛的运用,当用户想...2.如何选择合适的excel导出? 选择的问题一般都比较纠结,选择了一个版本之后发现另外一个版本更适合,所以我们就应该选择一些我们相对较...
  • java实现不固定行列数excel导出

    千次阅读 2017-11-18 18:28:45
    最近在做一个不固定行列的excel导出。由于之前都是用公司封装的导出功能,直接传一个list对象进去,具体实现也不用知道。但是这个需求比较特殊,行和列都是不固定的,前台选择一个证券组合和一段日期,导出该组合,...
1 2 3 4 5 ... 20
收藏数 114,635
精华内容 45,854
关键字:

excel导出