POIで4Mぐらいのエクセルファイルを読み込むとOutOfMemoryが発生する

このQ&Aのポイント
  • POIを使用してエクセルの読み込みを行っていますが、4Mぐらいのファイルを読み込むとOutOfMemoryが発生しています。
  • マシンメモリは512ですが、このサイズのファイルを処理できないと困っています。
  • アドバイスをいただけると助かります。
回答を見る
  • ベストアンサー

POI 読込 OutOfMemory

POIでエクセルの読込をやっているのですが 4Mぐらいのファイルを読み込むと new HSSFWorkbook(fileSystem); のところでOutOfMemoryが出てしまいます。 手順は、 // ファイル入力ストリームを作成 fileIn = new FileInputStream(fileName); // エクセルファイルシステムを作成 fileSystem = new POIFSFileSystem(fileIn); // ワークブックを設定 book = new HSSFWorkbook(fileSystem); // ワークシートを設定 sheet = book.getSheet(sheetName); マシンメモリは512なのですが、これくらいはいけないと困りますよね。 なにかアドバイスをお願いします。 OS:WinXPPro JDK:1.4.2 POI:poi-2.5.1-final-20040804.jar

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.1

うまくいくかどうかわかりませんが。 java -Xmx<size> で,Java VM のヒープサイズを大きく取ってみてはどうでしょうか。 http://www.atmarkit.co.jp/fjava/rensai3/javavm02/javavm02_2.html

参考URL:
http://www.atmarkit.co.jp/fjava/rensai3/javavm02/javavm02_2.html

