2017-09-22 6 views
0

フォルダにあるすべての画像を別のフォルダのワードdocにコピーする必要があります(ワードdocは実行時に同じsrcfileという名前)。以下のコードを実行すると、例外は見られませんが、画像はWord文書にコピーされません。JAVA:あるフォルダから別のフォルダにあるワードドキュメントに画像をコピーできない

File srcfile=new File("C:\\reports\\test" 
      + fileName() + "\\images"); 
File destfile = new File("D:\\Evidences"+ "\\test" + fileName() + ".docx"); 

destfile.getParentFile().mkdir(); 
destfile.createNewFile(); 

    File[] list = srcfile.listFiles(); 
int img=list.length; 
System.out.println(img); 
for(int k=0;k<list.length;k++){ 
    if (list[k].isFile()){ 
     System.out.println("File"+list[k].getName()); 
     if(srcfile.isFile()){ 
      FileInputStream fis = new FileInputStream(srcfile); 
      XWPFDocument doc = new XWPFDocument(fis); 
      XWPFParagraph p = doc.createParagraph(); 
      XWPFRun r = p.createRun(); 
      r.addPicture (fis, XWPFDocument.PICTURE_TYPE_PNG, 
"C:\\reports\\test"+ fileName() + "\\images\\"+imageName() + ".png", 
Units.toEMU(200), Units.toEMU(200)); 
      fis.close(); 
      FileOutputStream fos =new FileOutputStream(destfile); 
      doc.write(fos); 
      fos.close(); 
      doc.close(); 

     } 
    } 
    else if (list[k].isDirectory()){ 
     System.out.println("Directory"+list[k].getName()); 
     if(srcfile.isFile()){ 
      FileInputStream fis = new FileInputStream(srcfile); 
      XWPFDocument doc = new XWPFDocument(fis); 
      XWPFParagraph p = doc.createParagraph(); 
      XWPFRun r = p.createRun(); 
      r.addPicture (fis, XWPFDocument.PICTURE_TYPE_PNG, 
"C:\\reports\\test"+ fileName() + "\\images\\"+imageName() + ".png", 
Units.toEMU(200), Units.toEMU(200)); 
      fis.close(); 
      FileOutputStream fos =new FileOutputStream(destfile); 
      doc.write(fos); 
      fos.close(); 
      doc.close(); 
    } 
} 
} 

コンソール:文と障害のあるロジック場合

Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook 
Picked up _JAVA_OPTIONS: -Xrunjvmhook -Xbootclasspath/a:"C:\Program Files (x86)\HP\Unified Functional Testing\bin\java_shared\classes";"C:\Program Files (x86)\HP\Unified Functional Testing\\bin\java_shared\classes\jasmine.jar";"C:\Program Files\Java\jdk1.8.0_25\bin" 
12 
File0.PNG 
File1.PNG 
File10.PNG 
File2.PNG 
File3.PNG 
File4.PNG 
File5.PNG 
File6.PNG 
File7.PNG 
File8.PNG 
File9.PNG 
Filetest463.docx 
+1

なぜ実行ごとにファイルを開いたり閉じたりしていますか?ループ外にword docをオープンし、イメージをループし、ループの外側に挿入します。ワード文書を閉じます。 –

+0

私はそれを試しました。 スレッド "main"の例外java.io.FileNotFoundException:C:\ reports \ test463 \ images(アクセスが拒否されました) – user8653357

+0

これはSeleniumとどのように関連していますか?何か不足していますか? – DebanjanB

答えて

1

コードが間違っだらけで誰かが

