简体   繁体   English

如何将CellStyle对象存储到数据库中?

[英]How to store CellStyle object into database?

I'am reading excel file and storing few properties like cellstyle,columnwidth,row and column index and storing in Map as follows: 我正在读取excel文件并存储一些属性(如cellstyle,columnwidth,行和列索引)并存储在Map中,如下所示:

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;



    }
}

This returns a map element which contains row number as key and each cell along with its properties as value. 这将返回一个map元素,其中包含行号作为键,每个单元格及其属性作为值。 I'am trying to store this data into database (postgres) as follows: 我正在尝试将此数据存储到数据库(postgres)中,如下所示:

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();

        }

    }
}

While executing it shows the below error: 执行时显示以下错误:

org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.apache.poi.xssf.usermodel.XSSFCellStyle. org.postgresql.util.PSQLException:无法推断用于org.apache.poi.xssf.usermodel.XSSFCellStyle实例的SQL类型。 Use setObject() with an explicit Types value to specify the type to use. 将setObject()与显式的Types值一起使用以指定要使用的类型。 at org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1917) at org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:36) at com.tcs.Skeleton.skeletonDataToDatabase(Skeleton.java:157) at com.tcs.Test.main(Test.java:121) 位于org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1917)位于org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:36)位于com.tcs.Skeleton.skeletonDataToDatabase(S. com.tcs.Test.main(Test.java:121)

Note: main method is in test class, connection from DAOclass. 注意:主要方法在测试类中,从DAOclass连接。 I have tried to add cellstyle object as string but I want to store it as such because form database i have to render the style to create a new sheet which follows the stored style. 我试图将cellstyle对象添加为字符串,但是我想像这样存储它,因为表单数据库我必须渲染样式以创建一个遵循存储样式的新表。 Thanks in advance. 提前致谢。

I would recommend serializing the cell style object and storing the serialized value. 我建议序列化单元格样式对象并存储序列化的值。 I typically use Jackson for serializing/deserializing. 我通常使用Jackson进行序列化/反序列化。 The cell data shouldn't be large so serializing to a String should be ok. 单元格数据不应很大,因此可以将其序列化为String。 You can the use a large varchar column or a CLOB column. 您可以使用较大的varchar列或CLOB列。

I realized, instead of storing style objects which is difficult to render, it is better to store style property values. 我意识到,与其存储难以渲染的样式对象,不如存储样式属性值。 Ex: isBold--true or false We can do this for as many properties as we need and store as such in database with same style property column name. 例如:isBold-true或false我们可以对所需的任意数量的属性执行此操作,并将其存储在具有相同样式属性列名称的数据库中。 While rendering we can use the same values while setting the property value. 在渲染时,我们可以在设置属性值时使用相同的值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM