2

を使用してスプレッドシートを読み取るときに、スプレッドシートの列またはセルのデータ型または形式を取得することは可能cfspreadsheetですか?

スプレッドシート データを Excel スプレッドシートからデータベース テーブルに変換しています。ここまでは、すべてを varchar としてフォーマットするだけでしたが、日付を日付として、整数を整数として指定できるとよいでしょう。

4

1 に答える 1

3

残念ながら、cfspreadsheetスプレッドシート関数や組み込みのスプレッドシート関数は使用していません。表示されているもののみを返し、基になる値は返しません。ただし、基礎となるPOIワークブックを利用することで自分でロールすることができます。

覚えておくべきいくつかのこと:

  • データベーステーブルとは異なり、スプレッドシートの列にはさまざまなデータ型を含めることができます。最初のセルに日付が含まれているからといって、その列のすべてのセルにも日付が含まれているとは限りません。したがって、他のインポートと同様に、データベーステーブルに挿入する前に、必ずすべての値を検証してください。
  • これらのメソッドには、入力された行とセルのみが含まれます。空白の行とセルはスキップされます。したがって、列の値は常に連続しているとは限りません。
  • シート、行、および列のインデックスはゼロ(0)ベースです

処理を行うには、目的のシートを取得して、行とセルを繰り返し処理します。列をループしながら、セルタイプを確認し、生の値(日付、文字列、数値など)を抽出します。

出典:HSSFおよびXSSF機能に関するビジー開発者向けガイド

<cfscript>
// get the sheet you want to read
cfSheet = SpreadSheetRead("c:/path/to/somefile.xls"); 
workbook = cfSheet.getWorkBook();
sheetIndex = workbook.getActiveSheetIndex();
sheet = workbook.getSheetAt( sheetIndex );

// utility used to distinguish between dates and numbers
dateUtil = createObject("java", "org.apache.poi.ss.usermodel.DateUtil");

// process the rows and columns
rows = sheet.rowIterator();
while (rows.hasNext()) {
    currentRow = rows.next();
    data = {}; 

    cells = currentRow.cellIterator();
    while (cells.hasNext()) { 
        currentCell = cells.next();

        col = {};
        col.value  = "";
        col.type   = "";
        col.column = currentCell.getColumnIndex()+ 1;
        col.row    = currentCell.getRowIndex()+ 1;

        if (currentCell.getCellType() EQ currentCell.CELL_TYPE_STRING) {
               col.value = currentCell.getRichStringCellValue().getString();
            col.type = "string";
        }
        else if (currentCell.getCellType() EQ currentCell.CELL_TYPE_NUMERIC) {
            if (DateUtil.isCellDateFormatted(currentCell)) {
                 col.value = currentCell.getDateCellValue();
                 col.type = "date";
            } 
            else {
                 col.value = currentCell.getNumericCellValue();
                 col.type = "number";
            }
        }
        else if (currentCell.getCellType() EQ currentCell.CELL_TYPE_BOOLEAN) {
            col.value = currentCell.getBooleanCellValue();
            col.type = "boolean";
        }
        // ... handle other types CELL_TYPE_BLANK, CELL_TYPE_ERROR, CELL_TYPE_FORMULA

        data["COL"& col.column] = col;
    }

    // this row is finished. display all values
    WriteDump(data);
}
</cfscript>
于 2012-01-27T07:04:58.163 に答える