Télécharger la réponse dans un fichier excel
Fichier n'est pas téléchargé à l'adresse du navigateur. Je suis en train de préparer le fichier et l'écriture sur le flux de sortie de la réponse.
API Rest est là:
@RequestMapping(value = "/export-companies",
method = {RequestMethod.GET, RequestMethod.HEAD})
@Timed
public void downloadCompanies(HttpServletResponse response) throws URISyntaxException {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Sample sheet");
Map<String, Object[]> data = new HashMap<String, Object[]>();
data.put("1", new Object[] {"Emp No.", "Name", "Salary"});
data.put("2", new Object[] {1d, "John", 1500000d});
data.put("3", new Object[] {2d, "Sam", 800000d});
data.put("4", new Object[] {3d, "Dean", 700000d});
Set<String> keyset = data.keySet();
int rownum = 0;
for (String 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 Date)
cell.setCellValue((Date)obj);
else if(obj instanceof Boolean)
cell.setCellValue((Boolean)obj);
else if(obj instanceof String)
cell.setCellValue((String)obj);
else if(obj instanceof Double)
cell.setCellValue((Double)obj);
}
}
try {
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
workbook.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
response.setContentType("application/ms-excel");
response.setContentLength(outArray.length);
response.setHeader("Expires:", "0"); //eliminates browser caching
response.setHeader("Content-Disposition", "attachment; filename=template.xls");
OutputStream outStream = response.getOutputStream();
outStream.write(outArray);
outStream.flush();
workbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
De front-end (à l'aide d'Angular JS):
(function() {
'use strict';
angular
.module('MyApp')
.factory('CompanyExportService', CompanyExportService);
CompanyExportService.$inject = ['$resource'];
function CompanyExportService ($resource) {
var service = $resource('api/export-companies', {}, {
'get': {
method: 'GET',
isArray: false
}
});
return service;
}
})();
Contenu du fichier est-il en réponse non-format lisible. Mais le fichier n'est pas téléchargé sur le navigateur.
j'ai fait le même code, mais un changement mineur de réponse.setContentType("application/force-download"); il a travaillé dans le navigateur google chrome, je n'ai pas testé sur d'autres navigateurs
Veuillez marquer une réponse comme acceptée si cela résout votre problème.
Veuillez marquer une réponse comme acceptée si cela résout votre problème.
OriginalL'auteur fatCop | 2016-07-27
Vous devez vous connecter pour publier un commentaire.
Angulaire recevra le contenu du fichier de simples séquences de caractères. Vous devez créer un fichier à partir de ces caractères et de lancer le téléchargement du navigateur en frontend.
Vous pouvez le faire comme ceci -
où
data
est la réponse que vous avez reçu le formulaire de votre API. LesaveAs
fonction est une partie de FileSaver.js de la bibliothèque. Bien que vous pouvez regarder sur la façon de faire manuellement, mais pourquoi réinventer la roue?Avez-vous une solution pour cela? suis confronté au même problème.
Cela fonctionne pour moi. Juste une question cependant. Comment puis-je conserver le nom du fichier envoyé par le serveur? Ce n'est que je ne veux pas ajouter mes propres
fileName
danssaveAs(blob, fileName)
. Je vous remercie.OriginalL'auteur Harshil Sharma
Le téléchargement de fichiers avec XHR est problématique. Tant que vous n'OBTENEZ seulement les demandes, il existe beaucoup plus simple d'approche pour déclencher le navigateur à télécharger le fichier.
L'utilisation de JavaScript natif méthode
window.open(url)
.Il fonctionne bien dans tous les navigateurs y compris IE9.
Dans le code ci-dessous, j'utilise
$window
, qui est Angulaire du proxy pour les natifs de la fenêtre de l'objet.Exemple pour votre code pourrait ressembler à:
Noter que cette action est hors de portée Angulaire, vous ne pouvez pas faire beaucoup d'erreurs de manipulation ou de patienter jusqu'à ce que le fichier sera téléchargé. Peut être un problème si vous voulez générer d'énormes fichiers Excel ou votre API est lente.
Pour plus de détails, lire la question: Printemps - téléchargement de réponse dans un fichier
Mise à jour:
J'ai remplacé
window.location.href
avecwindow.open()
qui semble être le meilleur choix pour le téléchargement de fichiers.Si votre API renvoie une page d'erreur au lieu de fichier,
window.location.href
va remplacer l'actuel page (et donc perdre de son état).$window.open()
toutefois ouvre cette erreur dans un nouvel onglet sans perdre l'état actuel de l'application.votre problème est que vous n'avez pas de générer du contenu dans un format approprié. Vous avez seulement HTML enregistrées dans le fichier et l'a nommé avec xls extension. Il ne sera pas auto-magiquement être converti en format de fichier excel. Poser une autre question car il est beaucoup plus d'espace pour décrire la façon correcte de le faire.
Je trouve que vous avez déjà posé la question. J'ai répondu ici: stackoverflow.com/a/44602960/2757140
OriginalL'auteur Piotr Lewandowski
Vous pouvez télécharger le fichier dans un nouvel onglet. Navigateur moderne sont leur fermeture automatiquement lorsque le téléchargement est terminé.
Par l'ouverture de nouvelle fenêtre, vous obtenez une référence, lorsque le téléchargement est terminé puis
window.closed
est définie sur true.Malheureusement vous avez besoin de vérifier de temps en temps, ce param à l'intérieur de l'intervalle de ...
Testé et fonctionne sur Chrome v52, FF v48 et IE 11
OriginalL'auteur BartB