web-dev-qa-db-ja.com

Java)で.csvを.xlsに変換します

ここの誰かが、Javaでcsvファイルをxlsまたはxlsxファイルに変換するための迅速でクリーンな方法を知っていますか?

すでに配置されているcsvファイルを管理するための何かがあり、他のプログラムとの追加の互換性が必要です。

パッケージ名に加えてサンプルコードは常に高く評価されています。

どうもありがとう、

ユスティニアヌス

これがこれまでの私のコードです。行からリターン( "\ n")を削除する必要があります。一部のセルには複数行の情報(リスト)が含まれているため、csvで「\ n」を使用してcell内の複数行を示すことができますが、xlsはこれらを配置するつもりであるかのように扱います新しい

コードはインターネットから変更されており、現時点では少し面倒です。 2004年に作成されたように、いくつかの非推奨のメソッドに気付くかもしれません。ひどいreturnステートメントは無視してください。現在、テストにS.o.pを使用しているだけで、後でクリーンアップします。

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 "";
    }
}
10
Justian Meyer

あなたがこれをすでに知っているかどうかはわかりませんが:

  • Excel(それが本当のターゲットである場合)は_.csv_ファイルを直接簡単に読み取ることができるため、変換を行う場合は、あまり「才能のない」ユーザーへの礼儀にすぎません。
  • CSVは、最小公分母形式です。コンバーターが_.csv_ファイルにある情報に情報を追加して、より便利にすることはほとんどありません。言い換えると、CSVは「ダム」形式であり、それを_.xls_に変換すると、(おそらく)ファイルサイズが大きくなりますが、形式がよりスマートになることはありません。

カーティスのPOIの提案は、私の頭に浮かぶ最初のことでもあります。

Windowsマシンでこの変換を行う場合、別の代替手段は Jacob である可能性があります。これは、Java)からExcelを効果的にリモート制御できるJava-COMブリッジです。 =ファイルを開いて別の形式で保存するなどのプログラムを実行します。おそらく、形式の変更などを適用することもあります。

最後に、JDBC-ODBCブリッジを介してアクセスするExcelワークシートにSQL INSERTs(JDBCを介して)を実行することにも成功しました。つまり、ODBCは、Excelファイルをデータベースのように見せることができます。ただし、柔軟性はそれほど高くありませんが、DBに任意の名前の_.XLS_ファイルを作成するように依頼することはできません。


編集:

readLine()はすでに行全体を提供していないように見えます。キャリッジリターンがラインターミネータではないことをどのように知るのですか? readLine()の直後のdebug printステートメントで、これを確認できるはずです。

もしこれが本当にそうなら、前進する道はあなたのためになるので、それはひどいでしょう

  • 不完全な行を認識し、事後にそれらを貼り付けます。
  • または、readLine()の代わりに独自の方法を記述します。簡単なアプローチは、文字ごとに読み取り、CSV文字列内のCRを置き換え、完全な行があると感じるまでStringBuilderにテキストを蓄積することです。

どちらの選択肢も、おそらくあなたが楽しみにしていなかった仕事です。

7
Carl Smotricz

以下のプログラムをコピーして貼り付けます。プログラムを実行しましたが、正常に動作しています。このプログラムについて懸念がある場合はお知らせください(このプログラムを実行するにはApache POI Jarが必要です)

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

JavaでXLSまたはXLSXファイルを読み書きしたい場合は、Apache POIが適しています: http://poi.Apache.org/

5
Curtis

Excelのツールは、OPが実行したいことには不十分です。彼はそこで正しい方向に進んでいます。 Excelは、複数のCSVファイルを同じファイル内の異なるワークシートにインポートできないため、コードでインポートする必要があります。私の提案は、OpenCSVを使用してCSVを読み取ることです。これは、データの改行と欠落している列を自動的に修正でき、無料でオープンソースです。実際には非常に堅牢で、あらゆる種類の非標準のCSVファイルを処理できます。

2
ChopperCharles

あなたが書いた:

すでに配置されているcsvファイルを管理するための何かがあり、他のプログラムとの追加の互換性が必要です。

それらの他のプログラムは何ですか? Excelファイルを介してデータにアクセスする必要がありますか、それともJDBCまたはデータベースへのODBC接続)で機能しますか?データベースを中央の場所として使用して、データをCSVファイルに抽出できます。または必要に応じて他の形式。

0
Alan Krueger

csv2xls という小さなソフトウェアを作成しました。 Javaが必要です。

0
sixro