2016-07-21 21 views
0

I'am読み取りファイルをエクセルとcellstyle、columnWidthの、行と列のインデックスのようないくつかのプロパティを保存し、次のようにマップに格納:CellStyleオブジェクトをデータベースに格納する方法は?

package com; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.Reader; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import java.util.TreeMap; 
import java.util.TreeSet; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.CellStyle; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Skeleton { 

    public Map<Integer, List<List<Object>>> readSkeleton(File input){ 

     Map<Integer, List<List<Object>>> skeletondata = new TreeMap<Integer, List<List<Object>>>(); 
     try { 
      FileInputStream in = new FileInputStream(input); 
      XSSFWorkbook wb = new XSSFWorkbook(in); 

      int sheetIx = 5; //remove if using above for loop 
       XSSFSheet st = wb.getSheetAt(sheetIx); 
       int rowcount = 0; 
       for (Row row:st){ 

        List<List<Object>> skeletonrow = new ArrayList<List<Object>>(); 

        int cellcount = 0; 
        for (Cell cell:row){ 

         List<Object> skeletoncell = new ArrayList<Object>(); 

         skeletoncell.add(sheetIx); //for sheet Ix 
         skeletoncell.add(cell.getRowIndex()); //for rowIx 
         skeletoncell.add(cell.getColumnIndex()); //for columnIx 

         CellStyle cs = cell.getCellStyle(); 
         int columnwidth = st.getColumnWidth(cellcount); 
         skeletoncell.add(cs); // for cell style 

         skeletoncell.add(columnwidth); //for column width 

         switch (cell.getCellType()) { 

         /*case Cell.CELL_TYPE_BLANK: 
          skeletoncell.add(null); 
          skeletonrow.add(skeletoncell); 
          break; 
         case Cell.CELL_TYPE_BOOLEAN:       
          break; 
         case Cell.CELL_TYPE_ERROR:           
          break; 
         case Cell.CELL_TYPE_FORMULA: 
          break;   */ 
         case Cell.CELL_TYPE_NUMERIC: 
          skeletoncell.add(cell.toString()); 
          skeletonrow.add(skeletoncell); 
          break; 
         case Cell.CELL_TYPE_STRING: 
          skeletoncell.add(cell.getStringCellValue()); 
          //skeletoncell.add("Abrakadabra"); 
          skeletonrow.add(skeletoncell); 
          break; 
         default: 
          skeletoncell.add(null); 
          skeletonrow.add(skeletoncell); 
          break; 

         } 
         System.out.println("skeleton cell size: "+skeletoncell.size()); 
         cellcount++; 
        } 
        skeletondata.put(rowcount, skeletonrow); 
        rowcount++; 
       } 
       System.out.println("skeleton data :"+skeletondata); 




     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return skeletondata; 



    } 
} 

これに沿ってキーと各セルと行番号を含む地図要素を返しますそのプロパティを値として返します。 I'amは、次のようにデータベース(postgresの)にこのデータを保存しようとしている:

org.postgresql.util.PSQLException:

package com; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.Reader; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import java.util.TreeMap; 
import java.util.TreeSet; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.CellStyle; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Skeleton { 
    public void skeletonDataToDatabase(File input){ 

     DAOClass dao = new DAOClass(); 
     Connection con = null; 
     PreparedStatement pst = null; 

     con = dao.getConnection(); 

     try{ 
      Skeleton skeleton = new Skeleton(); 
      Map<Integer, List<List<Object>>> skeletondata = new TreeMap<Integer, List<List<Object>>>(); 
      skeletondata = skeleton.readSkeleton(input); 
      Set<Integer> keys = skeletondata.keySet(); 
      for (Integer key : keys){ 

       List<List<Object>> skeletonrow = new ArrayList<List<Object>>(); 
       skeletonrow = skeletondata.get(key); 

       for (int r=0;r<skeletonrow.size();r++){ 

        List<Object> skeletoncell = new ArrayList<Object>(); 
        skeletoncell = skeletonrow.get(r); 

        XSSFWorkbook wb = new XSSFWorkbook(); 
        CellStyle cs1 = (CellStyle) skeletoncell.get(3); 

        //cs1.cloneStyleFrom((CellStyle) skeletoncell.get(3)); // cell style value 
        System.out.println("cwll style: "+cs1); 
         /*Schd_Id integer, 
         SubSchd_Id integer, 
         RowIx integer, 
         ColIx integer, 
         CellStyle_Value character varying(100), 
         ColumnWidth integer, 
         Cell_Value character varying(100)*/ 
        //System.out.println("fifth value: "+skeletoncell.get(5)); 
        if(skeletoncell.get(5)==null){ //check for null cell value (blank) 
         //System.out.println("after if loop true "); 
         String query = "insert into Template_Skeleton(Schd_Id,SubSchd_Id,RowIx,ColIx,CellStyle_Value,ColumnWidth) " + 
           "values(?,?,?,?,?,?);"; 
         pst = con.prepareStatement(query); 
         pst.setInt(1, 1);      //Schd id 
         pst.setInt(2, (int) skeletoncell.get(0));      //Subschd id 
         pst.setInt(3, (int) skeletoncell.get(1)); //row Ix 
         pst.setInt(4, (int) skeletoncell.get(2)); //col ix 
         pst.setObject(5, cs1);    //cellstyle value 
         pst.setInt(6, (int) skeletoncell.get(4)); //column width 

        }else{ 
         System.out.println("inside else loop false"); 
         String query = "insert into Template_Skeleton(Schd_Id,SubSchd_Id,RowIx,ColIx,CellStyle_Value,ColumnWidth,Cell_Value) " + 
           "values(?,?,?,?,?,?,?);"; 
         //System.out.println("after query"); 
         pst = con.prepareStatement(query); 
         pst.setInt(1, 1);      //Schd id 
         pst.setInt(2, (int) skeletoncell.get(0));      //Subschd id 
         pst.setInt(3, (int) skeletoncell.get(1)); //row Ix 
         pst.setInt(4, (int) skeletoncell.get(2)); //col ix 
         pst.setObject(5, cs1); //cellstyle value 
         pst.setInt(6, (int) skeletoncell.get(4)); //column width 
         pst.setString(7, (String) skeletoncell.get(5)); //cell calue 
         //System.out.println("after 7th value"); 

        } 
        //System.out.println("before execute"); 
        pst.executeUpdate(); 
        //System.out.println("after execute"); 

       } 
       System.out.println("inserted row :"+key); 

      } 

     }catch (SQLException e){ 
      e.printStackTrace(); 

     } 

    } 
} 

それを実行している間は、以下のエラーを示してSQLを推測することはできませんorg.apache.poi.xssf.usermodel.XSSFCellStyleのインスタンスに使用する型。使用する型を指定するには、明示的なTypes値とともにsetObject()を使用します。 :com.tcs.Skeleton.skeletonDataToDatabaseでorg.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:36) (Skeleton.javaでorg.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1917) で157) at com.tcs.Test.main(Test.java:121)

注:mainメソッドは、テストクラスにあり、DAOclassから接続します。私は文字列としてcellstyleオブジェクトを追加しようとしましたが、フォームデータベースはスタイルをレンダリングして、格納されたスタイルに従う新しいシートを作成する必要があるため、そのように格納します。 ありがとうございます。

答えて

1

セルスタイルオブジェクトのシリアル化とシリアル化された値の格納をお勧めします。私は通常、シリアル化/デシリアライズにJacksonを使用します。セルのデータは大きくてはいけませんので、Stringへのシリアライズは大丈夫です。大きなvarchar列またはCLOB列を使用できます。

0

レンダリングが難しいスタイルオブジェクトを格納するのではなく、スタイルプロパティ値を格納する方が良いことに気付きました。例:isBold - trueまたはfalse 同じスタイルのプロパティ列名を持つデータベースに、必要な数だけプロパティを格納できます。レンダリング中は、同じ値を使用してプロパティ値を設定できます。

関連する問題