JAVA使用POI与ajax导出EXCEL表格

本文参考:https://www.cnblogs.com/gudongcheng/p/8268909.html

POI简介:Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。

官方主页http://poi.apache.org/index.html,

API文档http://poi.apache.org/apidocs/index.html

现在用的比较多的都是用POI技术来导出或者导入Excel,用POI导出Excel我们首先要下载所需的jar包然后导入到我们的项目中,用maven的同学只需找到相关依赖加入到pom.xml里面即可。这里我用maven导包。



    org.apache.poi
    poi
    3.6

Jakarta POI HSSF API组件:

HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,有以下几种常用的对象:

常用组件:

HSSFWorkbook     excel的文档对象

HSSFSheet            excel的表单

HSSFRow               excel的行

HSSFCell                excel的格子单元

HSSFFont               excel字体

样式:

HSSFCellStyle         cell样式

基本操作步骤:

首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用poi要导出一个Excel表格

的正确顺序应该是:

1、用HSSFWorkbook打开或者创建“Excel文件对象”

2、用HSSFWorkbook对象返回或者创建Sheet对象

3、用Sheet对象返回行对象,用行对象得到Cell对象

4、对Cell对象读写。

5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面

工具类代码:

package com.self.util;

import org.apache.poi.hssf.usermodel.*;

/**
 * @ClassName ExcelUtil
 * @Description Excel生成工具类
 * @Author zxl
 * @Date 2019/2/1 10:30
 * @Version 1.0
 */
public class ExcelUtil {
    /**
      *@Author S12434
      *@Description 导出Excel
      *@Date 10:36 2019/2/1
      *@Param [sheetName sheet名称, title 标题, values 内容, wb HHSWorkbook对象]
      *@Return org.apache.poi.hssf.usermodel.HSSFWorkbook
      */
    public static HSSFWorkbook getHHSWorkbook(String sheetName,String[] title,String[][] values,HSSFWorkbook wb ){
        //第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if(wb==null){
            wb=new HSSFWorkbook();
        }

        //第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet=wb.createSheet(sheetName);

        //第三步,在sheet中添加表头第0行,注意老版本poi对EXCEL的行数列数的限制
        HSSFRow row=sheet.createRow(0);

        //第四步,创建单元格,并设置值表头,设置表头居中
        HSSFCellStyle style=wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        //声明列对象
        HSSFCell cell=null;