関連するQ&A

  • Jakarta POI での、excelのシート保護

    こんにちは。いつも色々と参考にさせていただいております。POIを利用して、excelのシートの操作をやっているのですが、シートの保護がうまくいきません。 まず、sample.xlsを読み込み、 FileInputStream is = new FileInputStream("sample.xls"); HSSFWorkbook book = new HSSFWorkbook(is); HSSFSheet sheet = book.getSheetAt(0); HSSFSheetクラスのsetProtectメソッドを用いて、 sheet.setProtect(false); とすると、NullPointerExceptionが発生してしまいます。 メソッドの使い方が間違っているのでしょうか? どなたかご存知でしたらご教授いただきたいと思います。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • POIのHSSFを用いたエクセルでのフォント指定について

    POIのHSSFについてお教えください。 JDK1.5.0_12 / poi-3.0.2を使用しています。 フォントは、デフォルトでは "Arial" なので、セル毎に"MS 明朝"を指定すると、初めはMS明朝に変更できたのですが、そのうち"表示形式を追加できません。" とエクセルに表示され、エクセルが開けなくなりました。調べると、ブックに含まれるセルの書式の組み合わせが約 4,000 を超える場合に発生し、すべてのセルに同じフォントを使用すると、書式設定の組み合わせ数が減少するとのこと。HSSFで、デフォルトのフォントをワークブックまたはシート指定で直接変更することはできるのでしょうか。 下記が、今回のコードの一部です。 HSSFWorkbook wb = new HSSFWorkbook(); HSSFFont font1 = wb.createFont(); font1.setFontName("MS 明朝"); を指定し、以下を、行毎に、セルの数だけ(CellPositionを変動)繰り返しました。 HSSFCell cell = row.createCell((short)CellPosition); HSSFCellStyle style1 = wb.createCellStyle(); style1.setFont(font1); cell.setCellStyle(style1); 宜しくお願い致します。

    • ベストアンサー
    • Java
  • POIで出力したExcelファイルで変更メッセージ

    POIで出力したExcelファイルを開いてすぐに閉じると 「'○○.xls'への変更を保存しますか?」といったメッセージが出てしまい、 何とかならないかと困っている状況です。 全体的な流れとしては単純で、テンプレートとなるExcelファイルを用意して それをPOIを利用して読み込み、値をセットして、別名で保存しなおしています。 テンプレートは、SUM関数が書かれただけのシンプルなものです。 POIのバージョンは、3.8です。 JREは、1.5.0_15を使用しています。 プログラムは以下になります。 -----------------------------------------------------   int rowNo = 0;   int colNo = 0;      FileOutputStream fileOutputStream = null;   try{    //EXCEL読み込み    HSSFWorkbook inputWorkbook = new HSSFWorkbook(     new FileInputStream(new File("C:\\Test1.xls")));    fileOutputStream = new FileOutputStream("C:\\結果.xls");        //最初のシートを取得する    HSSFSheet sheet = inputWorkbook.getSheetAt(0);    sheet.setForceFormulaRecalculation(true);        //ROW取得    HSSFRow row = sheet.getRow(rowNo);    if(null == row)row = sheet.createRow(rowNo);    //CELL取得    HSSFCell cell = row.getCell(colNo);    if(null == cell)cell = row.createCell(colNo);    //値を書き込む    cell.setCellValue(1);        //EXCELファイル書き出し    inputWorkbook.write(fileOutputStream);   }catch (Exception e) {    e.printStackTrace();   }finally{    try{     if(null != fileOutputStream)fileOutputStream.close();    }catch (Exception e) {     e.printStackTrace();    }   } ----------------------------------------------------- 以下の一文を除くと、変更メッセージは表示されなくなります。 sheet.setForceFormulaRecalculation(true); しかし、この一文がないとSUM関数の計算が動作しません。 記述、認識の不備、また解決に向けた良い方法がありましたら ご教授のほど、よろしくお願いします。

    • ベストアンサー
    • Java
  • linuxでapache poiが動かない。

    linux(ubuntu12.04)でeclipseでプログラミングをしているのですが、以下のapache poiのサンプルが正常に動作しません。 import java.io.*; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class sample{ public static void main(String[] args){ HSSFWorkbook workbook = new HSSFWorkbook(); workbook.createSheet("test"); FileOutputStream out = null; try{ out = new FileOutputStream("sample1.xls"); workbook.write(out); }catch(IOException e){ System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ System.out.println(e.toString()); } } } コンソールには、 Usage: BiffDrawingToXml [options] inputWorkbook Options: -exclude-workbook exclude workbook-level records -sheet-indexes <indexes> output sheets with specified indexes -sheet-namek <names> output sheets with specified name と表示されます。windowsで正常に動作した時には表示されません。 参照ライブラリーにjarファイルは登録してありますし、windows7では同じeclipseとapache poiの環境で正常に動き、xlsファイルができました。 権限の問題を疑い、プログラムのフォルダごと chmod -R 777 としてみたのですが改善されません。 ネットでの情報も少なく、何が悪いのかわかりません。windowsで動いてなぜlinuxで動かないのでしょうか?

    • ベストアンサー
    • Java
  • POIでのテキストボックス作成について

    お世話になります。 現在、POIでExcelファイルの操作をしているのですが POIを使ったテキストボックスの作成で困っています。 HSSFPatriarch patriarch = workbook.getSheetAt(0).createDrawingPatriarch(); HSSFTextbox textBox = patriarch.createTextbox(new HSSFClientAnchor(0, 0, 100, 255,(short)1, 1, (short)1, 1)); textBox.setString(new HSSFRichTextString("テキストボックス内のテキスト")); 上記のようにテキストボックスを作成しているのですが テキストボックス内のテキストの文字サイズ指定の方法が分からず、 テキストボックスの外へテキストがはみ出して表示されます。 テキストボックスのサイズを広げずにテキストをテキストボックス内に 収める方法を模索しているのですがそれらしい情報が見つかりません。 よければご教示下さい。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • クライアントのEXCELファイルの読み込み

    (1)Webページ上の参照ボタンを押すとファイル選択のダイアログが表示 される。 (2)ダイアログでファイルを選択しアップロードボタンを押すと選択されたEXCELファイルを読み込みデータベースに登録。 という流れのプログラムを作成しています。 ECLIPSE(クライアント)で開発していた時は下記のプログラムでクライアントのEXCELシートが読めていたのですが、サーバ側にプログラムを移行しクライアントのファイルを選択してもファイルが見つかりませんとのエラーメッセージが出力されます。(サーバ側を探しにいっているみたいです。) クライアントのEXCELデータを読み込むにはどのようにすればいいのでしょうか?。 アドバイスよろしくお願いします。 (JSP) <head> <%@ include file="html-head.jsp" %> <script type="text/javascript"> function OpenFile() { if (document.forms(0).fopen.value == ", "){ alert("ファイルが選択されていません。"); }else{ document.forms(0).action = "TEST!read.action"; document.forms(0).submit(); } } </script> </head> <body onload> <%@ include file="HeaderTitle.jsp" %> <div class="navigation" align="right"> <originalJK:CommonLinkTag mode="2" /><br> </div> <br> <s:form> <table width="100%"> <tr> <td> <INPUT type=file name="fopen"> </td> </tr> </table> <table width="100%"> <tr> <td> <INPUT type=button value="EXCELアップロード" onclick= OpenFile() > </td> </tr> </table> (JAVA) int count = 1; String ayyyy = DateUtils.format(DateUtils.now()); String[] strYyyy = ayyyy.split("/"); String aYy = strYyyy[0]; String aMm = strYyyy[1]; String Fname = aFopen; DbUtils vDb = new DbUtils(); //ファイル名チェック if ((aFopen.equals(", ")) || (aFopen.equals(""))){ } } try { // DBコネクションオープン vDb.open(); ABCADao vDao = new ABCDao(vDb); int vCount = 0; //データ存在チェック vCount = vDao.dbCntLine(); // (8)PATH名を除くファイル名のみを取得 String Fname1=(new File(Fname)).getName(); String[] strFname = Fname.split(","); String Fname2 = strFname[0]; // Excelファイルの読み込み FileInputStream fis = new FileInputStream(Fname2); POIFSFileSystem fs = new POIFSFileSystem(fis); // ワークブック・オブジェクトの取得 HSSFWorkbook wb = new HSSFWorkbook(fs); // 総ワークシート数の取得 int sheets = wb.getNumberOfSheets(); // ワークシートごとに、データを取得 int idx = 0; for (int sheetIdx = 0; sheetIdx < sheets; sheetIdx++ ) { // ワークシートを表すオブジェクトの取得 (1) HSSFSheet sheet = wb.getSheetAt(sheetIdx);

  • Java swing エクセル書き込み

    現在、poiで日報システムを作成しております。 入力されたデータはexcelに出力されるような処理をしました。 日報を入力し、ボタンを押されるたびに既存のexcelファイルに上書きされるようにしたいです。 もしエクセルが新規で出力される場合には1行目には見出しを、2行目には入力された内容が出力されます。 次にこのシステムを使った人が書き込みをした場合には3行目に内容が出力されるようにしていきたいです。 このためにexcelを読み込んで、空白セルを確認する処理をすればいいのでしょうが、試行錯誤しました、まず自分で保存先に空のExcelを作らないといけないということと、1回目の入力では正常に2行目まで出力されていますが、もう1度入力をし、出力をすると1,2行目が消えて3行目に書き込みがされるだけになってしまいます。 そこで2点ございます。 (1)2回目の出力で1,2行目が消えてしまうのはプログラムの組み方に誤りがあるのでしょうが、お手上げ状態です。 (2)excelが存在しない場合はこのシステム上で新たに作成をしてくれるようにもできるのでしょうか? ご教授いただければと思います。 public void ExcelOutput() { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet(); /* * ファイルを読み込みし行数が「0」 * 何も書き込みがされていない場合にはヘッダと1つめの行(2行目)を書き込み */ if(ExcelInput() == 0){ Row head = sheet.createRow(0); Cell head1 = head.createCell(0); Cell head2 = head.createCell(1); head1.setCellValue("会社"); head2.setCellValue("報告者"); CellStyle styleHead = wb.createCellStyle(); styleHead.setFillPattern(CellStyle.SOLID_FOREGROUND); styleHead.setFillForegroundColor(IndexedColors.RED.getIndex()); head1.setCellStyle(styleHead); head2.setCellStyle(styleHead); Row contents = sheet.createRow(1); Cell contents1 = contents.createCell(0); Cell contents2 = contents.createCell(1); contents1.setCellValue(CompanyInput.getText()); contents2.setCellValue(NameInput.getText()); FileOutputStream out = null; try{ out = new FileOutputStream("ccc.xls"); wb.write(out); }catch(IOException e){ //System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ //System.out.println(e.toString()); } } } /* * すでにエクセル作成済み(1,2行目に入力がされている)場合 * 途中から書き込み */ else{ Row contents = sheet.createRow(CompanyExcelInput()); Cell contents1 = contents.createCell(0); Cell contents2 = contents.createCell(1); contents1.setCellValue(InterviewPersonInput.getText()); contents2.setCellValue(NameInput.getText()); FileOutputStream out = null; try{ out = new FileOutputStream("ccc.xls"); wb.write(out); }catch(IOException e){ //System.out.println(e.toString()); }finally{ try { out.close(); }catch(IOException e){ //System.out.println(e.toString()); } } } } public int ExcelInput(){ int rowNullCount = 0; try{ //Excelのワークブックを読み込む POIFSFileSystem filein = new POIFSFileSystem (new FileInputStream("ccc.xls")); HSSFWorkbook wb = new HSSFWorkbook(filein); //シートを読み込む HSSFSheet sheet = wb.getSheetAt(0); //空行を検索し、空行を保持する for(rowNullCount = 0; rowNullCount <= sheet.getLastRowNum(); rowNullCount++) { HSSFRow row = sheet.getRow(rowNullCount); if(row == null){ break; } } } catch(IOException ioe) { // TODO } return rowNullCount; } ExcelInputとExcelOutputはボタンのactionPerformedで読み込んでいます。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • EXECLの行を削除

    こんにちは 質問があります。 以下のコードのように、 テキストボックスに入力した行数の エクセルの行を削除したいのですが、 何も削除されません。 どなたか解決策を教えていただけないでしょうか よろしくお願いいたします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; class testdel { public static void main(String[] args) { testdel2 test=new testdel2(); } } class testdel2 implements ActionListener { JButton button; JTextField text; testdel2() { JFrame frame=new JFrame(); JPanel panel=new JPanel(); button=new JButton("削除"); text=new JTextField(1); button.addActionListener(this); panel.add(text); panel.add(button); Container ct=frame.getContentPane(); ct.add(panel); frame.pack(); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { int del_row=Integer.parseInt(text.getText()); Delete del=new Delete(del_row); } } } class Delete { Delete(int delrow) { try {System.out.println(delrow); FileInputStream fis = new FileInputStream("c:/sample.xls"); POIFSFileSystem fs = new POIFSFileSystem(fis); HSSFWorkbook wb1 = new HSSFWorkbook(fs); HSSFSheet sheet = wb1.getSheetAt(0); HSSFRow row=sheet.getRow(delrow); sheet.removeRow(row); System.exit(0); } catch(Exception e) { System.err.println(e.toString()); } } }

    • ベストアンサー
    • Java
  • perlからのexcel読み込み

    お世話になります。 win7 ActivePerl 5.16.3 Apache HTTP Server 2.0 perlからエクセルファイルを読み込むプログラムを作成しています。 ---- use Win32::OLE; use Win32::OLE::Const 'Microsoft Excel'; Win32::OLE->Option(Warn => 3); eval{ Win32::OLE->GetActiveObject('Excel.Application'); }; if($@){ die "Excelが使用できません。$@"; } unless (defined $Excel){ $Excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) or die "Excelが起動できません。"; } my $Book = $Excel->Workbooks->Open("Excelファイルのフルパス") or die Win32::OLE->LastError(); $Book->Close; $Excel->Quit(); ---- 現在は単純に、開いて、閉じるだけの状態です。 ワークシートが1つのエクセルファイルは問題ないのですが、 2つ以上ワークシートがあるエクセルファイルを開くと、$Book->Closeのところで戻ってこなくなります。(ブラウザで待機中の状態) 該当のエクセルファイルは、開いた状態です(直接エクセルで開いてみると編集のためロックされていますと出る)ので、Openは出来ているような気がします。 $Book->Closeを書かなければ下に流れていきますが、 プロセスが残ってしまいます。 ワークシートが1つのときと、複数のときで違いがあるのでしょうか?

    • ベストアンサー
    • Perl
  • excel2007 新規ブック作成時のvba処理

    excel2007にてVBA処理を行っています。 vbaにて 新規ワークブックを作成 最初に開いているワークブックのシートを、新規ワークブックへコピー この作業を行っているのですが、実行時に --- 移動先またはコピー先のブックの行列数が元のブックの行列数よりも少ないため、シートを移動先またはコピー先のブックに挿入できません。データを別のブックに移動またはコピーするには、データを選択して、[コピー] コマンドと [貼り付け] コマンドを使用して移動先またはコピー先のブックのシートに挿入してください。 --- このエラーが表示されます。 保存拡張子も「.xls」から「.xlsx」へ変更するも、互換モードの表示が外れません。 さらに原因を探ると、現在使っているPCのエクセルにて エクセルオプション→保存→ファイルの保存形式 この設定が「excel ブック」ではなく、「excel 97-2003ブック」のため、 新規ワークブック作成時に互換モードでファイルが作成されてしまうことで、2003と2007の行列数の違いからエラーになるようです。 確認のため、ファイル保存形式を2007仕様にすると、問題なく実行されました。 新旧のPCが混在するため、できたらファイル保存形式を97-2003モードで保持したまま、vbaでの新規ワークブックの作成は互換モードを外した状態で行いたいのですが、背景の色など、2007での特色があるため、2003形式には戻したくないのが心情です。 解決する方法はありますでしょうか?よろしくお願いします。