Use jdbc para leer y escribir archivos de Excel en Windows

Hay innumerables formas de usar Java para leer y escribir en Excel. Aquí tratamos el archivo de Excel como una base de datos y usamos la conexión jdbc para leerlo y escribirlo. Una vez más, la existencia es razonable. Cada método de lectura y escritura en excel tiene sus ventajas y desventajas, su énfasis y sus escenarios de aplicación. Dominar un método más puede significar una elección más, y puede ser que esta solución sea la mejor en algunos escenarios. Por supuesto, si es diligente en el descubrimiento, verá más beneficios si es bueno en el descubrimiento. jdbc ya se ha convertido en un estándar, precisamente porque es un estándar, por lo que si domina este estándar, significa que puede aprender este tipo de cosas con el menor costo de aprendizaje. Por ejemplo, si solo puede escribir sql o es bueno escribiendo sql, entonces usar sql para resolver problemas puede obtener el doble de resultados con la mitad del esfuerzo. Después de todo, es algo incómodo usar algo en lo que no soy bueno. Todavía hay algunas restricciones en el uso de sql para leer y escribir Excel en Windows, por ejemplo, el programa debe ser preferiblemente de 32 bits y el soporte para la sintaxis de sql es relativamente débil.

1), tomando como ejemplo jdk1.8 de 32 bits, el siguiente código implementa operaciones como consulta, inserción y modificación de archivos de Excel (.xlsx)

paquete com.lbz; 

import sun.jdbc.odbc.JdbcOdbcDatabaseMetaData; 

import java.lang.reflect.Field; 
import java.sql.*; 
import java.util.*; 

public class Excel{ 
    conexión de conexión privada; 
    public Excel(){ 
        intente { 
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
            //Preste atención al sistema de 32 bits y al sistema de 64 bits, aquí solo se puede usar el sistema de 32 bits 
            String path = System.getProperty("excelfilepath "); 
            booleano useXlsOnly = false; 
            String url = "jdbc:odbc:driver={Microsoft Excel Driver (*.xls)};READONLY=false;DBQ="+path;; url = "  
            if(!useXlsOnly){
                jdbc:odbc:Driver={ Controlador de Microsoft Excel (*.xls, *.xlsx, *.xlsm, *.xlsb)};READONLY=false;DBQ="+ruta;
            } 

            Propiedades prop = nuevas propiedades(); 
            prop.put("charSet","gbk"); 
            prop.put("usuario",""); 
            prop.put("contraseña",""); 
            Conexión con = null ; 
            try { 
                con = DriverManager.getConnection(url, prop);//Cuando no hay nombre de usuario y contraseña, está directamente vacío 
                JdbcOdbcDatabaseMetaData meta = (JdbcOdbcDatabaseMetaData) con.getMetaData(); 
                    tables.add(tableName); 
                } 
                ResultSet resultSet = meta.getTables(null,null,null,null);
                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

                List<String> tablas = new ArrayList<String>(); 
                while(resultSet.next()){ 
                    String tableName = resultSet.getString(3); 
                System.out.println(tablas); 

                //System.out.println(meta.getStringFunctions()); 
                //System.out.println(meta.getNumericFunctions()); 
                //System.out.println(meta.getTimeDateFunctions()); 
            }catch (Excepción exc){ 
                exc.printStackTrace(); 
            } 
            esta.conexión = estafa; 
        }catch(Excepción e) { 
            e.printStackTrace(); 
        } 
    } 

