java代码的Excel表单数据的导出

所用到的技术 : Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。

用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MS PowerPoint文件。Apache POI 提供Java操作Excel解决方案。

入门案例:思路:1.导入依赖   2.测试

1.导入所需要的依赖 

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

2.建立一个Excel表格 进行测试

public static void main(String[] args) throws FileNotFoundException, IOException {
        // 创建excel
        HSSFWorkbook wk = new HSSFWorkbook();
        // 创建一张工作表
        HSSFSheet sheet = wk.createSheet();
        // 设置列宽
        sheet.setColumnWidth(0, 5000);
        // 创建第一行
        HSSFRow row = sheet.createRow(0);
        // 创建第一行的第一个单元格
        HSSFCell cell = row.createCell(0);
        // 想单元格写值
        cell.setCellValue("测试");
        // 保存到本地
        wk.write(new FileOutputStream(new File("D://ERP/a.xls")));
        // 关闭工作薄
        wk.close();
    }

结合项目:思路:1.导入依赖  2.service 层 3.Action 层 4.Web 层

1.导入项目依赖

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

2.service 层

思路:

  1. 创建工作表格实体类
  2. 给表格一个名字
  3. 工作表格的创建
  4. 创建行,创建每个单元格
  5. 给每个单元格填数据
  6. 关流
