Angularjs,post请求后台poi导出excel的接口,excel中显示[Object object]

Angularjs1.6对接后台导出Excel的接口,
代码:

$http({
        url: 'http://localhost:8083/console/devices/poi',
        method: "POST",
        data: {
            "email": "官方邮箱"
        },
        headers: {
            'Content-type': 'application/json'
        },
        responseType: 'arraybuffer'
    }).then(function(data, status, headers, config) {
        var blob = new Blob([data], { type: "application/vnd.ms-excel" });
        var objectUrl = URL.createObjectURL(blob);
        var a = document.createElement('a');
        document.body.appendChild(a);
        a.setAttribute('style', 'display:none');
        a.setAttribute('href', objectUrl);
        var filename = "记录.xls";
        a.setAttribute('download', filename);
        a.click();
        URL.revokeObjectURL(objectUrl);
    })

下载下来的Excel中显示如下

clipboard.png

不知道是什么情况

这是从后台拿的代码

 public RetBody poi(HttpServletResponse response, Map fieldMap)throws IOException {
        List<UDevice> uDevices=uDeviceMapper.selectAll();
        // String[] headers = {"ID", "年龄", "密码", "邮箱"};//导出的Excel头部,这个要根据自己项目改一下
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet();
        // 设置表格默认列宽度为15个字节
        sheet.setDefaultColumnWidth((short) 18);
        HSSFRow row = sheet.createRow(0);
//        for (short i = 0; i < headers.length; i++) {
//            HSSFCell cell = row.createCell(i);
//            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
//            cell.setCellValue(text);
//        }
        int i = 0;
        for(Object key:fieldMap.keySet()){
            HSSFCell cell = row.createCell(i++);
            HSSFRichTextString text = new HSSFRichTextString(fieldMap.get(key).toString());
            cell.setCellValue(text);
        }
        //遍历集合数据,产生数据行
        Iterator<UDevice> user = uDevices.iterator();
        int index = 0;
        while (user.hasNext()) {
            index++;
            row = sheet.createRow(index);
            UDevice t = (UDevice) user.next();
            //利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
            Field[] fields = t.getClass().getDeclaredFields();
            i = 0;
            for (Field field : fields) {
                if(fieldMap.get(field.getName()) == null){
                    continue;
                }
                HSSFCell cell = row.createCell(i);
                String fieldName = field.getName();
                String getMethodName = "get"
                        + fieldName.substring(0, 1).toUpperCase()
                        + fieldName.substring(1);
                try {
                    Class tCls = t.getClass();
                    Method getMethod = tCls.getMethod(getMethodName,
                            new Class[]{});
                    Object value = getMethod.invoke(t, new Object[]{});
                    String textValue = null;
                    if (value instanceof Date) {
                        Date date = (Date) value;
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        textValue = sdf.format(date);
                    } else {
                        if (!(StringUtils.isEmpty(value))){
                            textValue = value.toString();
                        }else {
                            textValue = "null";
                        }
                    }
                    HSSFRichTextString richString = new HSSFRichTextString(textValue);
                    HSSFFont font3 = workbook.createFont();
                    font3.setColor(HSSFColor.BLUE.index);//定义Excel数据颜色
                    richString.applyFont(font3);
                    cell.setCellValue(richString);
                } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                i++;
            }
        }
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition", "attachment;filename=createList.xls");//默认Excel名称
        response.flushBuffer();
        workbook.write(response.getOutputStream());
        return new RetBody(RetEnum.REQ_SUCCESS);
    }
阅读 8.5k
5 个回答

你去后台请求Excel不就是下载吗?你直接访问你后台的接口下载就行了呀,js中也不用做其它处理

后端提供的应该是get方法,在response里面返回{url:'文件名'},前端获取文件的url,直接放在a标签href属性上,点击下载;
或者直接调用后端接口;
eg:

<!--href上的链接是后台返回的url-->
<a href="http://static.renwey.com/statics/renwey/department.xls">点击下载</a>
<!--href上的链接是后台提供接口,直接当成链接-->
<a href="http://localhost:8083/console/devices/getfile/department">点击下载</a>

本人,小菜鸟 ,遇到了跟你一样的问题,请问最后是怎么解决的

应该是返回时

function(data, status, headers, config) {
    var blob = new Blob([data], { type: "application/vnd.ms-excel" });
 }

这一步的问题,这里的data还是对象,写Blob的时候就是Object了。

new Blob([data], { type: "application/vnd.ms-excel" })

替换其中的data为data.data,取出其中的数据即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进