Comment remplir le fichier Excel à l'aide de java
J'ai le code suivant pour remplir le fichier Excel,
avec les informations que je reçois de l'Internet à l'aide de Jsoup.
package knvbj;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;
public class KNVBJ {
private static int Clnummer=1;
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("/Users/muratcanpinar/Downloads/KNVBJ/build/classes/knvbj/ClubInformation.xlsx");
List<String> urlList = ReadXlsx.readXlsx();
urlList.get(1);
for (String url : urlList) {
System.out.println("url: " + url);
}
for (int i = 0; i < urlList.size(); i++) {
Document doc = Jsoup.connect(urlList.get(i))
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.post();
Element content1 = doc.getElementsByClass("details").first();
String body = content1.toString();
Document docb = Jsoup.parseBodyFragment(body);
Element bbd = docb.body();
String kkj = bbd.toString();
Document finalDocument = Jsoup.parse(kkj);
Element ClubName = finalDocument.getElementsByClass("title").first();
String NameOfClub = ClubName.text();
System.out.println(NameOfClub);
Element Adres = finalDocument.getElementsByClass("text").get(1);
String[] addressParts = Adres.html().split("<br />");
String SplitString;
String PlaatsName;
String Straat;
String telNo;
String Accommodatie;
String Postcode;
Accommodatie = addressParts[0].trim();
Straat = addressParts[1].trim();
SplitString = addressParts[2].trim();
telNo = addressParts[3].trim();
String splitted[]= SplitString.split(" ");
Postcode = splitted[0];
PlaatsName = splitted[1];
System.out.println(Accommodatie + " " + Straat + " " + " postcode " + Postcode + " Plaatsname " + PlaatsName+ " "+ telNo);
Elements anchors = finalDocument.getElementsByTag("a");
String email = anchors.get(1).text();
String fname = "/Users/muratcanpinar/Downloads/KNVBJ/src/knvbj/Voetbalclubs.xlsx";
InputStream inp = new FileInputStream(fname);
Workbook wb = new XSSFWorkbook(inp);
Sheet sheet = wb.getSheetAt(0);
Row r1 = sheet.getRow(0);
r1.createCell(Clnummer++).setCellValue(NameOfClub);
r1.createCell(Clnummer++).setCellValue(Accommodatie);
r1.createCell(Clnummer++).setCellValue(Straat);
r1.createCell(Clnummer++).setCellValue(Postcode);
r1.createCell(Clnummer++).setCellValue(PlaatsName);
r1.createCell(Clnummer++).setCellValue(telNo);
r1.createCell(Clnummer++).setCellValue(email);
wb.write(out);
}
out.close();
}
}
Avec ce code ci-dessus, je peux vous suffit de remplir une ligne, fr alors un obtenir cette erreur
Exception in thread "main" org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/app.xml fail to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@f46fdc1
at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:479)
at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1414)
at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:179)
at knvbj.KNVBJ.main(KNVBJ.java:101)
Caused by: org.apache.poi.openxml4j.exceptions.OpenXML4JException: The part /docProps/app.xml fail to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@f46fdc1
at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:470)
... 3 more
Java Result: 1
Quelqu'un peut-il me dire ce que je suis en train de faire quatre? Merci beaucoup.
au knvbj.KNVBJ.principale(KNVBJ.java:101 -- pourriez-vous point cette ligne
C'est cette ligne de la bm.write (); ce qui est mal à cela ? Avez-vous des suggestions pour résoudre ce problème ? Merci
Apache POI "seulement" prise en charge de format de fichier Excel 2007. Est
Non, ce n'est excel 2010, Comment puis-je résoudre ce problème ?
Enregistrer
C'est cette ligne de la bm.write (); ce qui est mal à cela ? Avez-vous des suggestions pour résoudre ce problème ? Merci
Apache POI "seulement" prise en charge de format de fichier Excel 2007. Est
Voetbalclubs.xlsx
Excel 2007 ?Non, ce n'est excel 2010, Comment puis-je résoudre ce problème ?
Enregistrer
Voetbalclubs.xlsx
en format 2007 à partir d'Excel (aka .xls
).
OriginalL'auteur Muratcan | 2014-01-14
Vous devez vous connecter pour publier un commentaire.
Le problème réside dans votre
FileOutputStream
variableout
être utilisé plus d'une fois pour la mêmeWorkbook
. L'ouverture et la fermeture de laFileOutputStream
out
à l'intérieur de la boucle de fixer votre exception. POI, et/ou xml/zip de la bibliothèque, n'aime pas utiliser le même ensemble plus d'une fois.Si vous utilisez le même code que vous avez eu avec 1 boucle, il travaille, avec 2, il se bloque à l'exception que vous avez.
Voici une solution rapide avec un simple code à remplacer ce que la JSoup code :
OriginalL'auteur Jonathan Drapeau
Dans le code actuel, vous essayez d'écrire le
ClubInformation.xlsx
dans une feuille deVoetbalclubs.xlsx
. Ainsi, il donne une erreur. (xlsx est un format xml, donc vous obtenez l'erreur lors de l'écriture de/docProps/app.xml
).J'ai modifié le code comme ci-dessous. Modifiez la ligne
List<String> urlList = Arrays.asList("http://google.com");
selon votre besoin.Laissez-moi savoir si cela fonctionne
Le
FileOutputStream
variableout
n'est pas utilisé dans votre réponse. Je ne pense pas que l'écriture d'unxlsx
fichier dans une autre cause de ce problème, il n'est pas écrit sur une feuille.OriginalL'auteur Hirak
Faire un programme de test de la dernière 13 lignes à l'aide d'fixe sain d'esprit des valeurs. Si cela ne fonctionne pas ainsi que le problème est probablement le Modèle d'Entrée. Si cela fonctionne, le problème ce sont les valeurs que vous obtenez de la Soupe. Les imprimer afin de voir si il y a quelque étrange valeurs.
Affichage, seul le petit 13 lignes de programme permettra également d'augmenter les chances d'obtenir des réponses. Et bien sûr, vous pouvez essayer d'utiliser un autre Voetbalclubs.xlsx fichier pour le plaisir, aussi.
le même fichier en entrée? même version de java?
le fichier est généré dynamiquement à partir d'une requête et n'est pas large, 10 lignes x 10 colonnes x 2 onglets. permettez-moi de demander à propos de la version de java
Le fichier Voetbalclubs.xlsx est créé dynamiquement? Avez-vous utilisé l'un des fichiers créés dans votre environnement local? (NB: ne pas en parler ClubInformation.xlsx)
Salut David, j'ai le même problème avec dinamically fichier créé. Fonctionne en local mais pas sur le serveur. Avez-vous réussi à résoudre ce problème? (Le problème est présent uniquement lors de l'utilisation de xlsx, fonctionne bien avec xls). Merci!
OriginalL'auteur
Premier: Il est préférable de commencer avec un exemple de travail et de travailler votre chemin à partir de là. Donc, commencer avec l'exemple de code qui écrit une simple chaîne de caractères à une seule cellule d'une nouvelle feuille, puis d'écrire à une fiche sur un système de fichiers local, et seulement ensuite d'écrire des données que vous avez analysé à partir du web. De cette façon, lorsque vous rencontrez des problèmes, vous avez une meilleure idée où chercher une solution.
L'exception que vous êtes d'inscription est le générique de l'exception qui est lancée par ZipPackage lors de l'enregistrement échoue:
De sorte que le
marshall
méthode sur la defaultPartMarshaller renvoie la valeur false et l'exception interne qui est la cause de l'échec est perdu.Le DefaultMarshaller ne fait pas beaucoup, il pose simplement la partie à enregistrer lui-même à l'OutputStream.
À partir de là, il devient un peu moins certaine de ce genre de PackagePart est en train d'être sauvés. Mais, par exemple, la ZipPartMarshaller attrape toutes les exceptions qui se produisent et les journaux eux avant de retourner faux:
Donc, pourriez-vous jeter un oeil sur le reste de la sortie, voir si d'autres informations pertinentes seront consignées avant cette exception?
Si vous ne trouvez pas plus pertinent de journalisation, c'est tout à fait normal de la cause par défaut, l'enregistreur est un NullLogger qui n'a pas de journal d'une chose. Pourriez-vous définir la propriété
org.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger
(par exemple en commençant par java avec l'argument de ligne de commande-Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger
) et voir si cela permet de produire plus de journalisation?OriginalL'auteur flup
Pour moi, cela semble avoir été causé par un délai d'attente dans AWS, la fermeture du flux de sortie. le message d'erreur n'est pas utile et trompeuse. C'est le mieux que j'ai pu arriver jusqu'ici à partir de l'information disponible.
OriginalL'auteur David Williams
J'obtenais une erreur similaire lorsque le fichier utilisé pour créer le flux de sortie avait déjà données. Si vous êtes à la recherche d' ajouter des données dans le fichier, vous devez l'indiquer dans le fichier de flux de sortie de l'objet:
Lorsque vous faites cela,
wb.write(out)
devrait fonctionner comme prévu.OriginalL'auteur hfontanez
vous avez besoin pour créer des Flux de sortie après que vous avez créé toutes les cellules,puis les écrire dans le fichier. voir les codes dans les détails.
OriginalL'auteur user5443819
Écrire en dessous de la peine à l'extérieur de la boucle
wb.write ();
OriginalL'auteur sagar