2016-05-11 7 views
1

問題に真っ直ぐ。 私は約50k-60k行を満たしています。 私はそのコンテンツをmysqlにアップロードする必要があります。通常はApacheのpoiを使用します読んで、それをmysqlにアップロードしてください。しかし、このファイルはApacheのpoiを使って読むことができません。なぜなら、ファイルが大量になってしまったからです。 誰かが私にその方法を教えてくれますか?ここでは、ApacheのPOIを使用してMySQLにコンテンツをアップロードするために私のサンプルコードはJava - XLSX解析とデータベースエクスポート

public static void uploadCrossSellCorpCard(FileItem file, String dbtable) { 
    System.out.println("UploadUtil Running" + file.getFileName().toString()); 
    try { 
     for(int i = 0; i<=sheetx.getLastRowNum(); i++){ 
      row = sheetx.getRow(i); 

      try{ 
       int oc = (int) row.getCell(0).getNumericCellValue(); 
       if((String.valueOf(oc).matches("[A-Za-z0-9]{3}"))){ 
        String rm_name = row.getCell(1).getStringCellValue(); 
        String company = row.getCell(2).getStringCellValue(); 
        String product = row.getCell(3).getStringCellValue(); 
        String detail = row.getCell(4).getStringCellValue(); 
        String type = row.getCell(5).getStringCellValue(); 

        String sql = "INSERT INTO " + dbtable + " VALUES('" 
          + oc + "','" + rm_name + "','" + company + "','" 
          + product + "','" + detail + "','" + type + "')";   
        save(sql); 
        System.out.println("Import rows " + i); 
       } 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (NullPointerException e) { 
       System.out.println(e); 
      } 
     } 
     System.out.println("Success import xlsx to mysql table"); 
    } catch (NullPointerException e){ 
     System.out.println(e); 
     System.out.println("Select the file first before uploading"); 
    } 
} 

事前に感謝し、私の悪い英語のため申し訳ありません(それは1000年から2000年の行が含まれているいくつかの小さなのxlsxファイルに対して動作します)です:)

注:私は、ハンドルアップロードスキーマの休止方法を使用..「(SQL)を保存」私の休止方法

+0

iは(CSVへのエクスポートそれとインポート以外の)Excelの問題を解決する方法を知らない、しかし、挿入のためにあなたは、BATCHUPDATEでPreparedStatementを使用する必要があります - あなたのpreparedStatement.addBatchを()各その行のPreparedStatement .clearBatch();数千行ごとに(これがメモリからDBにデータをプッシュします)。個々のインサートよりも無限に高速です。 – slipperyseal

+0

私は挿入することについて何の問題もありません..既にhibernateで動作しています、それもPreparedStatementで動作します..今、私の問題はアップロードしたいと思っていますが、大きくてApacheのpoiを使うと読み込めません。 Javaのヒープサイズがまだ同じ問題があります。 – Diastowo

+0

これをチェックしてください。ストリーミングAPIがあります... http://stackoverflow.com/questions/11891851/how-to-load-a-large-xlsx-file-with-apache-poi – slipperyseal

答えて

0

呼び出しているあなたは、Apache POI SAXを使用して試すことができます - セクションを読んで - >XSSFとSAX(イベントAPI)オンhttps://poi.apache.org/spreadsheet/how-to.html

xmlファイルの読み込みと同じように、Excel全体を60k行または100k行で読み取ることができます。空のセルのxmlタグはセルをスキップするだけですが、空の値を表すセルのdbテーブルのnull値を更新することができます。

解決策 - >あなたはループ内で各行を読み込み、挿入文を実行できます。ギャップが発生した場合はセルのアドレスを監視して空のセルを監視し、それぞれの列名を確認して、挿入文をNULL値で更新します。

私はこれがあなたを助けてくれることを願っています。以下のサンプルコードを読んで、表形式でArrayListのArrayListに格納してください。私はコンソールにメッセージを印刷しています - 行を読み、印刷する前に "新しい行が始まります"。セル値自体を印刷する前の各値のセル番号を示します。

私は空のセルのためのセルギャップは気にしませんでしたが、私の場合は空のセルがないので、セルギャップを見つけることに基づいてそれをコーディングできます。 コンソールにセルのアドレスを探して、ギャップを見つけて、望みどおりに処理するのに役立ちます。

このコードを実行しても問題ありません。 xmlbeans-2.3.0.jar を追加することを忘れないでください。

