Frage

Hat jemand hier weiß jeder schnelle, saubere Art und Weise zu konvertieren csv-Dateien in xls oder xlsx Dateien in Java?

Ich habe etwas csv-Dateien bereits an seinem Platz zu verwalten und ich brauche die zusätzliche Kompatibilität für andere Programme.

Beispielcode zusätzlich zu Paketnamen wird immer geschätzt.

Vielen Dank,

Justian

Hier ist mein Code so weit. Ich brauche die Rücksendungen ( „\ n“) von den Leitungen zu entfernen. Einige meiner Zellen enthalten mehrere Informationszeilen (eine Liste), so dass ich „\ n“ in csv können mehrere Zeilen innerhalb einer Zelle , aber xls behandelt diese, um anzuzeigen, wenn ich meine, sie zu setzen auf eine neue Zeile .

Der Code wird aus dem Internet verändert und ein wenig chaotisch im Moment. Sie könnten einige veralteten Methoden feststellen, wie es im Jahr 2004 geschrieben wurde, und sicher sein, die schrecklichen return-Anweisungen zu ignorieren. Ich verwende S.o.p nur zur Zeit für die Prüfung und das werde ich später aufzuräumen.

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 "";
    }
}
War es hilfreich?

Lösung

Sie wissen nicht, ob Sie das schon wissen, aber:

  • Excel (wenn das Ihr eigentliches Ziel ist) ist leicht in der Lage .csv Dateien direkt zu lesen, so dass jede Umwandlung Sie nur tun würden, eine Höflichkeit zu Ihren weniger „begabt“ Benutzern wäre.
  • CSV ist ein kleinster gemeinsamer Nenner Format. Es ist unwahrscheinlich, dass für jeden Konverter Informationen zu vorgefundener in einer .csv Datei hinzufügen, die es nützlicher machen. Mit anderen Worten, ist CSV ein „dummes“ Format und es zu .xls Umwandlung wird (wahrscheinlich) Erhöhung Dateigröße, aber nicht das Format schlauer machen.

Curtis' Vorschlag von POI ist das erste, was zu mir in den Sinn kommen würde.

Wenn Sie diese Konvertierung auf einem Windows-Rechner tun, könnte eine weitere Alternative sein Jacob , ein Java -KOM Brücke, die Sie effektiv Remote erlauben würde, Excel von einem Java-Programm zu steuern, um Dinge wie offen eine Datei und speichern in einem anderen Format zu tun, vielleicht sogar einige Formatierungsänderungen oder eine solche Anwendung.

Schließlich Ich habe auch einen gewissen Erfolg SQL INSERTs tun (über JDBC) in einem Excel-Arbeitsblatt über die JDBC-ODBC-Brücke abgerufen. das heißt ODBC kann eine Excel-Datei aussehen wie eine Datenbank machen. Es ist nicht sehr flexibel aber man kann nicht die DB fragt willkürlich benannte .XLS Dateien zu erstellen.


EDIT:

Es scheint mir, wie readLine() ist schon nicht Sie ganze Zeilen geben. Wie ist es zu wissen, dass Wagenrücklauf kein Leitungsabschluss ist? Sie sollten diese in der Lage sein, mit Aussagen Debug drucken, um zu überprüfen direkt nach dem readline ().

Wenn dies tatsächlich so ist, wäre es saugen, weil der Weg nach vorn für Sie

sein würde
  • entweder unvollständige Linien erkennen und sie zusammen nach der Tat fügen,
  • oder schreiben Sie Ihre eigenen Ersatz für readline (). Ein einfacher Ansatz wäre zeichenweise zu lesen, CRs innerhalb eines CSV-String ersetzt und in einem String Text akkumulieren, bis Sie das Gefühl haben, eine komplette Linie.

Beide Alternativen sind Arbeit, die Sie wahrscheinlich nicht freuten sich auf.

Andere Tipps

Kopieren fügen Sie den folgenden Programm, ich das Programm lief und es funktioniert gut, lassen Sie mich wissen, wenn Sie irgendwelche Bedenken zu diesem Programm haben. (Sie müssen Jar Apache POI dieses Programm auszuführen)

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
    }
}

Wenn Sie oder Schreib XLS oder XLSX-Dateien in Java, Apache POI lesen wollen, ist eine gute Wette: http: // poi.apache.org/

Die Werkzeuge in Excel sind nicht ausreichend für das, was der OP tun will. Er ist auf dem richtigen Weg gibt. Excel kann nicht mehrere CSV-Dateien in verschiedene Arbeitsblätter in der gleichen Datei importieren, weshalb Sie es in Code tun wollen würde. Mein Vorschlag ist, OpenCSV zu verwenden, um die CSV zu lesen, da sie automatisch korrigieren können für Zeilenumbrüche in Daten und fehlende Spalten, und es ist kostenlos und Open Source. Es ist eigentlich sehr, sehr robust und kann alle Arten von verschiedenen Nicht-Standard-CSV-Dateien verarbeiten.

Sie schrieb:

Ich habe etwas csv-Dateien zu verwalten bereits an Ort und Stelle, und ich brauche die extra Kompatibilität für andere Programme.

Was sind die anderen Programme? Sind sie benötigt, um Ihre Daten über Excel-Dateien zuzugreifen, oder könnten sie arbeiten mit einer JDBC oder ODBC-Verbindung zu einer Datenbank? eine Datenbank als die zentrale Lage können Sie die Daten in CSV-Dateien oder andere Formate nach Bedarf extrahieren können.

Ich habe eine kleine Software namens csv2xls . Es braucht Java.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top