Ordenar archivo xlsx alfabéticamente mediante java
Buenos días
quien me puede ayudar con algo, estoy subiendo un archivo de excel a un jsp para guardarlo en MySQL, el archivo de excel tiene 8 columnas y se descarga de una plataforma que se llama jira con el registro de las labores de los empleados, el archivo se descargar totalmente en desorden, la idea es que al momento de subirlo al jsp para guardarlo en MySQL quede ordenado alfabéticamente por la columna de nombre_empleado
ya que la tabla de MySQL donde va a quedar guardado el archivo tiene una clave primaria compuesta por tres columnas y una de esas columnas es un auto_increment que habría que reiniciarlo por cada nombre registrado
alguien me puede decir por favor como ordenar el archivo de excel mediante la lectura de el en java para insertarlo en MySQL ya ordenado gracias
si no me hecho entender bien me dicen por favor
aca es donde el leo el archivo de excel
import dao.TablaJiraDao;
import dao.TablaNovedadesDao;
import dao.TablaNovedadEmpleadoDao;
import entidades.TablaJira;
import entidades.TablaNovedadEmpleado;
import entidades.TablaNovedades;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Date;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel2 {
public static void leerArchivoExcel2(FileInputStream inputStream) throws IOException {
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
Sheet firstSheet = workbook.getSheetAt(0);
for (int i = 1; i < firstSheet.getLastRowNum(); i++) {
Row fila = firstSheet.getRow(i);
TablaJira ji = new TablaJira();
// Recorremos las celdas
int j = 0;
int cont = 0;
for (j = 0; j < fila.getLastCellNum(); j++) {
Cell celda = fila.getCell(j);
if (j == 0) {
if (celda == null || celda.getCellType() == Cell.CELL_TYPE_BLANK) {
break;
}
}
switch (j) {
case 0:
if (celda.getCellType() == Cell.CELL_TYPE_STRING) {
ji.setProyecto(celda.getStringCellValue());
}
// n.setNovedad(celda.getStringCellValue());
break;
case 1:
if (celda.getCellType() == Cell.CELL_TYPE_STRING) {
ji.setTipo(celda.getStringCellValue());
}
//ne.setFecha_inicio(celda.getStringCellValue());
break;
case 2:
if (celda.getCellType() == Cell.CELL_TYPE_STRING) {
ji.setClave(celda.getStringCellValue());
}
//ne.setFecha_fin(celda.getStringCellValue());
break;
case 3:
if (celda.getCellType() == Cell.CELL_TYPE_STRING) {
ji.setTitulo(celda.getStringCellValue());
}
//ne.setAño(celda.getStringCellValue());
break;
case 4:
if (celda.getCellType() == Cell.CELL_TYPE_STRING) {
ji.setNombres(celda.getStringCellValue());
}
// nombreant = nombresc;
//ne.setDias(celda.getStringCellValue());
break;
case 5:
if (celda.getCellType() == Cell.CELL_TYPE_NUMERIC) {
ji.setTiempo_horas((int) celda.getNumericCellValue());
} //else if (celda.getCellType()== Cell.CELL_TYPE_STRING){
//ne.setHoras(celda.getStringCellValue());
break;
}
}
//Se guardan los datos por cada fila
//guardarTablaNovedadEmpleado(ne);
//guardarTablaNovedades(n);
if (j > 0) {
guardarTblJira(ji);
}
}
}
private static void guardarTblJira(TablaJira ji) {
TablaJiraDao dao = new TablaJiraDao();
dao.insertarTablaJira(ji);
}
/* private static void guardarTablaNovedadEmpleado(TablaNovedadEmpleado ne) {
TablaNovedadEmpleadoDao dao = new TablaNovedadEmpleadoDao();
dao.insertarTablaNovedadEmpleado(ne);
}
private static void guardarTablaNovedades(TablaNovedades n) {
TablaNovedadesDao dao = new TablaNovedadesDao();
dao.insertarTablan(n);//To change body of generated methods, choose Tools | Templates.
}*/
}
Y ACÁ ES DONDE LO GUARDO
package dao;
import entidades.TablaJira;
import java.io.PrintWriter;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import models.Conexion;
/**
*
* @author pcc
*/
public class TablaJiraDao {
public int insertarTablaJira(TablaJira ji) {
int bandera = 0;
Conexion con = null;
try {
con = new Conexion();
String query = "INSERT INTO tbljira (proyecto , tipo , clave , titulo , nombres , tiempo_horas) values (? , ? , ? , ? , ? , ? )";
PreparedStatement st = con.getConn().prepareStatement(query);
// Empieza desde 1, cada número coresponde a la posición de cada signo de interrogación (?)
// st.setString(1, r.getNro_Documento());
st.setString(1, ji.getProyecto());
st.setString(2, ji.getTipo());
st.setString(3, ji.getClave());
st.setString(4, ji.getTitulo());
st.setString(5, ji.getNombres());
st.setInt(6, ji.getTiempo_horas());
bandera = st.executeUpdate();
//System.out.println ("El archivo se a guardado exitosamente");
} catch (SQLException ex) {
Logger.getLogger(TablaJiraDao.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (con != null) {
con.close();
}
}
return bandera;
}
}
- Inicie sesión o regístrese para enviar comentarios
WAT
Pero por qué tienen que insertarlo en orden? Me parece que sería mucho más simple meterlo en desorden a la tabla y tener un índice sobre la columna que les interesa para posteriormente poder hacer consultas ordenando por dicha columna y ya. Incluso MySQL tiene esa funcionalidad, a pesar de ser una base de datos bastante chafona.
Que tal Sr. Enrique, siempre
Que tal Sr. Enrique, siempre he querido preguntarle porque considera que MySQL es una base de datos, no tan buena. A mi me gusta PostgreSQL.
PostgreSQL!
PostgreSQL es la neta. Bien diseñada, bien hecha, excelente desempeño, escalabilidad, configurabilidad, todo.
MySQL por otra parte tiene sus broncas de desempeño, y algo mucho más grave: de integridad. Trabajé con mysql hace ya muchos años, espero que ya hayan arreglado sus broncas, pero pues desde entonces postgresql era infinitamente superior, la verdad no creo que hayan alcanzado ese nivel de calidad porque postgresql sigue avanzando también.
Y siempre queda la sospecha de que si esos problemas de mysql están ahí a propósito, por el rollo de la licencia dual. Tal vez la versión pagada no los tiene?
Perdon por el offtopic, tengo
Perdon por el offtopic, tengo este libro, pienso imprimirlo para estudiarlo, ¿me servira para aprender PostgreSQL? De no ser asi, ¿existe algun material que me pueda recomendar para ser un buen aministrador de base datos (sobre todo en postgresql)?
Gracias por la respuesta.
Re: imprimirlo
Mmm... ¿Un libro de 3318 páginas?
no lo imprimas
Mejor estúdialo sin imprimirlo.
La documentación de postgresql es bastante completa, pero es referencia nada más. Para ser un buen administrador de base de datos vas a necesitar estudiar fundamentos de bases de datos relacionales y luego cosas específicas de las RDBMS que manejes, pero sobre todo mucha, mucha experiencia.
Antes de guardar almacena
Antes de guardar almacena todo en un arreglo y ordena el arreglo
for (int i = 1; i < firstSheet.getLastRowNum(); i++) {
TablaJira jira = readRow( firstSheet.getRow(i)); // donde esta todo lo de leer columnas
data.add( jiraRow );
}
// ordena usando los nombres para comparar quien va antes de quien
Collections.sort( data, ( one, two ) -> one.getNombre().compareTo(two.getNombre());
// ya ordenado inserta
for( TablaJira jira : data ) {
insertaTablaJira( jira );
}
...
Esto tiene la desventaja (quizá imperceptible ) de cargar toda la información en memoria antes de escribirla. Si tienes un par de miles de registros no habría muchos problemas, pero si tienes millones se puede acabar la memoria ( aunque quizá se acabaría de cualquier manera al leer el siguiente archivo )
Tiene un menor desempeño, pero dependiendo de la cantidad de datos puede ser de nuevo imperceptible.
La otra opción es como ya lo dijo ezamudio usa un índice en la base de datos.