2010-07-06 33 views
8

¿Alguien aquí conoce alguna forma rápida y limpia de convertir archivos csv a archivos xls o xlsx en java?Convierta .csv a .xls en Java

Tengo algo para administrar los archivos csv que ya están en su lugar y necesito la compatibilidad adicional para otros programas.

El código de muestra además de los nombres de los paquetes siempre es muy apreciado.

Muchas gracias,

Justian

Aquí está mi código hasta ahora. Necesito eliminar los retornos ("\ n") de las líneas. Algunas de mis celdas contienen varias líneas de información (una lista), así que puedo usar "\ n" en csv para indicar varias líneas dentro de una celda , pero xls las trata como si quisiera ponerlas en una nueva línea .

El código se ha modificado desde Internet y está un poco desordenado en este momento. Es posible que observe algunos métodos en desuso, como fue escrito en 2004, y asegúrese de ignorar las terribles declaraciones de devolución. Solo estoy usando S.o.p en este momento para probar y lo limpiaré más tarde.

package jab.jm.io; 

import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 

public class FileConverter { 

    public static String ConvertCSVToXLS(String file) throws IOException { 

     if (file.indexOf(".csv") < 0) 
      return "Error converting file: .csv file not given."; 

     String name = FileManager.getFileNameFromPath(file, false); 
     ArrayList<ArrayList<String>> arList = new ArrayList<ArrayList<String>>(); 
     ArrayList<String> al = null; 

     String thisLine; 
     DataInputStream myInput = new DataInputStream(new FileInputStream(file)); 

     while ((thisLine = myInput.readLine()) != null) { 
      al = new ArrayList<String>(); 
      String strar[] = thisLine.split(","); 

      for (int j = 0; j < strar.length; j++) { 
       // My Attempt (BELOW) 
       String edit = strar[j].replace('\n', ' '); 
       al.add(edit); 
      } 

      arList.add(al); 
      System.out.println(); 
     } 

     try { 
      HSSFWorkbook hwb = new HSSFWorkbook(); 
      HSSFSheet sheet = hwb.createSheet("new sheet"); 

      for (int k = 0; k < arList.size(); k++) { 
       ArrayList<String> ardata = (ArrayList<String>) arList.get(k); 
       HSSFRow row = sheet.createRow((short) 0 + k); 

       for (int p = 0; p < ardata.size(); p++) { 
        System.out.print(ardata.get(p)); 
        HSSFCell cell = row.createCell((short) p); 
        cell.setCellValue(ardata.get(p).toString()); 
       } 
      } 

      FileOutputStream fileOut = new FileOutputStream(
        FileManager.getCleanPath() + "/converted files/" + name 
          + ".xls"); 
      hwb.write(fileOut); 
      fileOut.close(); 

      System.out.println(name + ".xls has been generated"); 
     } catch (Exception ex) { 
     } 

     return ""; 
    } 
} 
+0

actualización en mi respuesta. Lamento que tengas que esperar un poco. –

Respuesta

6

No sabe si lo saben ya, pero:

  • Excel (si ese es su objetivo real) es capaz de leer archivos .csv directamente, por lo que cualquier conversión que haga será una cortesía para los usuarios menos "dotados".
  • CSV es el formato de denominador común más bajo. Es poco probable que un convertidor agregue información a la que se encuentra en un archivo .csv que lo hará más útil. En otras palabras, CSV es un formato "tonto" y al convertirlo a .xls (probablemente) aumentará el tamaño del archivo pero no hará que el formato sea más inteligente.

Curtis 'sugerencia de POI es lo primero que me viene a la mente también.

Si está haciendo esta conversión en una máquina con Windows, otra alternativa podría ser Jacob, un puente Java-COM que le permitiría controlar de forma remota Excel desde un programa Java para hacer cosas como abrir un archivo y guardar en un formato diferente, tal vez incluso la aplicación de algunos cambios de formato o similares.

Por último, también he tenido algo de éxito haciendo SQL INSERT s (a través de JDBC) en una hoja de cálculo de Excel se accede por el puente JDBC-ODBC. es decir, ODBC puede hacer que un archivo de Excel se vea como una base de datos. Aunque no es muy flexible, no se puede pedir al DB que cree archivos denominados arbitrariamente .XLS.


EDIT:

se ve a mí como se readLine() ya no dando líneas enteras. ¿Cómo es saber que el retorno de carro no es un terminador de línea? Debería poder verificar esto con instrucciones de impresión de depuración justo después de readLine().

Si esto es así, sería chupar debido a que el camino a seguir sería para que usted pueda

  • o bien reconocer líneas incompletas y pegarlos juntos después de los hechos,
  • o escribir su propio sustituto de readLine(). Un enfoque simple sería leer carácter por personaje, reemplazar CR en una cadena CSV y acumular texto en un StringBuilder hasta que sienta que tiene una línea completa.

Ambas alternativas son un trabajo que probablemente no estés esperando.

+0

