Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Rest服务接收excel文件作为javascript响应_Java_Javascript_Excel_Web Services_Rest - Fatal编程技术网

从Rest服务接收excel文件作为javascript响应

从Rest服务接收excel文件作为javascript响应,java,javascript,excel,web-services,rest,Java,Javascript,Excel,Web Services,Rest,我正在调用一个来自javascript的webservice调用,以从服务器获取一个excel文件作为来自JavaAppl的响应。我有点被困在如何获得响应和访问它的问题上。 在webservice代码中——我从列表中获取数据(大量数据超过90000条记录)并将其写入excel工作表,然后将excel文件作为响应发送(我不确定代码是否正确——我测试了它,没有异常,但在逻辑上不确定),然后 如果响应为null,则Javascript代码submitReport方法调用Rest webservice抛

我正在调用一个来自javascript的webservice调用,以从服务器获取一个excel文件作为来自JavaAppl的响应。我有点被困在如何获得响应和访问它的问题上。 在webservice代码中——我从列表中获取数据(大量数据超过90000条记录)并将其写入excel工作表,然后将excel文件作为响应发送(我不确定代码是否正确——我测试了它,没有异常,但在逻辑上不确定),然后 如果响应为null,则Javascript代码submitReport方法调用Rest webservice抛出错误,我的问题就在这里。我不知道如何从响应中读取/下载数据。请给我一些建议或示例代码来实现我的目标

