2014-01-14 4 views
8

У меня есть следующий код для заполнения файла Excel с информацией, которую я получаю из Интернета с помощью Jsoup.Как заполнить файл Excel с помощью java

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(); 
    }   
} 

С помощью этого кода выше я могу просто заполнить одну строку, еп то эта ошибка

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.[email protected]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.[email protected]f46fdc1 
    at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:470) 
    ... 3 more 
Java Result: 1 

Может кто-нибудь сказать мне, что я делаю четыре? Большое спасибо.

+2

at knvbj.KNVBJ.main (KNVBJ.java:101 - не могли бы вы указать на эту строку – Ashish

+0

То есть эта строка wb.write (out), что с этим не так? У вас есть предложения по решению этой проблемы ? Спасибо – Muratcan

+0

Apache POI «только» поддерживает формат файла Excel 2007. Является ли 'Voetbalclubs.xlsx' Excel 2007? – PeterMmm

ответ

2

Проведите пробную программу из последних 13 строк с использованием фиксированных значений. Если это не удается, проблема, скорее всего, входной шаблон. Если это работает, проблема заключается в значениях, которые вы получаете от Soup. Распечатайте их так, чтобы увидеть, есть ли какие-то странные значения.

Проводка только меньшей 13-строчной программы также увеличит вероятность получения ответов. И, конечно же, вы можете попробовать использовать еще один файл Voetbalclubs.xlsx для удовольствия.

+0

Нет, это происходит с абсолютно нормальными значениями. В моем случае это противоречиво и в разных средах, работает локально, это порождает эту ошибку в производстве. –

+0

такой же входной файл? такая же версия java? – eckes

+0

файл генерируется динамически из запроса и невелик, 10 строк x 10 столбцов x 2 вкладки. позвольте мне спросить о java-версии –

3

В текущем коде вы пытаетесь написать ClubInformation.xlsx в один лист Voetbalclubs.xlsx. Таким образом, он дает ошибку. (xslx - это xml-формат, поэтому вы получаете ошибку при записи /docProps/app.xml).

Я изменил ваш код, как показано ниже. Измените строку List<String> urlList = Arrays.asList("http://google.com"); в соответствии с вашими потребностями. Дайте мне знать, если это работает

public class KNVBJ { 

private static int Clnummer=1; 
    public static void main(String[] args) throws IOException { 
     FileOutputStream out = new FileOutputStream("ClubInformation.xlsx"); 
     List<String> urlList = Arrays.asList("http://google.com"); 
     urlList.get(0); 
     for (String url : urlList) { 
      System.out.println("url: " + url); 
     } 
     String fname = "Voetbalclubs.xlsx"; 
     FileOutputStream output = new FileOutputStream(fname); 
     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); 

      org.jsoup.select.Elements anchors = finalDocument.getElementsByTag("a"); 
      String email = anchors.get(1).text();  

        Workbook wb = new XSSFWorkbook(); 

      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(output);   

     } 
    out.close(); 
    }   
} 
+0

Дайте мне знать, если есть какие-либо вопросы по этому вопросу? – Hirak

+0

Переменная 'FileOutputStream'' out' не используется в вашем ответе. Я не думаю, что писать один файл 'xlsx' в другом случае, это проблема, он не пишет на листе. –

1

Для меня это, как представляется, была вызвана тайм-аут в АМС, закрывая выходной поток. сообщение об ошибке не полезно и вводит в заблуждение. Это лучшее, что я мог бы найти с доступной информацией.

2

Во-первых: Лучше начать с рабочего примера и работать оттуда. Поэтому начните с образца кода, который записывает простую строку в одну ячейку на новый лист, затем записывает на существующий лист в локальной файловой системе и только затем записывает данные, которые вы проанализировали из Интернета. Таким образом, когда вы сталкиваетесь с проблемами, вам лучше понять, где искать решение.

вы листинг исключения является родовым исключением, которое получает брошенную ZipPackage при неудаче сохранения:

if (!defaultPartMarshaller.marshall(part, zos)) 
    throw new OpenXML4JException("The part " + part.getPartName().getURI() 
    + " fail to be saved in the stream with marshaller " + defaultPartMarshaller); 

Так marshall метод на defaultPartMarshaller возвращает ложь и внутреннее исключение, которое является причиной отказа потерян. DefaultMarshaller не делает много, он просто просит часть сохранить себя в OutputStream.

Оттуда он становится немного менее уверенным в том, какой пакет PackagePart сохраняется. Но, например, ZipPartMarshaller ловит любые исключения, которые происходят и регистрирует их перед возвращением ложными:

try { 
    ... 
} catch (IOException ioe) { 
    logger.log(POILogger.ERROR,"Cannot write: " + part.getPartName() + ": in ZIP", 
     ioe); 
    return false; 
} 

Так могли бы вы взглянуть на остальной части продукции, увидеть, если какой-либо более актуальной информация, логгируется перед этим исключением?

Если вы не можете найти более релевантную регистрацию, по умолчанию это нормальная причина, регистратор - это NullLogger, который не регистрирует ничего. Не могли бы вы установить свойство времени выполнения org.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger (например, запустив java с аргументом командной строки -Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger) и посмотрим, приведет ли это к большей регистрации?

+0

Предоставление информации об отладке баунти. По-прежнему думаю, что мой вопрос был тайм-аутом и закрытым потоком вывода Amazon. –

4

Проблема в вашей FileOutputStream переменная out используется более одного раза для того же Workbook. Открытие и закрытие FileOutputStreamout в пределах цикла исправить ваше исключение. POI и/или библиотеку xml/zip, не любят использовать один и тот же поток более одного раза.

Если вы используете тот же код, который у вас был с 1 контуром, он работает, с 2, он сработает с исключением, которое у вас есть.

Вот быстро исправить с помощью простого кода, чтобы заменить то, что код JSoup сделал:

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(); 
    } 
    } 
} 
0

я получаю подобную ошибку, когда файл используется для создания выходного потока уже данные. Если вы хотите Append данные в файл, необходимо указать это в объекте выходной поток файла:

FileOutputStream out = new FileOutputStream("/Users/muratcanpinar/Downloads/KNVBJ/build/classes/knvbj/ClubInformation.xlsx", true); 

Когда вы сделаете это, wb.write(out) должен работать, как ожидалось.

0
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 {  
     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);       
    } 
FileOutputStream out = new FileOutputStream("/Users/muratcanpinar/Downloads/KNVBJ/build/classes/knvbj/ClubI nformation.xlsx",true); 
wb.write(out); 
out.close(); 
    }   
} 

необходимо создать выходной поток после создания всех ячеек, а затем записать их в файл. см. коды в деталях.

-1

Написать ниже предложении снаружи для контура

wb.write (уходит);

+0

Хотя это может решить проблему OP, можете ли вы добавить несколько предложений, чтобы объяснить, почему это помогает. –

Смежные вопросы