    public Excel insert(String sql) { 
        Declaración declaración = nulo; 
        intente { 
            declaración = this.connection.createStatement(); 
            declaración.executeUpdate(sql);

            sentencia.close(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
        devuelve esto; 
    } 

    actualización pública de Excel (String sql) { 
        Declaración declaración = nulo; 
        intente { 
            declaración = this.connection.createStatement(); 
            declaración.executeUpdate(sql); 

            sentencia.close(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
        devuelve esto; 
    }

    public <T> List<T> select(String sql,Class c) {  
        Declaración declaración = nulo; 
        Lista<T> lista = new ArrayList<T>();
        try { 
            declaración = this.connection.createStatement(); 
            ResultSet resultado = declaración.executeQuery(sql); 
            Campo[] flds = c.getDeclaredFields(); 
            while (resultado.siguiente()) { 
                T t = (T)c.nuevaInstancia(); 
                for(Field f : flds){ 
                    if("id".equals(f.getName())){ 
                        continuar; 
                    } 
                    f.setAccesible(verdadero); 
                    f.set(t,resultado.getString(f.getName())); 
                } 
                lista.add(t); 
            }
            sentencia.close(); 
        } captura (SQLException e) {
            e.printStackTrace(); 
        } catch (IllegalAccessException e) { 
            e.printStackTrace(); 
        } catch (InstantiationException e) { 
            e.printStackTrace(); 
        } 

        lista de retorno; 
    } 

    public Excel ddl(String sql){ 
        Declaración declaración = nulo; 
        intente { 
            declaración = this.connection.createStatement(); 
            declaración.executeUpdate(sql); 

            sentencia.close(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
        devuelve esto; 
    } 


    public List<Mapa> selectMap(String sql) {
        Declaración declaración = nulo; 
        Lista<Mapa> lista = new ArrayList<>(); 
        intente { 
            declaración = this.connection.createStatement(); 
            ResultSet resultado = declaración.executeQuery(sql); 
            ResultSetMetaData metaData = resultado.getMetaData(); 
            List<String> colList= new ArrayList<>(); 
            for(int i=0;i<metaData.getColumnCount();i++){ 
                String colName = metaData.getColumnName(i + 1); 
                colList.add(colNombre); 
            } 

            while (resultado.siguiente()) { 
                    String colName = colList.get(i); 
                Map<String,String> map = new HashMap<>();
                for(int i = 0;i<colList.size();i++){
        } captura (SQLException e) {
                    Objeto v = resultado.getObject(colName); 
                    if(v == nulo || "nulo".equals(v)){ 
                        v = ""; 
                    } 
                    map.put(colName,String.valueOf(v)); 
                } 
                list.add(mapa); 
            } 

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

        lista de retorno; 
    } 


    public void releaseConnection(){ 
        try{ 
            this.connection.close(); 
            e.printStackTrace(); 
        } 
    }


 
    public static void main(String[] args){ 
        System.setProperty("excelfilepath","E:/git/StoreHouseEnv/lib/test.xlsx"); 

        Excel excel = nuevo Excel (); 
        List<Map> list = excel.selectMap("select * from [Sheet1$]"); 
        System.out.println(lista); 
        list = excel.selectMap("seleccione max(len(NOMBRE)) como longitud de nombre de [Hoja1$]"); 
        System.out.println(lista); 

        for(int i=0;i<5;i++){ 
            excel.insert("insertar en [Hoja1$](ID,NOMBRE) valores('222','测试插入')"); 
        } 
        excel.update("actualizar [Hoja1$] establecer nombre='pingping'
        list = excel.selectMap("seleccione max(len(NOMBRE)) como longitud de nombre de [Hoja1$]"); 
        System.out.println(lista); 
        excel.releaseConnection(); 
    }
}

2. fuente de datos odbc

Muchas fuentes de datos odbc solo admiten 32 bits. Por ejemplo, nuestra base de datos Oracle de uso común, en jdbc, generalmente podemos usar una conexión "delgada" o usar odbc para conectar. Si usa odbc para conectarse, generalmente encontrará 32 bits . La fuente de datos odbc se puede ver en el panel de control.

La cadena de conexión de la base de datos en el código es

jdbc:odbc:Driver={Controlador de Microsoft Excel (*.xls, *.xlsx, *.xlsm, *.xlsb)};READONLY=false;

La fuente de datos de Excel aquí debe ajustarse de acuerdo con la situación real y es posible que se requiera una instalación manual. readonly=false significa que el archivo de Excel se puede escribir, readonly=true significa solo lectura.

La cadena de conexión de otros productos de oficina, como la base de datos de acceso, es básicamente similar a la de Excel, solo modifique la fuente de datos odbc correspondiente.

3. El problema de la versión jdk

Básicamente, no hay ningún problema al ejecutar el código anterior con la versión jdk1.7 de 32 bits, pero se requiere algo de trabajo adicional para usar la versión jdk1.8 de 32 bits.

Busque jre\lib\rt.jar en jdk1.7 y extraiga algunas carpetas

Debido a que el archivo rt.jar en sí es relativamente grande, no todos están descomprimidos, así que use el comando jar en la figura anterior para descomprimir algunos directorios.

sun\jdbc和sun\security\action

 Debido a que jdk1.8 no tiene estos directorios, estos directorios se extraen y etiquetan como un paquete jar adicional como referencia. Por supuesto, también se puede hacer referencia a él sin el paquete jar.

Use el comando jar cvf sunjdbcodbc.jar sun para empaquetar el directorio sun en un paquete jar

Además de hacer referencia a las clases anteriores, también debe copiar JdbcOdbc.dll en el directorio de instalación de jdk1.7 en el mismo directorio de estructura de jdk1.8 y, por supuesto, puede cargarlo de otras formas.

 4. Ejecución de resultados

Supongo que te gusta

Origin blog.csdn.net/weixin_38526093/article/details/124558246
Recomendado
Clasificación