簡體   English   中英

如何將CellStyle對象存儲到數據庫中?

[英]How to store CellStyle object into database?

我正在讀取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;



    }
}

這將返回一個map元素,其中包含行號作為鍵,每個單元格及其屬性作為值。 我正在嘗試將此數據存儲到數據庫(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();

        }

    }
}

執行時顯示以下錯誤:

org.postgresql.util.PSQLException:無法推斷用於org.apache.poi.xssf.usermodel.XSSFCellStyle實例的SQL類型。 將setObject()與顯式的Types值一起使用以指定要使用的類型。 位於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)

注意:主要方法在測試類中,從DAOclass連接。 我試圖將cellstyle對象添加為字符串,但是我想像這樣存儲它,因為表單數據庫我必須渲染樣式以創建一個遵循存儲樣式的新表。 提前致謝。

我建議序列化單元格樣式對象並存儲序列化的值。 我通常使用Jackson進行序列化/反序列化。 單元格數據不應很大,因此可以將其序列化為String。 您可以使用較大的varchar列或CLOB列。

我意識到,與其存儲難以渲染的樣式對象,不如存儲樣式屬性值。 例如:isBold-true或false我們可以對所需的任意數量的屬性執行此操作,並將其存儲在具有相同樣式屬性列名稱的數據庫中。 在渲染時,我們可以在設置屬性值時使用相同的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM