问题描述
我有以下的$ C $三来一补的Excel文件,
的信息,我使用Jsoup互联网获得。
I have the following code to fill in the Excel file,with information that I get from the Internet using 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();
}
}
有了这个上面code,我可以随便填一排,连接然后得到这个错误
With this above code i can just fill one row, en then a get this error
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
有人可以告诉我,我在做什么4?非常感谢。
Can somebody tell me what I am doing four? Thanks a lot.
推荐答案
问题就出在你的的FileOutputStream
变量退出
被多次使用了相同的工作簿
更多。内环路开闭的FileOutputStream
退出
解决您的例外。 POI,和/或XML / ZIP库,不喜欢用相同的流一次以上。
The problem lies in your FileOutputStream
variable out
being used more than once for the same Workbook
. Opening and closing the FileOutputStream
out
within the loop fix your exception. POI, and/or the xml/zip library, don't like to use the same stream more than once.
如果您使用相同的code你有没有和1环,它的工作原理,与2,它会崩溃,你有例外。
If you use the same code you had with 1 loop, it works, with 2, it will crashes with the exception you have.
下面是一个速战速决用一个简单的code来代替JSoup code做了什么:
Here's a quick fix with a simple code to replace what the JSoup code did :
private static int Clnummer = 1;
public static void main(String[] args) throws IOException {
for (int i = 0; i < 2; i++) {
FileOutputStream out = new FileOutputStream("yourfilePath");
String NameOfClub = "Potaoes club";
System.out.println(NameOfClub);
String PlaatsName;
String Straat;
String telNo;
String Accommodatie;
String Postcode;
Accommodatie = "123";
Straat = "Potatoes club street";
telNo = "123456789";
Postcode = "P0P0P0";
PlaatsName = "PotatoCity";
String email = "[email protected]";
String fname = "guessing this is a template file";
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();
}
}
}
这篇关于如何用java填写Excel文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!