import java.io.InputStream; 
import java.util.ArrayList; 

import org.apache.commons.lang3.time.DurationFormatUtils; 
import org.apache.commons.lang3.time.StopWatch; 
import org.apache.poi.xssf.eventusermodel.XSSFReader; 
import org.apache.poi.xssf.model.SharedStringsTable; 
import org.apache.poi.xssf.usermodel.XSSFRichTextString; 
import org.apache.poi.openxml4j.opc.OPCPackage; 
import org.xml.sax.Attributes; 
import org.xml.sax.ContentHandler; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xml.sax.helpers.XMLReaderFactory; 

public class ExcelToStringArray implements Cloneable { 

    public static ArrayList<ArrayList<StringBuilder>> stringArrayToReturn = new ArrayList<ArrayList<StringBuilder>>(); 
    public static ArrayList<StringBuilder> retainedString; 
    public static Integer lineCounter = 0; 

    public ArrayList<ArrayList<StringBuilder>> GetSheetInStringArray(String PathtoFilename, String rId) 
      throws Exception { 
     ExcelToStringArray myParser = new ExcelToStringArray(); 
     myParser.processOneSheet(PathtoFilename, rId); 
     return stringArrayToReturn; 
    } 

    public void processOneSheet(String PathtoFilename, String rId) throws Exception { 
     OPCPackage pkg = OPCPackage.open(PathtoFilename); 
     XSSFReader r = new XSSFReader(pkg); 
     SharedStringsTable sst = r.getSharedStringsTable(); 

     XMLReader parser = fetchSheetParser(sst); 

     InputStream sheet = r.getSheet(rId); 
     InputSource sheetSource = new InputSource(sheet); 
     parser.parse(sheetSource); 
     sheet.close(); 
    } 

    public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { 
     XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); 
     ContentHandler handler = new SheetHandler(sst); 
     parser.setContentHandler(handler); 
     return parser; 
    } 

    private class SheetHandler extends DefaultHandler { 
     private SharedStringsTable sst; 
     private String lastContents; 
     private boolean nextIsString; 

     private SheetHandler(SharedStringsTable sst) { 
      this.sst = sst; 
     } 

     public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { 

      if (name.equals("row")) { 
       retainedString = new ArrayList<StringBuilder>(); 

       if (retainedString.isEmpty()) { 
        stringArrayToReturn.add(retainedString); 
        retainedString.clear(); 
       } 

       System.out.println("New row begins"); 

       retainedString.add(new StringBuilder(lineCounter.toString())); 
       lineCounter++; 
      } 
      // c => cell 
      if (name.equals("c")) { 
       // Print the cell reference 
       System.out.print(attributes.getValue("r") + " - "); 

       // System.out.print(attributes.getValue("r") + " - "); 
       // Figure out if the value is an index in the SST 
       String cellType = attributes.getValue("t"); 
       if (cellType != null && cellType.equals("s")) { 
        nextIsString = true; 
       } else { 
        nextIsString = false; 
       } 
      } 
      // Clear contents cache 
      lastContents = ""; 
     } 

     public void endElement(String uri, String localName, String name) throws SAXException { 
      // Process the last contents as required. 
      // Do now, as characters() may be called more than once 
      if (nextIsString) { 
       int idx = Integer.parseInt(lastContents); 
       lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); 
       nextIsString = false; 
      } 

      // v => contents of a cell 
      // Output after we've seen the string contents 
      if (name.equals("v")) { 
       System.out.println(lastContents); 
       // value of cell what it string or number 
       retainedString.add(new StringBuilder(lastContents)); 
      } 
     } 

     public void characters(char[] ch, int start, int length) throws SAXException { 
      lastContents += new String(ch, start, length); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     StopWatch watch = new StopWatch(); 
     watch.start(); 
     ExcelToStringArray generate = new ExcelToStringArray(); 
     // rID1 is first sheet in my workbook for rId2 for second sheet and so 
     // on. 
     generate.GetSheetInStringArray("D:\\Users\\NIA\\Desktop\\0000_MasterTestSuite.xlsx", "rId10"); 

     watch.stop(); 

     System.out.println(DurationFormatUtils.formatDurationWords(watch.getTime(), true, true)); 
     System.out.println("done"); 
     System.out.println(generate.stringArrayToReturn); 

    } 

} 
+0

はい、私にあなたを見せてくださいコード??あなたのexplainationについてbtwありがとう:) – Diastowo