2017-12-10 13 views
1

ユーザーが特定のExcelファイルをアップロードできるアプリケーションを作成する必要があります。 Sumarizingでは、システムはファイルを受信し、特定のセルに何かを書き込んで、同じファイルをビューに変更して戻す必要があります。ユーザーはこの新しいファイルをダウンロードできます。メモリ内に同じファイルをアップロード、変更、ダウンロードする

私はApache POIを使用してExcelファイルを変更していますが、このファイルをビューに戻す方法はわかりません。

アップロードビュー:

<form method="POST" enctype="multipart/form-data" th:action="@{/pessoa/lote}"> 
      <table> 
       <tr><td>File to upload:</td><td><input type="file" name="file" /></td></tr> 
       <tr><td></td><td><input type="submit" value="Upload" /></td></tr> 
      </table> 
</form> 

コントローラー:ここで私は私が何をする必要があるか分からない、私は「ConsultaPessoaService」と命名されたサービスから「consultaLote」という名前のメソッドを呼び出します。

@RequestMapping(value = "/lote", method = RequestMethod.POST) 
public String handleFileUpload(@RequestParam("file") MultipartFile file, 
     RedirectAttributes redirectAttributes) { 
    try { 
     cpService.consultaLote(file); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    redirectAttributes.addFlashAttribute("message", 
      "You successfully uploaded " + file.getOriginalFilename() + "!"); 

    return "redirect:/"; 
} 

サービスでは、ファイルを読み込んで編集し、FileOutputStreamを生成できます。この時点で私は継続する方法がわからない、私は、コントローラを使用してビューにファイルを返却する必要がありますが、私は方法がわからない:あなたはconsultaLoteメソッドからバイト配列を返す必要があります

@Service 
public class ConsultaPessoaService { 

    public FileOutputStream consultaLote(MultipartFile file) throws IOException { 
     DataFormatter formatter = new DataFormatter(); 

     File convFile = new File(file.getOriginalFilename()); 
     convFile.createNewFile(); 
     FileOutputStream fos = new FileOutputStream(convFile); 
     fos.write(file.getBytes()); 
     fos.close(); 

     FileInputStream inputStream = new FileInputStream(convFile); 

     Workbook workbook = new XSSFWorkbook(inputStream); 
     Sheet firstSheet = workbook.getSheetAt(0); 

     Iterator<Row> iterator = firstSheet.iterator(); 
     while (iterator.hasNext()) { 

      Row nextRow = iterator.next(); 
      System.out.println(formatter.formatCellValue(nextRow.getCell(3))); 

      nextRow.getCell(3).setCellValue("test"); 
     } 

      FileOutputStream outputStream = new FileOutputStream("arquivot.xlsx"); 
      workbook.write(outputStream); 
      workbook.close(); 

      outputStream.flush(); 
      outputStream.close(); 
      return outputStream; 
    } 
} 
+0

あなたはあなたのファイルをフラッシュしたい/ユーザーにダウンロード可能にしたいですか? –

+0

はい、私はそれを修正した後にファイルをダウンロードする必要があります –

+0

値を変更した後、 'workbook'オブジェクトが新しいファイルを保持していることを確認するだけですか? –

答えて

1

。メソッド戻り値の型は、httpservlet出力ストリームを書き込むためにこのバイト配列が必要なので、byte[]になります。

public byte[] consultaLote(MultipartFile file) throws IOException { 
    //whatever changes you want, do it here. I am going to converting part 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    workbook.write(baos); 
    // before returning you can close your your ByteArrayOutputStream 
    //baos.close(); 
    return baos.toByteArray(); 
} 

今すぐあなたのコントローラに来る。 からOutputStreamにバイト配列を書き込みます。

これが役に立ちます。

+0

ありがとうございました、その今私にはもっと意味がありますが、私はその行を理解できませんでした:response.getOutputStream()。write(bArr); この変数は何ですか?bArr?その宣言されていない –

+0

@MuriloGóesdeAlmeida、私の間違い。あなたの宣言されたbyteArrayでなければなりません。答えは 'fileBytes'です。私はすでに答えを更新しました。そして、もしそれが役立つなら、あなたはupvotedして、stackoverflowの仲間のユーザーのための答えを受け入れるべきです。 :) –

+0

ありがとう!あなたは私をたくさん助けます!私は他の修正をしました。試しにifを入れる必要がありますが、私が望んでいたものです。ありがとうございました! –

関連する問題