Bien, estoy usando los datos extraídos de un sitio web (uno que no tengo ningún control sobre) y exportar estos datos en un formato csv. Lamentablemente, algunos programas con los que me gustaría utilizar los datos requieren archivos xls. Sí, no tiene sentido "convertir arriba", pero ese es un problema con el software que debo usar. He estado tratando de PDI con cierto éxito, pero parece que el odio caracteres de retorno (\ n) que pude utilizar en formato CSV (comprensible ya que las comas son los delimitadores). Publicaré mi código arriba. ¿Alguna idea de cómo eliminar los personajes? Voy a marcar mi intento anterior. –

+0

@Justian: Pasando por alto tu código, no pude averiguar qué problema estás tratando de resolver. ¿Están estos CR en el medio de los campos o al final de los registros? Si están en campos, ¿deberían ser reemplazados por, digamos, un solo espacio en blanco? ¿Tu código no tiene éxito en hacer esto? –

+0

No, no lo es. Digamos que tengo campos para nombre | mascotas | código postal. Si tengo una columna de varias líneas en csv, como "John | perro (\ n) cat | 10000", que se mostrará como "John | perro" y (fila siguiente) "cat | postal". Es difícil mostrar esto con el auto-formateo de stackoverflow. Por lo que veo, * debería * corregir esto, pero no hay suerte hasta el momento. –

0

Usted escribió:

tengo algo para administrar archivos csv ya en el lugar y necesito el compatibilidad adicional para otros programas.

¿Cuáles son esos otros programas? ¿Están obligados a acceder a sus datos a través de archivos de Excel o podrían trabajar con una conexión JDBC o ODBC a una base de datos? Utilizando una base de datos como ubicación central, puede extraer los datos en archivos CSV u otros formatos según sea necesario.

+0

Una conexión JDBC u ODBC no funcionaría en este caso. –

0

Las herramientas de Excel no son adecuadas para lo que el PO quiere hacer. Él está en el camino correcto allí. Excel no puede importar varios archivos CSV en diferentes hojas de trabajo en el mismo archivo, por lo que querrá hacerlo en código. Mi sugerencia es usar OpenCSV para leer el CSV, ya que puede corregir automáticamente las nuevas líneas en los datos y las columnas que faltan, y es de código abierto y gratuito. En realidad es muy, muy robusto y puede manejar todo tipo de archivos CSV no estándar diferentes.

0

he creado un pequeño software llamado csv2xls. Necesita Java.

+0

El enlace no funciona. – Jaan

+0

Gracias @Jaan. Ahora, está [aquí] (https://github.com/sixro/incubateur/tree/master/csv2xls). – sixro

3

copiar y pegar el siguiente programa, me encontré con el programa y se está trabajando muy bien, Déjame saber si usted tiene alguna preocupación sobre este programa. (Es necesario Apache POI Tarro para ejecutar este programa)

import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Cell; 


public class CSVToExcelConverter { 

    public static void main(String args[]) throws IOException 
    { 
     ArrayList arList=null; 
     ArrayList al=null; 
     String fName = "test.csv"; 
     String thisLine; 
     int count=0; 
     FileInputStream fis = new FileInputStream(fName); 
     DataInputStream myInput = new DataInputStream(fis); 
     int i=0; 
     arList = new ArrayList(); 
     while ((thisLine = myInput.readLine()) != null) 
     { 
      al = new ArrayList(); 
      String strar[] = thisLine.split(","); 
      for(int j=0;j<strar.length;j++) 
      { 
       al.add(strar[j]); 
      } 
      arList.add(al); 
      System.out.println(); 
      i++; 
     } 

     try 
     { 
      HSSFWorkbook hwb = new HSSFWorkbook(); 
      HSSFSheet sheet = hwb.createSheet("new sheet"); 
      for(int k=0;k<arList.size();k++) 
      { 
       ArrayList ardata = (ArrayList)arList.get(k); 
       HSSFRow row = sheet.createRow((short) 0+k); 
       for(int p=0;p<ardata.size();p++) 
       { 
        HSSFCell cell = row.createCell((short) p); 
        String data = ardata.get(p).toString(); 
        if(data.startsWith("=")){ 
         cell.setCellType(Cell.CELL_TYPE_STRING); 
         data=data.replaceAll("\"", ""); 
         data=data.replaceAll("=", ""); 
         cell.setCellValue(data); 
        }else if(data.startsWith("\"")){ 
         data=data.replaceAll("\"", ""); 
         cell.setCellType(Cell.CELL_TYPE_STRING); 
         cell.setCellValue(data); 
        }else{ 
         data=data.replaceAll("\"", ""); 
         cell.setCellType(Cell.CELL_TYPE_NUMERIC); 
         cell.setCellValue(data); 
        } 
        //*/ 
        // cell.setCellValue(ardata.get(p).toString()); 
       } 
       System.out.println(); 
      } 
      FileOutputStream fileOut = new FileOutputStream("test.xls"); 
      hwb.write(fileOut); 
      fileOut.close(); 
      System.out.println("Your excel file has been generated"); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } //main method ends 
    } 
}