/**
     * 导出供应商的数据
     */
    @Override
    public void export(OutputStream os, Supplier t1) {
        //查出符合条件的所供应/客户的列表(数据库查找数据)
        List<Supplier> supplierList = supplierDao.getList(t1, null, null);
        //创建工作薄实体类
        Workbook wk = new HSSFWorkbook();

        //给工作表一个名字
        String sheetName = "";
        if(Supplier.TYPE_SUPPLIER.equals(t1.getType())){
            sheetName = "供应商";
        }
        if(Supplier.TYPE_CUSTOMER.equals(t1.getType())){
            sheetName = "客户";
        }
        //创建工作表实体类
        Sheet sheet = wk.createSheet(sheetName);
        
        //创建一行,参数指的是: 行的索引=行号-1
        Row row = sheet.createRow(0);
        //列名,表头
        String[] headers = {"名称","地址","联系人","电话","Email"};
        /*String[] methodname = {"getName","getAddress", 
                   "getContact","getTele","getEmail"};*/
        /*Method[] methods = Supplier.class.getMethods();
        Map<String, Method> methodNameMap = new HashMap<String,Method>();
        for(Method m : methods){
            methodNameMap.put(m.getName(), m);
        }*/
        for(int i = 0; i < headers.length; i++){
            row.createCell(i).setCellValue(headers[i]);
            
        }
        //创建单元格, 参数指的是:列的索引,从0开始
        //输出每一条记录
        if(null != supplierList && supplierList.size() > 0){
            Supplier supplier = null;
            for(int i = 1; i<=supplierList.size(); i++){
                row = sheet.createRow(i);
                supplier = supplierList.get(i-1);
                /*for(String mname : methodname){
                    Method m = methodNameMap.get(mname);
                    try {
                        Object obj = m.invoke(supplier, new Object[]{});
                        Class<?> returnType = m.getReturnType();
                        //returnType.cast(obj);
                        row.createCell(0).setCellValue(returnType.cast(obj));//名称
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }*/
                row.createCell(0).setCellValue(supplier.getName());//名称
                row.createCell(1).setCellValue(supplier.getAddress());//地址
                row.createCell(2).setCellValue(supplier.getContact());//联系
                row.createCell(3).setCellValue(supplier.getTele());//电话
                row.createCell(4).setCellValue(supplier.getEmail());//Email            
            }
        }
        
        //输出到输出流中
        try {
            wk.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                wk.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

3.action层

        思路:

               1.给下载的文件名字的判断

               2.设置下载的响应头

/**
 * 导出
 */
 public void export(){
      try {
           String filename = "";
           if(Supplier.TYPE_SUPPLIER.equals(getT1().getType())){
               filename = "供应商.xls";
           }
           if(Supplier.TYPE_CUSTOMER.equals(getT1().getType())){
               filename = "客户.xls";
           }
           HttpServletResponse res = ServletActionContext.getResponse();
           res.setHeader("Content-Disposition", "attachment;filename=" +
                    new String(filename.getBytes(),"ISO-8859-1"));
                            
          supplierBiz.export(ServletActionContext.getResponse().getOutputStream(),getT1());
           } catch (IOException e) {
              e.printStackTrace();
           }
    }

4.wed 层

  思路:

  1. 页面导出js
  2. js在抽取的crud中添加导出按钮
<script type="text/javascript" src="ui/download.js"></script>

'-',{
                text: '导出',
                iconCls: 'icon-excel',
                handler: function(){
                    //查询条件
                    var searchData = $('#searchForm').serializeJSON();
                    //请求下载文件
                    $.download("supplier_export?t1.type=" + Request['type'], searchData);
                }
            },

导出加强

 思路:

  1. 添加依赖
  2. service层创建创建表格和处理数据
  3. action层
  4. web层

1.添加依赖    (如上)

2.service层创建创建表格和处理数据

思路:1.创建表格 2.sheet名字 3.数据样式 4.行数 5.数据处理6.关流

/**
     * 导出订单
     */
    @Override
    public void exportById(OutputStream os, Long uuid) {
        //根据订单编号获取订单
        Orders orders = ordersDao.get(uuid);
        //订单明细
        List<Orderdetail> orderDetails = orders.getOrderDetails();
        
        String sheetName = "";
        if(Orders.TYPE_IN.equals(orders.getType())){
            sheetName = "采 购 单";
        }
        if(Orders.TYPE_OUT.equals(orders.getType())){
            sheetName = "销 售 单";
        }
        //工作簿
        HSSFWorkbook wk = new HSSFWorkbook();

        //创建工作表
        Sheet sheet = wk.createSheet(sheetName);
        
        //创建字体
        HSSFFont font_content = wk.createFont();
        font_content.setFontName("宋体");
        font_content.setFontHeightInPoints((short)12);
        
        //创建样式
        CellStyle style_content = wk.createCellStyle();
        //水平居中
        style_content.setAlignment(HorizontalAlignment.CENTER);
        //重直居中
        style_content.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置字体
        style_content.setFont(font_content);
        
        //标题的样式, 样式克隆
        CellStyle style_title = wk.createCellStyle();
        style_title.cloneStyleFrom(style_content);
        HSSFFont font_title = wk.createFont();
        font_title.setFontName("黑体");
        font_title.setFontHeightInPoints((short)20);
        style_title.setFont(font_title);
        
        //设置边框
        style_content.setBorderBottom(BorderStyle.THIN);
        style_content.setBorderLeft(BorderStyle.THIN);
        style_content.setBorderRight(BorderStyle.THIN);
        style_content.setBorderTop(BorderStyle.THIN);
        
        //日期样式
        HSSFCellStyle style_date = wk.createCellStyle();
        style_date.cloneStyleFrom(style_content);
        HSSFDataFormat dataFormat = wk.createDataFormat();
        style_date.setDataFormat(dataFormat.getFormat("yyyy-MM-dd hh:mm"));
        
        
        //创建一行,参数指的是: 行的索引=行号-1
        Row row = null;
        Cell cell = null;
        int rowCnt = 10 + orderDetails.size();
        for(int i = 2; i < rowCnt; i++){
            row = sheet.createRow(i);
            for(int j = 0; j < 4; j++){
                cell = row.createCell(j);
                //设置单元格样式
                cell.setCellStyle(style_content);
            }
        }
        //设置日期格式
        sheet.getRow(3).getCell(1).setCellStyle(style_date);
        sheet.getRow(4).getCell(1).setCellStyle(style_date);
        sheet.getRow(5).getCell(1).setCellStyle(style_date);
        sheet.getRow(6).getCell(1).setCellStyle(style_date);
        //sheet.getRow(3).getCell(1).setCellValue(new Date());
        
        //合并单元格,订单名称
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
        //供应商名称
        sheet.addMergedRegion(new CellRangeAddress(2,2,1,3));
        //明细
        sheet.addMergedRegion(new CellRangeAddress(7,7,0,3));
        
        //设置header内容
        Cell title_cell = sheet.createRow(0).createCell(0);
        title_cell.setCellStyle(style_title);
        title_cell.setCellValue("采 购 单");
        sheet.getRow(2).getCell(0).setCellValue("供应商");
        
        //日期 与 人
        row = sheet.getRow(3);
        row.getCell(0).setCellValue("下单日期");
        row.getCell(2).setCellValue("经办人");
        row = sheet.getRow(4);
        row.getCell(0).setCellValue("审核日期");
        row.getCell(2).setCellValue("经办人");
        row = sheet.getRow(5);
        row.getCell(0).setCellValue("采购日期");
        row.getCell(2).setCellValue("经办人");
        row = sheet.getRow(6);
        row.getCell(0).setCellValue("入库日期");
        row.getCell(2).setCellValue("经办人");
        
        sheet.getRow(7).getCell(0).setCellValue("订单明细");
        
        row = sheet.getRow(8);
        row.getCell(0).setCellValue("商品名称");
        row.getCell(1).setCellValue("数量");
        row.getCell(2).setCellValue("价格");
        row.getCell(3).setCellValue("金额");
        //设置行高与列宽
        //调整行的高度
        sheet.getRow(0).setHeight((short)1000);
        for(int i = 2; i < rowCnt; i++){
            sheet.getRow(i).setHeight((short)500);
        }
        //调整列宽
        for(int i = 0; i < 4; i++){
            sheet.setColumnWidth(i, 5000);
        }
        //写入订单详情
        sheet.getRow(2).getCell(1).setCellValue(supplierDao.getName(orders.getSupplieruuid()));
        if(null != orders.getCreatetime()){//下单日期
            sheet.getRow(3).getCell(1).setCellValue(orders.getCreatetime());
        }
        if(null != orders.getChecktime()){//审核日期
            sheet.getRow(4).getCell(1).setCellValue(orders.getChecktime());
        }
        if(null != orders.getStarttime()){//采购日期
            sheet.getRow(5).getCell(1).setCellValue(orders.getStarttime());
        }
        if(null != orders.getEndtime()){//入库日期
            sheet.getRow(6).getCell(1).setCellValue(orders.getEndtime());
        }
        //经办人
        sheet.getRow(3).getCell(3).setCellValue(empDao.getName(orders.getCreater()));
        sheet.getRow(4).getCell(3).setCellValue(empDao.getName(orders.getChecker()));
        sheet.getRow(5).getCell(3).setCellValue(empDao.getName(orders.getStarter()));
        sheet.getRow(6).getCell(3).setCellValue(empDao.getName(orders.getEnder()));
        
        //写入明细内容
        Orderdetail od = null;
        //rowCnt = 10+size - 9 = 1+size - 1=size
        for(int i = 9; i < rowCnt - 1; i++){
            od = orderDetails.get(i-9);
            row = sheet.getRow(i);
            row.getCell(0).setCellValue(od.getGoodsname());
            row.getCell(1).setCellValue(od.getNum());
            row.getCell(2).setCellValue(od.getPrice());
            row.getCell(3).setCellValue(od.getMoney());
        }
        //合计
        sheet.getRow(rowCnt - 1).getCell(0).setCellValue("合计");
        sheet.getRow(rowCnt - 1).getCell(3).setCellValue(orders.getTotalmoney());
        
        //输出到输出流中
        try {
            wk.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                wk.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

3.action层

    思路: 1.导出名字的设置,响应头 //2.service调用

/**
     * 导出订单
     */
    public void exportById(){
        try {
            String filename = String.format("orders_%d.xls", getId());//"orders_" + getId() + ".xls";
            HttpServletResponse res = ServletActionContext.getResponse();
            res.setHeader("Content-Disposition", "attachment;filename=" +
                        new String(filename.getBytes(),"ISO-8859-1"));
            ordersBiz.exportById(ServletActionContext.getResponse().getOutputStream(),getId());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4.web层

   思路: 1.在html 页面导入js  2.在 orders.js中(弹出的dialog中要有导出) 添加导出后按钮

<script type="text/javascript" src="ui/download.js"></script>
var ordersDlgToolbar = new Array();
    //添加审核的按钮
    if(Request['oper'] == 'doCheck'){
        ordersDlgToolbar.push({text:'审核',iconCls:'icon-search',handler:doCheck});
        
    }
    //添加确认的按钮
    if(Request['oper'] == 'doStart'){
        ordersDlgToolbar.push({text:'确认',iconCls:'icon-search',handler:doStart});
    }
    //导出
    ordersDlgToolbar.push({text:'导出',iconCls:'icon-excel',handler:function(){
        $.download("orders_exportById", {id:$('#uuid').html()});
    }});
    //如果有按钮,就把加到窗口里去
    if(ordersDlgToolbar.length > 0){
        $('#ordersDlg').dialog({
            toolbar:ordersDlgToolbar
        });
    }

猜你喜欢

转载自blog.csdn.net/Z_passionate/article/details/83855124