axnet
axnet

Reputation: 5790

How to download excel (.xls) file from API in postman?

I have an API endpoint and an Authorization token for that API.

The said API is for .xls report download. How can I view the downloaded .xls file using (if possible) Postman?

If it is not possible using Postman what are the other programmatic ways I should be looking for?

Upvotes: 365

Views: 344012

Answers (7)

Akhtar Munir
Akhtar Munir

Reputation: 1769

My answer is for those that are trying to download excel file in laravel using api route. It's important to note that I was using laravel Jobs and dispatch stuff. And I was sending the return request to a json_success helper function which was actually converting my download response to a json. So I simply removed anything that comes in between downloading file. And it's working fine now. As I am using repository structure so I will try to post each function from repository to controller. Dispatch was also giving me 0 which wasn't letting the file to be downloaded.

Before

// export service data // Repository function
public function exportInsuranceServices($insuranceId)
{
    return dispatch_sync(new ExportInsuranceServiceJob($insuranceId));
}

this is the job class

class ExportInsuranceServiceJob implements ShouldQueue
{
use Dispatchable, Queueable;

protected $insuranceId;

public function __construct($insuranceId) {
    $this->insuranceId = $insuranceId;
}

public function handle()
{
    return Excel::download(new ExportInsuranceService($this->insuranceId), 'insuranceService.xlsx',null, [
        'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    ])->getStatusCode();
}
}

Export Insurance Service

class ExportInsuranceService implements FromQuery, WithHeadings, ShouldAutoSize
{
use Exportable;

protected $insuranceId;

public function __construct($insuranceId) {
    $this->insuranceId = $insuranceId;
}

public function query()
{
    return InsuranceService::query()
        ->where('insurance_id',decryptId($this->insuranceId))
        ->select('name_en', 'name_ar','code', 'price','original_price', 'insurance_id','service_id','status');
}

public function headings(): array
{
    return [
        'name_en', 'name_ar','code', 'price','original_price','insurance_id', 'service_id','status'
    ];
}
}

Controller function

/**
 * Export Insurance Services by insurance id.
 */
public function export($insurance_id,InsuranceServiceRepository $repo)
{
    return jsend_success($repo->exportInsuranceServices($insurance_id));
}

After

// export service data. Here I have removed the job class
public function exportInsuranceServices($insuranceId)
{
    return Excel::download(new ExportInsuranceService($insuranceId), 'insuranceService.xlsx');
}

/**
 * Export Insurance Services by insurance id. Here I have removed jsend_success helper function
 */
public function export($insurance_id,InsuranceServiceRepository $repo)
{
    return $repo->exportInsuranceServices($insurance_id);
}

The ExportInsuranceService is the same as already shown

Upvotes: 1

Belal Aglan
Belal Aglan

Reputation: 126

In the response section follow these steps:

enter image description here

Upvotes: 7

Jake
Jake

Reputation: 9407

Try selecting send and download instead of send when you make the request. (the blue button)

Screenshot showing "Send and Download" button in postman

https://www.getpostman.com/docs/responses

"For binary response types, you should select Send and download which will let you save the response to your hard disk. You can then view it using the appropriate viewer."

Upvotes: 870

Hana Hasanah
Hana Hasanah

Reputation: 244

For UI, choose Send and Download button instead of Send button in Postman: enter image description here

Upvotes: 9

Akitha_MJ
Akitha_MJ

Reputation: 4294

You can Just save the response(pdf,doc etc..) by option on the right side of the response in postman check this image postman save response

For more Details check this

https://learning.getpostman.com/docs/postman/sending_api_requests/responses/

Upvotes: 31

jikku
jikku

Reputation: 801

In postman - Have you tried adding the header element 'Accept' as 'application/vnd.ms-excel'

Upvotes: 7

nbokmans
nbokmans

Reputation: 5757

If the endpoint really is a direct link to the .xls file, you can try the following code to handle downloading:

public static boolean download(final File output, final String source) {
    try {
        if (!output.createNewFile()) {
            throw new RuntimeException("Could not create new file!");
        }
        URL url = new URL(source);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        // Comment in the code in the following line in case the endpoint redirects instead of it being a direct link
        // connection.setInstanceFollowRedirects(true);
        connection.setRequestProperty("AUTH-KEY-PROPERTY-NAME", "yourAuthKey");
        final ReadableByteChannel rbc = Channels.newChannel(connection.getInputStream());
        final FileOutputStream fos = new FileOutputStream(output);
        fos.getChannel().transferFrom(rbc, 0, 1 << 24);
        fos.close();
        return true;
    } catch (final Exception e) {
        e.printStackTrace();
    }
    return false;
}

All you should need to do is set the proper name for the auth token and fill it in.

Example usage:

download(new File("C:\\output.xls"), "http://www.website.com/endpoint");

Upvotes: 9

Related Questions