        //创建标题
        for(int i=0;i

控制器代码:

package com.self.controller;

import com.self.common.Criteria;
import com.self.entity.OsInput;
import com.self.service.IOsInputService;
import com.self.util.ExcelUtil;
import com.self.util.QueryUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.*;

/**
 * @ClassName ExcelReportController
 * @Description Excel报表导出类
 * @Author zxl
 * @Date 2019/2/1 11:10
 * @Version 1.0
 */

@Controller
@RequestMapping("/excel")
public class ExcelReportController {

    @Autowired
    IOsInputService iOsInputService;

    @RequestMapping("/inputExport")
    @ResponseBody
    public Map inputExport(HttpServletRequest request,HttpServletResponse response,String order,String sort) {
        Map map= new HashMap<>();
        map.put("statusCode","200");
        map.put("message","导出成功!");
        Enumeration e = request.getParameterNames();
        TreeMap params = new TreeMap();
        while (e.hasMoreElements()) {
            String name = (String) e.nextElement();
            Object value = request.getParameter(name);
            if (value != null && !"".equals(value)) {
                params.put(name, value);
            }
        }
        String[] sortBy = null;//排序的字段
        Sort s=null;
        if (sort != null) {
            sortBy = sort.split(",");
            Sort.Direction direction = Sort.Direction.ASC;
            if ("desc".equals(order)) {
                direction = Sort.Direction.DESC;
            }
            s = new Sort(direction, sortBy);
        }

        Criteria c = new Criteria();
        for (Map.Entry entry : params.entrySet()) {
//           //Map里面有值表示有查询条件
            switch (entry.getKey().toString()){
                case "conditions":
                    QueryUtils.queryConditions(c, (String)entry.getValue());
                    break;
                default:
                    break;
            }
        }
        List list=iOsInputService.findAll(c,s);
        //excel标题
        String[] title = {"编号","用品名称","供应商","规格型号","类别","计量单位","库位","入库数量","单价","税后单价","税","金额","税后金额","入库时间","操作人工号","操作人姓名","备注"};

        //excel文件名
        String fileName = "办公用品出库记录"+System.currentTimeMillis()+".xls";

        //sheet名
        String sheetName = "办公用品出库记录表";

        String [][] content=new String[list.size()][title.length];
        for(int i=0;i

前端代码:

function excelExport(){
        var osiIndex = $("#osiIndex").combobox("getValue");//办公用品
        var osiSupid = $("#osiSupid").combobox("getValue");//供应商
        var osiModel = $("#osiModel").textbox("getValue");//规格型号
        var osiTypecode = $("#osiTypecode").combobox("getValue");//类别
        var startTime = $("#startTime").datebox("getValue").split("-").join("").split(" ").join("").split(":").join("");//入库日期从
        var endTime = $("#endTime").datebox("getValue").split("-").join("").split(" ").join("").split(":").join("");//至
        var osiUsercode = $("#osiUsercode").combobox("getValue");//操作人
        //结束时间不能比开始时间小
        if ("" != startTime && "" == endTime) {
        } else {
            if (!compareDateTime(endTime, startTime)) {
                $.messager.alert("警告", "结束时间大于开始时间", "warning");
                return;
            }
        }
        var conditions = [];
        conditions.push("osiIndex_equal:" + osiIndex);//办公用品
        conditions.push("osiSupid_equal:" + osiSupid);//供应商
        conditions.push("osiModel_like:" + osiModel);//规格型号
        conditions.push("osiTypecode_equal:" + osiTypecode);//类别
        conditions.push("osiInputdate_startTimeHms:" + startTime);//入库日期从
        conditions.push("osiInputdate_endTimeHms:" + endTime);//至
        conditions.push("osiUsercode_equalTotal:" + osiUsercode);//操作人

        // $.ajax({
        //     url:'../excel/inputExport?sort=osiInputdate&order=asc&conditions=' + conditions,
        //     dataType:'json',
        //     type:'post',
        //     traditional: true,
        //     success:function(data){
        //         alert(data.message);
        //
        //     }
        // });
        window.location.href='../excel/inputExport?sort=osiInputdate&order=asc&conditions=' + conditions;
    }

从前端代码可以看到,ajax访问后台的方式被注释了,那是因为$.ajax,$.post 不支持返回二进制文件流的类型,dataType只支持xml,json,script,html这几种格式,没有blob类型。所以若要采用异步导出EXCEL的方式,只能选择使用原生Ajax XMLReques对象进行处理。

原生ajax异步请求参考文档:https://blog.csdn.net/swl979623074/article/details/77855629/

只需要修改前端代码即可。

var xhr ;
        if(window.XMLHttpRequest){//code for IE7+,Firefox,Chrome,Opera,Safari
            xhr = new XMLHttpRequest();
        }else{//code for IE6,IE5
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        var url = '../excel/inputExport?sort=osiInputdate&order=asc&conditions=' + conditions;
        //设置响应类型为blob类型
        xhr.responseType = "blob";
        xhr.open("post", url, true);
        xhr.onload = function () {
            if (this.status == "200") {
                //获取响应文件流  
                var blob = this.response;
                var reader = new FileReader();
                reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a表情href
                reader.onload = function (e) {
                    // 转换完成,创建一个a标签用于下载
                    var a = document.createElement('a');
                    a.download = '办公用品.xls';
                    a.href = e.target.result;
                    $("body").append(a);    // 修复firefox中无法触发click
                    a.click();
                    $(a).remove();
                }
            }
        }


        xhr.send();

    }

 

另:需总结JAVA文件下载的几种方式

你可能感兴趣的:(日常)