CSVデータソース

RapidReportでは、データソースクラスを実装することによって、 どのような形式のデータでも帳票へ渡すことができます。 ここでは、例としてCSVファイルを読み込んでその内容を帳票に渡すデータソースを作成してみます。

サンプルについて
完成したサンプルが example フォルダ内に以下の名前で含まれています。 データソースクラスのソースコード: CsvDataSource.cs、CsvDataSource.vb、CsvDataSource.java 帳票出力のソースコード: Example1csv.cs、Example1csv.vb、Example1csv.java CSVデータ: report\data.csv

CSVファイルの形式

今回の例ではExcelで生成したCSVファイルを読み込めるように、 以下の形式のデータを解析可能なように実装します。

  • 値の区切りをカンマ[,]、行の区切りを改行[CRLF]で表す
  • 値にダブルクオート["]、カンマ[,]、改行が含まれる場合は、その値全体をダブルクオートで囲む
  • 値が上記の文字を含まない場合は、ダブルクオートで囲む必要はない
  • 値に含まれるダブルクオートは[""]で表す
  • 値に含まれる改行は[LF]で表す

例えば次のようなデータの場合、

CSVデータの例

CSVファイルの内容は以下のようになります。

"あああ,いいい","改行を[LF]
含む"[CRLF]
"""ほげ""ふが",abcdef

CsvDataSourceクラスの実装

データソースクラスを作成するには、 以下のメソッドを含んだIReportDataSourceインターフェースを実装します。

メソッド 説明
size() データの行数を返します
get(i, key) i行目のkey列の値を返します

帳票に渡されるデータはgetメソッドから戻り値として返すことになりますが、 今回の例では、データの形式が[yyyy/M/d]だった場合は日付型へと変換し、 数値として見なすことができる場合はDecimalまたはBigDecimalへと変換して返すものとします。

なお、CSVデータの最初の行には、列名が定義されているものとします。

CSVファイルを読み込むデータソースクラスをCsvDataSourceという名前で以下のように実装します。 (コードが長いため、折りたたみ表示にします)

▼C#のコードを開く

▼VisualBasicのコードを開く

▼Javaのコードを開く

帳票へデータを渡す

CsvDataSourceオブジェクトは、reportオブジェクトのFillメソッドに渡すことで利用できます。

  // C#
            
  // 帳票定義ファイルを読み込みます
  Report report = new Report(Json.Read("report\\example1.rrpt"));

  // CSVファイルから帳票にデータを渡します
  using (StreamReader r = new StreamReader("report\\data.csv", Encoding.GetEncoding("shift-jis")))
  {
    report.Fill(new CsvDataSource(r));
  }

  ...
  ' VisualBasic

  ' 帳票定義ファイルを読込みます
  Dim report As New Report(Json.Read("report\example1.rrpt"))

  ' CSVファイルから帳票にデータを渡します
  Using r = New StreamReader("report\data.csv", Encoding.GetEncoding("shift-jis"))
    report.Fill(New CsvDataSource(r))
  End Using

  ...
  // Java

  // 帳票定義を読込みます
  Report report = new Report(ReadUtil.readJson("report\\example1.rrpt"));

  // CSVファイルから帳票にデータを渡します
  InputStream is = new FileInputStream("report\\data.csv");
  try{
    Reader r = new InputStreamReader(is, "shift-jis");
    try{
      report.fill(new CsvDataSource(r));
    }finally{
      r.close();
    }
  }finally{
    is.close();
  }

  ...