コードが私を助けてくださいすることができます。

  1. list[k].isFile()のコードで十分です。ソースフォルダー内のファイルのリストがFILEまたはFOLDERかどうかを確認しています。 FILEの場合は、追加して追加できます。次にif(srcfile.isFile()){の場合はどうして? SRCFILEがあなたのソースフォルダFile srcfile=new File("C:\\reports\\test" + fileName() + "\\images");私たちは、次のコードのようにファイル入力ストリームXWPFDocument doc = new XWPFDocument(fis);を使用してdocxファイルを作成する必要はありません

    for(int k=0;k<list.length;k++){ 
        if (list[k].isFile()){ 
         System.out.println("File"+list[k].getName()); 
         if(srcfile.isFile()){ 
    
  2. あるので、これは常にfalseと評価されます。以下は十分ですXWPFDocument doc = new XWPFDocument();です。したがって、すべてのFileInputStreamおよび関連するロジックを削除することができます。

    System.out.println("File"+list[k].getName()); 
        if(srcfile.isFile()){ 
         FileInputStream fis = new FileInputStream(srcfile); 
         XWPFDocument doc = new XWPFDocument(fis); 
    
  3. 元のフォルダのみが指定されているため、イメージ名はわかりません。理由は、ソースイメージ名は"C:\\reports\\test"+ fileName() + "\\images\\"+imageName() + ".png"として与えられます。ソースフォルダーファイルを反復処理していて、list[k]がイメージを保持しています。したがって、list[k].getPath()はイメージパスを取得する必要があります。

    r.addPicture (fis, XWPFDocument.PICTURE_TYPE_PNG, 
    

    "C:\が\テストレポート" + fileNameに()+ "\画像\" + imagenameの()+ ".PNG"、 Units.toEMU(200)、Units.toEMU(200)) ;

  4. ソースフォルダのファイルがディレクトリの場合、ファイルがファイルオブジェクトの場合と同じロジックが繰り返されます。 ifelse ifの両方が同じことを行います。ここで必要なのは再帰的ロジックです。

    else if (list[k].isDirectory()){ 
        System.out.println("Directory"+list[k].getName()); 
        if(srcfile.isFile()){ 
         FileInputStream fis = new FileInputStream(srcfile); 
         XWPFDocument doc = new XWPFDocument(fis); 
    
  5. 文書の作成をループ外に移動することができます。

  6. destfile.getParentFile().mkdir();は、すべてのparemtフォルダ構造を作成する必要がある場合は、destfile.getParentFile().mkdirs();に変更する必要があります。

問題を修正した後の作業コード。

public static void main(String[] args) throws IOException, InvalidFormatException { 

    // Create the destination file and folder structure 
    File destfile = new File("C:\\Evidences\\test\\imgdocx.docx"); 
    destfile.getParentFile().mkdirs(); 
    destfile.createNewFile(); 

    // Create the docx object 
    XWPFDocument doc = new XWPFDocument(); 

    // Get the source folder and list of files (includes images and 
    // sub-folders) 
    File srcfile = new File("C:\\reports\\test\\images"); 
    File[] list = srcfile.listFiles(); 
    System.out.println("Source folder item list " + list.length); 

    // Iterate through the files in the source folder 
    for (int k = 0; k < list.length; k++) { 
     if (list[k].isFile()) { 
      System.out.println("File - " + list[k].getName()); 

      // Create paragraph 
      XWPFParagraph p = doc.createParagraph(); 
      XWPFRun r = p.createRun(); 

      // Create fis for image 
      FileInputStream fis = new FileInputStream(list[k].getPath()); 
      // add image using the fis 
      r.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG, 
        list[k].getPath(), 
        Units.toEMU(200), Units.toEMU(200)); 
      fis.close(); 

     } else if (list[k].isDirectory()) { 
      System.out.println("Directory - " + list[k].getName()); 
      // If directory do nothing 
      // A recursive logic can be implemented to handle the files 
      // inside folders in source folder 
     } 
    } 

    // write docx to destination file 
    FileOutputStream fos = new FileOutputStream(destfile); 
    doc.write(fos); 
    fos.close(); 
    doc.close(); 
} 
+0

forループがsrcfileから順番にイメージをフェッチする方法を教えてください。現在、以下のようにコピーしています:File0.PNG File1.PNG File10。PNG File2.PNG File3.PNG File4.PNG File5.PNG File6.PNG File7.PNG File8.PNG File9.PNGしかし、それらを順番にコピーする必要があります。あなたは私を助けてくれる?前もって感謝します! – user8653357

関連する問題