JavaでExcelデータをSQLiteデータベースにインポートする方法

業務でよく使われるExcelファイルから、データベースへの自動インポートは非常に便利です。手動でデータを移す作業は時間がかかり、ミスも発生しやすいため、Javaを使った自動化によって効率と信頼性が大幅に向上します。

この記事では、**Javaを使ってExcelファイルからデータを読み取り、SQLiteデータベースに挿入する方法**を紹介します。

### 使用する技術

* [Free Spire.XLS for Java](https://jp.e-iceblue.com/introduce/free-spire-xls-for-java.html)：Excelファイルの読み取りに使用
* SQLite：軽量で組み込み型のデータベース
* JDBC：Javaでデータベースに接続するためのAPI

### 実装の流れ

1. Excelファイルを読み込み、行ごとにセルの内容を取得
2. 最初の行を列名として使用し、SQLiteテーブルを生成
3. JDBCを使って行ごとのデータをデータベースに挿入

### Javaコード例：Excel → SQLite

```java
import com.spire.xls.*;
import java.sql.*;
import java.util.*;

public class ExcelToSQLite {
    public static void main(String[] args) {
        String excelPath = "Sample78.xlsx";
        String dbPath = "jdbc:sqlite:output/excel_data.db"; // SQLite データベースファイル名

        // Excel ファイルを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile(excelPath);

        try (Connection conn = DriverManager.getConnection(dbPath)) {
            System.out.println("SQLite データベースへの接続／作成に成功しました。");

            for (int j = 0; j < workbook.getWorksheets().getCount(); j++) {
                Worksheet sheet = workbook.getWorksheets().get(j);
                String tableName = sheet.getName().replaceAll("[^a-zA-Z0-9_]", "_"); // 不正な文字を避ける
                CellRange range = sheet.getAllocatedRange();
                int rowCount = range.getRowCount();
                int colCount = range.getColumnCount();

                // 列名を取得（1 行目）
                List<String> columns = new ArrayList<>();
                for (int col = 1; col <= colCount; col++) {
                    String colName = sheet.getCellRange(1, col).getText().trim();
                    if (colName.isEmpty()) {
                        colName = "Column" + col;
                    }
                    columns.add(colName.replaceAll("[^a-zA-Z0-9_]", "_"));
                }

                // テーブルを作成
                StringBuilder createSQL = new StringBuilder("CREATE TABLE IF NOT EXISTS `" + tableName + "` (");
                for (String col : columns) {
                    createSQL.append("`").append(col).append("` TEXT,");
                }
                createSQL.setLength(createSQL.length() - 1);
                createSQL.append(");");

                try (Statement stmt = conn.createStatement()) {
                    stmt.execute(createSQL.toString());
                }

                // データを挿入
                String placeholders = String.join(",", Collections.nCopies(columns.size(), "?"));
                String insertSQL = "INSERT INTO `" + tableName + "` (" + String.join(",", columns) + ") VALUES (" + placeholders + ")";
                try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
                    for (int row = 2; row <= rowCount; row++) {
                        for (int col = 1; col <= colCount; col++) {
                            String value = sheet.getCellRange(row, col).getText();
                            pstmt.setString(col, value);
                        }
                        pstmt.executeUpdate();
                    }
                }

                System.out.println("ワークシート \"" + tableName + "\" のインポートに成功しました！");
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
```

**Excel ファイルのサンプル**：
![JavaでExcelからSQLiteにデータをインポートするサンプルファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/1de4167d-9ade-4c77-b755-9675d017ecd4.png)

![JavaでExcelからSQLiteにデータをインポートした結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a805af9b-54f3-456f-ab95-1eb23849caa7.png)


### まとめ

Spire.XLSとJDBCを組み合わせることで、Excelファイルのデータを簡単にSQLiteへ取り込むことが可能です。初期データの登録や、ユーザーから提供されたファイルの一括登録などに活用できます。