お世話になっております。
java の poi3.14を使用して、テンプレートExcelを読み込んで、データを書き込んでファイルをダウンロードするSevletを実装しました。
ただ、以下のようなコードですと、
例えば、データ貼り付けのシートに
1回目のリクエストは
1-10行目にデータが張り付き、
2回目のリクエストでは、パラメータが代わり貼り付けデータが
1-5行目となると、
6-10行目が前回の不要なデータが入ってしまいます。
java
1 // ファイルパスを取得します 2 String filePath = getServletContext() 3 .getRealPath("/WEB-INF/excel/" + getServiceType() + "/" + getExcelFileName()); 4 5// テンプレートからExcel読み込み 6 wb = new XSSFWorkbook(filePath); 7
そのあと、シート指定して、wbにデータ書込をごにょごにょ行った後、
以下、ダウンロード処理をします。
java
1 response.setContentType("application/vnd.ms-excel.sheet.macroEnabled.12"); 2 String fileName = null; 3 try { 4 fileName = new String(getExcelFileName().getBytes("Windows-31J"), "ISO-8859-1"); 5 } catch (UnsupportedEncodingException e1) { 6 e1.printStackTrace(); 7 } 8 response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + "\""); 9 response.setHeader("Cache-Control", "no-cache"); 10 response.setHeader("Pragma", "no-cache"); 11 response.setDateHeader("Expires", 0); 12 13 try { 14 OutputStream out = response.getOutputStream(); 15 wb.write(out); 16 out.close(); 17 } catch (IOException e) { 18 e.printStackTrace(); 19 } finally { 20 wb.close(); 21 } 22
対応として
wbで読み込んでいる前回のExcelがあれば、削除してから開くようにする。
としたいですが、前回読み込んでいるExcelファイルパスが不明のため、
実装方法がわからない状態です。
上記以外の対応として、以下のようなコードを参考に、
new File("テンプレートExcelファイルパス") して、新しく読込
それを、FileInputStreamにいれて
FileOutputStreamで書き出しすれば、うまく動くかと思い試してみましたが、書き出し部分が、new FileOutputStream( f );では、空のExcelファイルがダウンロードされてしまい、response.getOutputStream()でないと正常ファイルがダウンロードされませんでした。
java
1 2import java.io.*; 3import org.apache.poi.ss.usermodel.*; 4 5public class PoiEdit{ 6public static void main(String[] args) throws Exception{ 7File f = new File("Book1.xls"); // 既存のExcelファイル名を指定 8InputStream is = new FileInputStream( f ); 9Workbook wb = WorkbookFactory.create( is ); // メモリ上に展開 10is.close(); //ここで入力ストリームを閉じる 11 12// 編集したいシート、列、セルを指定 13Sheet s =wb.getSheetAt(0); 14Row r = s.getRow(1); 15Cell c = r.getCell(1); 16// この場合B2セルに「あいう」をセット 17c.setCellValue( "あいう" ); 18c.setCellType( Cell.CELL_TYPE_STRING ); 19 20// 編集した内容の書き出し 21OutputStream os = new FileOutputStream( f ); 22wb.write( os ); 23} 24
対応方法について、教えて頂ければ幸いです。
大変お手数をお掛けしますが、ご回答いただければ幸いでごす。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。