网络服务代码:

  @POST   
    @Path("/report")   
    @Consumes(MediaType.MULTIPART_FORM_DATA)   
    @Produces("application/vnd.ms-excel")   
    public Response getReportData(@Context HttpServletRequest request,   
      @FormDataParam("fromTimeStamp") String fromTimeStamp, @FormDataParam("toTimeStamp") String toTimeStamp) {      
    EOServiceResult<List<TagDataPoint>> result = new EOServiceResult<List<TagDataPoint>>();    
    List<TagDataPoint> listTotalResult = repo.getReportData(fromTimeStamp, toTimeStamp);//This method returns lots of data more than 90000 records.   
    //Blank workbook   
     final XSSFWorkbook workbook = new XSSFWorkbook();    
          //Create a blank sheet   
           final XSSFSheet sheet = workbook.createSheet("Report");   
     //This data needs to be written (Object[])    
            Map<Integer, Object[]> data = new TreeMap<Integer, Object[]>();    
            data.put(1, new Object[] {"Historian Tag", "Quality", "Value", "Timestamp"});  
            int i = 2;   
            for(TagDataPoint tagData : listTotalResult){   
                data.put(i, new Object[] {tagData.getTagname(), tagData.getQuality(), tagData.getValue(), tagData.getTimestamp()});   
                 i++;   
            }  
         //Iterate over data and write to sheet   
            Set<Integer> keyset = data.keySet();   
        int rownum = 0;
            for (Integer key : keyset)   
        {   
            Row row = sheet.createRow(rownum++);    
            Object [] objArr = data.get(key);   
            int cellnum = 0;   
            for (Object obj : objArr)    
            {    
               Cell cell = row.createCell(cellnum++);   
               if(obj instanceof String)    
                    cell.setCellValue((String)obj);    
                else if(obj instanceof Integer)   
                    cell.setCellValue((Integer)obj);   
                else if(obj instanceof Date)    
                    cell.setCellValue((Date)obj);    
            }   
        }    
        ResponseBuilder response = null;   
        try{    
        File file = new File("first_excel.xlsx");     
        FileOutputStream out = new FileOutputStream(file);     
        workbook.write(out);    
        out.close();    
        response = Response.ok((Object) file);    
        }catch(Exception e){    
            e.printStackTrace();   
        }    
       //  ResponseBuilder     
     response.header("Content-Disposition", "attachment; filename=\"test_excel_file.xls\"");      
        return response.build();      
        }    
    **Javascript code:**      
     databaseFactory..getReportResponse: function( fromTimeStamp, toTimeStamp ){   
        var blankFormData =  new FormData();   
          blankFormData.append("fromTimeStamp", fromTimeStamp);   
          blankFormData.append("toTimeStamp", toTimeStamp);   
          var promise = $http(   
             {   
                "method":"POST",    
                "url":SERVER+'/EfficiencyMap/api/v1/datamodel/report' ,    
                "data":blankFormData,   
                "timeout":100000,   
                headers: { 'Content-Type' :  undefined},    
                transformRequest : angular.identity   
             })    
             .success(function(response){   
                return response;   
             });   
          return promise;  
           }   
    **//Actual method after the response**     
    $scope.submitReport = function(fromTimeStamp, toTimeStamp){     
       databaseFactory.getReportResponse(fromTimeStamp,     toTimeStamp).success(function(response){   
            if(response == null){    
               $scope.message = DATA_NOT_AVAILABLE + fromTimeStamp +  " and " + toTimeStamp;   
                return;   
            }  
     **// So what should be done here any suggestions please    
            // I don't understand the response here. How should I download the file here**          
    };    
@POST
@路径(“/report”)
@使用(MediaType.MULTIPART\u FORM\u数据)
@生成(“应用程序/vnd.ms excel”)
公共响应getReportData(@Context HttpServletRequest请求,
@FormDataParam(“fromTimeStamp”)字符串fromTimeStamp,@FormDataParam(“toTimeStamp”)字符串toTimeStamp{
EOServiceResult结果=新的EOServiceResult();
List listTotalResult=repo.getReportData(fromTimeStamp,toTimeStamp);//此方法返回超过90000条记录的大量数据。
//空白工作簿
最终XSSF工作簿=新XSSF工作簿();
//创建空白工作表
最终XSSFSheet sheet=workbook.createSheet(“报告”);
//需要写入此数据(对象[])
映射数据=新树映射();
data.put(1,新对象[]{“Historian标记”、“质量”、“值”、“时间戳”});
int i=2;
对于(TagDataPoint tagData:listTotalResult){
data.put(i,新对象[]{tagData.getTagname(),tagData.getQuality(),tagData.getValue(),tagData.getTimestamp()});
i++;
}  
//迭代数据并写入工作表
Set keyset=data.keyset();
int rownum=0;
for(整数键:键集)
{   
Row-Row=sheet.createRow(rownum++);
Object[]objArr=data.get(key);
int-cellnum=0;
用于(对象对象对象:对象对象对象)
{    
Cell Cell=row.createCell(cellnum++);
if(字符串的obj实例)
cell.setCellValue((字符串)obj);
else if(obj instanceof Integer)
cell.setCellValue((整数)obj);
else if(obj实例生效日期)
cell.setCellValue((日期)obj);
}   
}    
ResponseBuilder response=null;
试试{
File File=新文件(“first_excel.xlsx”);
FileOutputStream out=新的FileOutputStream(文件);
练习册。写(出);
out.close();
response=response.ok((对象)文件);
}捕获(例外e){
e、 printStackTrace();
}    
//响应生成器
header(“内容处置”、“附件;文件名=\”test\u excel\u file.xls\”);
返回response.build();
}    
**Javascript代码:**
databaseFactory..getReportResponse:函数(从时间戳到时间戳){
var blankFormData=new FormData();
blankFormData.append(“fromTimeStamp”,fromTimeStamp);
blankFormData.append(“toTimeStamp”,toTimeStamp);
var promise=$http(
{   
“方法”:“发布”,
“url”:服务器+'/EfficiencyMap/api/v1/datamodel/report',
“数据”:空白表格数据,
“超时”:100000,
标题:{“内容类型”:未定义},
转换请求:angular.identity
})    
.success(函数(响应){
返回响应;
});   
回报承诺;
}   
**//响应后的实际方法**
$scope.submitReport=函数(从时间戳到时间戳){
databaseFactory.getReportResponse(fromTimeStamp,toTimeStamp).success(函数(响应){
如果(响应==null){
$scope.message=DATA\u NOT\u AVAILABLE+fromTimeStamp+”和“+toTimeStamp;
返回;
}  
**//那么这里应该做些什么呢?有什么建议吗
//我不理解这里的回复。我应该如何在这里下载文件**
};    

我需要在前端自动下载响应excel文件。这是我编写的第一个Web服务请求/响应调用。因此,请帮助我如何从服务器读取响应。在JAX-RS中,对于excel文件,请使用@products(“application/vnd.ms excel”)注释该方法:

1.将@products(“application/vnd.ms excel”)放在服务方法上

2.在响应头中设置“内容处置”以提示下载框

守则:

import java.io.File;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

@Path("/excel")
public class ExcelService {

    private static final String FILE_PATH = "c:\\excel-file.xls";

    @GET
    @Path("/get")
    @Produces("application/vnd.ms-excel")
    public Response getFile() {

        File file = new File(FILE_PATH);

        ResponseBuilder response = Response.ok((Object) file);
        response.header("Content-Disposition",
            "attachment; filename=new-excel-file.xls");
        return response.build();

    }

}

我不知道它是否仍然有用,但是你的代码看起来杂乱无章,评论过多,难以阅读。嗨,kolossus。我的问题是如何处理从Java端返回的响应对象。在javascript中,我们应该如何接收响应,以及在从服务器返回后是否自动下载/显示SaveAs,或者是什么你应该添加一些链接中引用的内容,以防将来不再提供。