Java – ExcelとCSVを相互に変換する方法
JavaでExcelとCSVを相互に変換するには、Apache POIやOpenCSVなどのライブラリを使用します。
Apache POIはExcelファイル(.xlsや.xlsx)の読み書きに適しており、OpenCSVはCSVファイルの操作に便利です。
ExcelをCSVに変換する場合、Apache POIでExcelデータを読み取り、行ごとにカンマ区切り形式で書き出します。
逆にCSVをExcelに変換する場合、OpenCSVでCSVデータを読み取り、Apache POIでExcelシートに書き込みます。
JavaでExcelとCSVを操作するための準備
JavaでExcelファイルとCSVファイルを操作するためには、いくつかのライブラリを使用する必要があります。
ここでは、一般的に使用されるライブラリとその設定方法について説明します。
必要なライブラリ
ライブラリ名 | 説明 |
---|---|
Apache POI | Excelファイル(.xls, .xlsx)の操作に使用 |
OpenCSV | CSVファイルの読み書きに使用 |
ライブラリの導入方法
- Apache POIの導入
Mavenを使用している場合、pom.xml
に以下の依存関係を追加します。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version> <!-- 最新のバージョンを確認してください -->
</dependency>
- OpenCSVの導入
同様に、pom.xml
に以下の依存関係を追加します。
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.5.2</version> <!-- 最新のバージョンを確認してください -->
</dependency>
環境設定
- IDEの設定: EclipseやIntelliJ IDEAなどのIDEを使用している場合、Mavenプロジェクトを作成し、上記の依存関係を追加することで、必要なライブラリが自動的にダウンロードされます。
- Javaのバージョン: Java 8以上を推奨します。
これにより、最新のライブラリが正常に動作します。
これらの準備が整ったら、ExcelファイルとCSVファイルの相互変換を行うためのプログラムを作成することができます。
次のセクションでは、ExcelファイルをCSVに変換する方法について詳しく説明します。
ExcelファイルをCSVに変換する方法
ExcelファイルをCSV形式に変換するためには、Apache POIライブラリを使用します。
以下に、Excelファイルを読み込み、CSVファイルとして書き出す方法を示します。
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
public class App {
public static void main(String[] args) {
String excelFilePath = "input.xlsx"; // 入力するExcelファイルのパス
String csvFilePath = "output.csv"; // 出力するCSVファイルのパス
try {
convertExcelToCSV(excelFilePath, csvFilePath);
System.out.println("ExcelファイルをCSVに変換しました。");
} catch (IOException e) {
e.printStackTrace();
}
}
// ExcelファイルをCSVに変換するメソッド
public static void convertExcelToCSV(String excelFilePath, String csvFilePath) throws IOException {
FileInputStream fis = new FileInputStream(excelFilePath); // FileInputStreamを使用してExcelファイルを読み込む
Workbook workbook = new XSSFWorkbook(fis); // FileInputStreamを渡してWorkbookを作成
Sheet sheet = workbook.getSheetAt(0); // 最初のシートを取得
BufferedWriter writer = new BufferedWriter(new FileWriter(csvFilePath)); // CSVファイルの書き込み準備
for (Row row : sheet) { // シートの各行をループ
StringBuilder rowData = new StringBuilder();
Iterator<Cell> cellIterator = row.cellIterator(); // 行の各セルを取得
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next(); // セルを取得
rowData.append(cell.toString()); // セルの内容を追加
if (cellIterator.hasNext()) {
rowData.append(","); // セルの間にカンマを追加
}
}
writer.write(rowData.toString()); // 行データをCSVファイルに書き込む
writer.newLine(); // 次の行に移動
}
writer.close(); // 書き込みを終了
workbook.close(); // Excelファイルを閉じる
fis.close(); // FileInputStreamを閉じる
}
}
コードの説明
- Excelファイルの読み込み:
XSSFWorkbook
を使用してExcelファイルを読み込みます。 - CSVファイルの書き込み:
BufferedWriter
を使用してCSVファイルにデータを書き込みます。 - 行とセルのループ: Excelシートの各行とセルをループし、内容をCSV形式で書き出します。
このプログラムを実行すると、指定したExcelファイルの内容がCSVファイルに変換されます。
出力結果は以下のようになります。
セル1,セル2,セル3
セル4,セル5,セル6
このようにして、ExcelファイルをCSV形式に変換することができます。
次のセクションでは、CSVファイルをExcelに変換する方法について説明します。
CSVファイルをExcelに変換する方法
CSVファイルをExcel形式に変換するためには、OpenCSVライブラリを使用します。
以下に、CSVファイルを読み込み、Excelファイルとして書き出す方法を示します。
import com.opencsv.CSVReader;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.params.shadow.com.univocity.parsers.csv.Csv;
import com.opencsv.exceptions.CsvValidationException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class App {
public static void main(String[] args) {
String csvFilePath = "input.csv"; // 入力するCSVファイルのパス
String excelFilePath = "output.xlsx"; // 出力するExcelファイルのパス
try {
convertCSVToExcel(csvFilePath, excelFilePath);
System.out.println("CSVファイルをExcelに変換しました。");
} catch (IOException e) {
e.printStackTrace();
}
}
// CSVファイルをExcelに変換するメソッド
public static void convertCSVToExcel(String csvFilePath, String excelFilePath) throws IOException {
Workbook workbook = new XSSFWorkbook(); // 新しいExcelワークブックを作成
Sheet sheet = workbook.createSheet("Sheet1"); // 新しいシートを作成
try (CSVReader csvReader = new CSVReader(new FileReader(csvFilePath))) { // CSVファイルを読み込む
String[] nextLine;
int rowNum = 0;
while ((nextLine = csvReader.readNext()) != null) { // CSVの各行をループ
Row row = sheet.createRow(rowNum++); // 新しい行を作成
for (int i = 0; i < nextLine.length; i++) {
Cell cell = row.createCell(i); // 新しいセルを作成
cell.setCellValue(nextLine[i]); // セルに値を設定
}
}
} catch (CsvValidationException e) {
e.printStackTrace();
}
try (FileOutputStream fileOutputStream = new FileOutputStream(excelFilePath)) {
workbook.write(fileOutputStream); // Excelファイルに書き込む
}
workbook.close(); // Excelファイルを閉じる
}
}
コードの説明
- CSVファイルの読み込み:
CSVReader
を使用してCSVファイルを読み込みます。 - Excelファイルの作成:
XSSFWorkbook
を使用して新しいExcelファイルを作成します。 - 行とセルのループ: CSVファイルの各行をループし、Excelシートにデータを書き込みます。
このプログラムを実行すると、指定したCSVファイルの内容がExcelファイルに変換されます。
出力結果は以下のようになります。
セル1 セル2 セル3
セル4 セル5 セル6
このようにして、CSVファイルをExcel形式に変換することができます。
次のセクションでは、実践例としてExcelとCSVの相互変換プログラムを紹介します。
実践例:ExcelとCSVの相互変換プログラム
ここでは、ExcelファイルとCSVファイルの相互変換を行うプログラムを実装します。
このプログラムでは、ユーザーが選択したファイル形式に基づいて、ExcelからCSV、またはCSVからExcelに変換する機能を提供します。
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.opencsv.CSVReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("変換したい形式を選択してください(1: Excel to CSV, 2: CSV to Excel):");
int choice = scanner.nextInt();
scanner.nextLine(); // 改行を消去
if (choice == 1) {
System.out.print("Excelファイルのパスを入力してください: ");
String excelFilePath = scanner.nextLine();
System.out.print("出力するCSVファイルのパスを入力してください: ");
String csvFilePath = scanner.nextLine();
try {
convertExcelToCSV(excelFilePath, csvFilePath);
System.out.println("ExcelファイルをCSVに変換しました。");
} catch (IOException e) {
e.printStackTrace();
}
} else if (choice == 2) {
System.out.print("CSVファイルのパスを入力してください: ");
String csvFilePath = scanner.nextLine();
System.out.print("出力するExcelファイルのパスを入力してください: ");
String excelFilePath = scanner.nextLine();
try {
convertCSVToExcel(csvFilePath, excelFilePath);
System.out.println("CSVファイルをExcelに変換しました。");
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("無効な選択です。");
}
scanner.close();
}
// ExcelファイルをCSVに変換するメソッド
public static void convertExcelToCSV(String excelFilePath, String csvFilePath) throws IOException {
Workbook workbook = new XSSFWorkbook(new FileReader(excelFilePath));
Sheet sheet = workbook.getSheetAt(0);
BufferedWriter writer = new BufferedWriter(new FileWriter(csvFilePath));
for (Row row : sheet) {
StringBuilder rowData = new StringBuilder();
for (Cell cell : row) {
rowData.append(cell.toString()).append(",");
}
writer.write(rowData.toString().replaceAll(",$", "")); // 最後のカンマを削除
writer.newLine();
}
writer.close();
workbook.close();
}
// CSVファイルをExcelに変換するメソッド
public static void convertCSVToExcel(String csvFilePath, String excelFilePath) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Sheet1");
try (CSVReader csvReader = new CSVReader(new FileReader(csvFilePath))) {
String[] nextLine;
int rowNum = 0;
while ((nextLine = csvReader.readNext()) != null) {
Row row = sheet.createRow(rowNum++);
for (int i = 0; i < nextLine.length; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(nextLine[i]);
}
}
}
try (FileWriter fileWriter = new FileWriter(excelFilePath)) {
workbook.write(fileWriter);
}
workbook.close();
}
}
コードの説明
- ユーザー入力: プログラムは、ユーザーに変換したい形式を選択させ、必要なファイルパスを入力させます。
- 変換メソッド:
convertExcelToCSV
メソッドとconvertCSVToExcelメソッド
を使用して、選択された形式に基づいてファイルを変換します。 - エラーハンドリング: 入力されたファイルパスが無効な場合や、ファイルの読み書き中にエラーが発生した場合には、例外をキャッチしてエラーメッセージを表示します。
このプログラムを実行すると、ユーザーが選択した形式に応じて、ExcelファイルとCSVファイルの相互変換が行われます。
例えば、ExcelからCSVに変換した場合、以下のようなメッセージが表示されます。
ExcelファイルをCSVに変換しました。
このようにして、ExcelファイルとCSVファイルの相互変換を簡単に行うことができます。
次のセクションでは、より効率的な変換のためのヒントを紹介します。
より効率的な変換のためのヒント
ExcelファイルとCSVファイルの相互変換を行う際に、効率を向上させるためのいくつかのヒントを紹介します。
これらのヒントを活用することで、プログラムのパフォーマンスや可読性を向上させることができます。
1. バッファリングを活用する
- BufferedWriterやBufferedReaderを使用することで、ファイルの読み書き速度を向上させることができます。
これにより、I/O操作の回数を減らし、全体の処理時間を短縮できます。
2. データ型の適切な選択
- Excelファイルのセルにはさまざまなデータ型が存在します。
数値、文字列、日付など、適切なデータ型を選択することで、変換後のデータの整合性を保つことができます。
特に、日付データはフォーマットに注意が必要です。
3. エラーハンドリングの強化
- ファイルの読み書き中に発生する可能性のあるエラーを適切に処理することで、プログラムの安定性を向上させることができます。
具体的には、ファイルが存在しない場合や、アクセス権がない場合の処理を追加することが重要です。
4. 大量データの処理
- 大量のデータを扱う場合、メモリ使用量を抑えるために、行単位での処理を行うことが推奨されます。
例えば、Excelファイルを一度に全て読み込むのではなく、必要な行だけを逐次的に読み込む方法です。
5. ユーザーインターフェースの改善
- コマンドラインでの入力だけでなく、GUI(グラフィカルユーザーインターフェース)を導入することで、ユーザーの利便性を向上させることができます。
JavaのSwingやJavaFXを使用して、ファイル選択ダイアログを実装することが可能です。
6. ログ機能の追加
- プログラムの実行状況を記録するために、ログ機能を追加することが有効です。
これにより、エラー発生時のトラブルシューティングが容易になり、プログラムのメンテナンス性が向上します。
7. テストの実施
- 変換プログラムを実装した後は、さまざまなケースを想定したテストを行うことが重要です。
特に、異なる形式のExcelファイルやCSVファイルを用意し、正しく変換されるかを確認することで、信頼性を高めることができます。
これらのヒントを参考にすることで、ExcelとCSVの相互変換プログラムをより効率的に実装することができます。
まとめ
この記事では、Javaを使用してExcelファイルとCSVファイルを相互に変換する方法について詳しく解説しました。
具体的には、必要なライブラリの導入から、ExcelをCSVに変換する方法、CSVをExcelに変換する方法、そしてそれらを組み合わせた実践的なプログラムの実装までを紹介しました。
これを機に、実際にプログラムを作成してみることで、データの管理や処理をより効率的に行えるようになるでしょう。